Filip Stevanovic 2020/0039

Dependencies:   mbed

Revision:
0:569d2e559397
Child:
1:f62564cb5261
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Nov 13 08:28:59 2021 +0000
@@ -0,0 +1,116 @@
+/*
+Zasto ljudi cudno cuju?
+    -Filip Stevanovic
+
+Da bi smo bili bolji predatori, evolucija je coveku razvila veoma osetljiva cula.
+Da bi se to ostvarilo, mozak signale sa cula logaritmuje, i tako se promene
+na veoma malim nivoima jasno uocavaju dok se promene na velikim nivoima skoro uopste
+ne primecuju.
+
+Hvala na paznji
+*/
+
+#include "mbed.h"
+
+//Constants
+#define DebouncePeriod 100    //Period that a button needs to stabilise in miliseconds. 100 should be okay
+#define ArbitraryWaitPeriod 1 //Aritrary pooling waiting periods, its should be the in the scale of tens of miliseconds to max 100
+
+//Constants for frequency spectrum function
+const int n = 5000;
+const int k = -4950;
+
+//Pins
+#define A PA_10
+#define B PA_9
+#define C PA_8
+#define D PB_10
+#define E PB_5
+#define F PB_4
+#define G PB_3
+#define SEL1 PB_6
+#define SEL2 PC_7
+#define SW1 PC_9
+#define POT1 PA_0
+#define POT2 PA_1
+#define BUZZ PA_11
+#define LD2 PB_15
+
+//Pin/Object declaration
+PwmOut buzzer (BUZZ);
+DigitalOut led2 (LD2);
+InterruptIn sw1 (SW1);
+AnalogIn pot1 (POT1);
+AnalogIn pot2 (POT2);
+BusOut display (A,B,C,D,E,F,G);
+BusOut select (SEL2,SEL1);
+
+//Timer declaration
+Timer t;
+
+//Global variable for updating the display when SW1 is pressed
+int value = 0;
+
+//ISR for Switch1 (Fall)
+void ISR_sw1(){
+    //If the button recently fell, dont do the ISR again (Debounce)
+    //If it didnt, do it and save the new time when you did it
+    if(t.read_ms()> DebouncePeriod){
+        value = pot1 * 100;
+        led2 = !led2;
+        t.reset();
+    }
+}
+
+//Show digit on display
+void SegDisp (int num){
+    switch(num){
+        case 0:display = 0b1000000;break;   
+        case 1:display = 0b1111001;break;   
+        case 2:display = 0b0100100;break;   
+        case 3:display = 0b0110000;break;   
+        case 4:display = 0b0011001;break;   
+        case 5:display = 0b0010010;break;   
+        case 6:display = 0b0000010;break;   
+        case 7:display = 0b1111000;break;   
+        case 8:display = 0b0000000;break;   
+        case 9:display = 0b0010000;break;   
+        default:display = 0x7f;    break;
+    
+    }
+}
+
+//Convert number to digits and show on display
+void PrintDisp(int num){
+    int j = num%10,d = num/10;
+    if(d==0)
+        SegDisp(-1);
+    else
+        SegDisp(d);
+    select = 0b01;
+    wait_ms(ArbitraryWaitPeriod);
+    SegDisp(j);
+    select = 0b10;
+    wait_ms(ArbitraryWaitPeriod);
+}
+
+//Main
+int main(){
+    //Starting timer
+    t.start();
+    //Binding ISR to fall for Switch1
+    sw1.fall(&ISR_sw1);
+    
+    //Main Loop
+    while(1){
+        //Pooling Pot1 i Pot2
+        buzzer=pot1*0.5f; //Arbitrarno deljenje sa 2 jer je apsolutno isto da li je duty 0.25 ili 0.75
+        buzzer.period_us(k*pot2+n); //Linearise  frequency from 20Hz to 20kHz 
+        
+        //Print Pot1 to Display
+        PrintDisp(value); //It never gets to 1 so it wont get to 100 thus its limited to 99
+        
+        //Pooling time is integrated in PrintDisp function
+    }
+}
+