Filip Stevanovic
/
19E042PIM_T2_2020_0039
Filip Stevanovic 2020/0039
Diff: main.cpp
- Revision:
- 0:569d2e559397
- Child:
- 1:f62564cb5261
diff -r 000000000000 -r 569d2e559397 main.cpp --- /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 + } +} +