granteeric

read 4067 - 16 inputs

May 18th, 2023 (edited)
964
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 22.69 KB | None | 0 0
  1. #include <Arduino.h>
  2. #include <avr/io.h>
  3. #include <avr/power.h>
  4. #include <Adafruit_NeoPixel.h>
  5.  
  6.  
  7.  
  8. //////////////// MACROS For debugging in serial monitor ///////////////////////
  9. #define DEBUG                   0        //debug mode 1=on 0=off
  10. #if DEBUG == 1
  11.   #define DEBUG_PRINT(x)          Serial.print(x)
  12.   #define DEBUG_PRINTHEX(x)       Serial.print(x, HEX)
  13.   #define DEBUG_PRINTBIN(x)       Serial.print(x, BIN)
  14.   #define DEBUG_PRINTLN(x)        Serial.println(x)
  15.   #define DEBUG_PRINTLNHEX(x)     Serial.println(x, HEX)
  16.   #define DEBUG_PRINTLNBIN(x)     Serial.println(x, BIN)
  17.   #define SERIAL_BEGIN(x)         Serial.begin(x)
  18.   #define SERIAL_DELAY(x)         delay(x)
  19. #else
  20.   #define DEBUG_PRINT(x)
  21.   #define DEBUG_PRINTHEX(x)
  22.   #define DEBUG_PRINTBIN(x)
  23.   #define DEBUG_PRINTLN(x)
  24.   #define DEBUG_PRINTLNHEX(x)
  25.   #define DEBUG_PRINTLNBIN(x)
  26.   #define SERIAL_BEGIN(x)
  27.   #define SERIAL_DELAY(x)
  28. #endif
  29. ///////////////////////////////////////////////////////////////////////////////
  30.  
  31. //Pins definitions            BITS
  32. #define CD4067_A                4                     //PD4 - pin A 10 of CD4067 connected to pin 4 of Arduino
  33. #define CD4067_B                5                     //PD5 - pin B 11 of CD4067 connected to pin 5 of Arduino
  34. #define CD4067_C                6                     //PD6 - pin C 14 of CD4067 connected to pin 6 of Arduino
  35. #define CD4067_D                7                     //PD7 - pin D 13 of CD4067 connected to pin 7 of Arduino
  36. #define CD4067_SIG              0                     //PC0 - pin SIG 0 of CD4067 connected to pin A0(PC0) of Arduino
  37.  
  38. #define BTN_STOP_ALARM          2                     //PD2 - pin 2 of Arduino connected to button STOP ALARM pull-up  (active low)
  39. #define BUZZER                  1                     //PB1 - pin 9 of Arduino connected to buzzer
  40.  
  41. //Pins definitions            Digital ports
  42. #define LED_ADDRESSABLE         8                     //d8 On Trinket or Gemma, suggest changing this to 1
  43.  
  44. //Watchdog
  45. #define WATCHDOG                1                     //watchdog 1=on 0=off
  46.  
  47. #if WATCHDOG == 1
  48.   #include <avr/wdt.h>
  49.   #define WATCHDOG_RESET         wdt_reset()
  50. //WDTO_8S 8seconds without wdt_reset() before reinitailisation
  51. //WDTO_4S 4seconds without wdt_reset() before reinitailisation
  52. //WDTO_2S 2seconds without wdt_reset() before reinitailisation
  53. //WDTO_1S 1seconds without wdt_reset() before reinitailisation
  54.   #define WATCHDOG_ENABLE        wdt_enable(WDTO_2S)
  55. #else
  56.   #define WATCHDOG_RESET
  57.   #define WATCHDOG_ENABLE
  58. #endif
  59.  
  60. //global variables
  61.     //Led addressable
  62. #define NUMPIXELS                 16                    // Popular NeoPixel ring size
  63. #define BRIGHTNESS                255                   //max brightness 0..255
  64. #define LED_DELAY_FLASH           250                   //delay flash in ms
  65.       //Couleur definit par RGB (Red Green Blue) de 0 at 255 for each color
  66. #define LED_COLOR_OFF             Adafruit_NeoPixel::Color(0, 0, 0)        //Led Off      
  67. #define LED_COLOR_THRESHOLD_LOW   Adafruit_NeoPixel::Color(0, 0, 255)      //Led Blue
  68. #define LED_COLOR_THRESHOLD_HIGH  Adafruit_NeoPixel::Color(255, 0, 0)      //Led Red
  69.  
  70.     //Buzzer
  71. #define BUZZER_PASSIVE          0                     //passive buzzer 0=off 1=on
  72. #define BUZZER_FREQ1            440                   //frequency for buzzer 1  note A4 440Hz for buzzer passive
  73.  
  74.     //Button
  75. #define TIME_ANTIREBONS         250                   //time in ms for anti-rebound
  76.  
  77.     //Other
  78. #ifdef F_CPU
  79.   #undef F_CPU
  80. #endif
  81. #define F_CPU                   16000000L             //CPU frequency  16MHz
  82. #define VCC                     5.0f                  //VCC voltage 5V
  83. #define ADC_RESOLUTION          1024.0f               //ADC resolution 10 bits 0..1024 //1024 values
  84. #define VOLTAGE_SCALE           (VCC/ADC_RESOLUTION)  //scale factor for voltage calculation
  85.  
  86.     //Captors
  87. #define CAPTOR_DELAY_CYCLE      2000                  //delay in milli_second between captor read and next cycle captor read
  88. #define CPATOR_DELAY_READ       5000                  //delay in micro_second between captor sampling read 5000us=5ms
  89. #define CAPTOR_SAMPLING         10                    //number of captor read for average
  90.  
  91.         //target voltage for captor trigger
  92. #define CAPTOR_HYSTERESIS_LOW   0.1f                  //hysteresis for captor trigger low  0.1V
  93. #define CAPTOR_HYSTERESIS_HIGH  0.1f                  //hysteresis for captor trigger high 0.1V
  94. #define DEFAULT_LOW_VOLTAGE     2.0f                  //default low voltage 2.0V
  95. #define DEFAULT_HIGH_VOLTAGE    4.0f                  //default high voltage 4.0V
  96.         //Individual captor trigger
  97. #define CAPTOR_TRIGGER_LOW_1    DEFAULT_LOW_VOLTAGE   //target voltage for captor 1 trigger low 2.0V
  98. #define CAPTOR_TRIGGER_HIGH_1   DEFAULT_HIGH_VOLTAGE  //target voltage for captor 1 trigger high 4.0V
  99.  
  100. #define CAPTOR_TRIGGER_LOW_2    DEFAULT_LOW_VOLTAGE   //target voltage for captor 2 trigger low 2.0V
  101. #define CAPTOR_TRIGGER_HIGH_2   DEFAULT_HIGH_VOLTAGE  //target voltage for captor 2 trigger high 4.0V
  102.  
  103. #define CAPTOR_TRIGGER_LOW_3    DEFAULT_LOW_VOLTAGE   //target voltage for captor 3 trigger low 2.0V
  104. #define CAPTOR_TRIGGER_HIGH_3   DEFAULT_HIGH_VOLTAGE  //target voltage for captor 3 trigger high 4.0V
  105.  
  106. #define CAPTOR_TRIGGER_LOW_4    DEFAULT_LOW_VOLTAGE   //target voltage for captor 4 trigger low 2.0V
  107. #define CAPTOR_TRIGGER_HIGH_4   DEFAULT_HIGH_VOLTAGE  //target voltage for captor 4 trigger high 4.0V
  108.  
  109. #define CAPTOR_TRIGGER_LOW_5    DEFAULT_LOW_VOLTAGE   //target voltage for captor 5 trigger low 2.0V
  110. #define CAPTOR_TRIGGER_HIGH_5   DEFAULT_HIGH_VOLTAGE  //target voltage for captor 5 trigger high 4.0V
  111.  
  112. #define CAPTOR_TRIGGER_LOW_6    DEFAULT_LOW_VOLTAGE   //target voltage for captor 6 trigger low 2.0V
  113. #define CAPTOR_TRIGGER_HIGH_6   DEFAULT_HIGH_VOLTAGE  //target voltage for captor 6 trigger high 4.0V
  114.  
  115. #define CAPTOR_TRIGGER_LOW_7    DEFAULT_LOW_VOLTAGE   //target voltage for captor 7 trigger low 2.0V
  116. #define CAPTOR_TRIGGER_HIGH_7   DEFAULT_HIGH_VOLTAGE  //target voltage for captor 7 trigger high 4.0V
  117.  
  118. #define CAPTOR_TRIGGER_LOW_8    DEFAULT_LOW_VOLTAGE   //target voltage for captor 8 trigger low 2.0V
  119. #define CAPTOR_TRIGGER_HIGH_8   DEFAULT_HIGH_VOLTAGE  //target voltage for captor 8 trigger high 4.0V
  120.  
  121. #define CAPTOR_TRIGGER_LOW_9    DEFAULT_LOW_VOLTAGE   //target voltage for captor 9 trigger low 2.0V
  122. #define CAPTOR_TRIGGER_HIGH_9   DEFAULT_HIGH_VOLTAGE  //target voltage for captor 9 trigger high 4.0V
  123.  
  124. #define CAPTOR_TRIGGER_LOW_10   DEFAULT_LOW_VOLTAGE   //target voltage for captor 10 trigger low 2.0V
  125. #define CAPTOR_TRIGGER_HIGH_10  DEFAULT_HIGH_VOLTAGE  //target voltage for captor 10 trigger high 4.0V
  126.  
  127. #define CAPTOR_TRIGGER_LOW_11   DEFAULT_LOW_VOLTAGE   //target voltage for captor 11 trigger low 2.0V
  128. #define CAPTOR_TRIGGER_HIGH_11  DEFAULT_HIGH_VOLTAGE  //target voltage for captor 11 trigger high 4.0V
  129.  
  130. #define CAPTOR_TRIGGER_LOW_12   DEFAULT_LOW_VOLTAGE   //target voltage for captor 12 trigger low 2.0V
  131. #define CAPTOR_TRIGGER_HIGH_12  DEFAULT_HIGH_VOLTAGE  //target voltage for captor 12 trigger high 4.0V
  132.  
  133. #define CAPTOR_TRIGGER_LOW_13   DEFAULT_LOW_VOLTAGE   //target voltage for captor 13 trigger low 2.0V
  134. #define CAPTOR_TRIGGER_HIGH_13  DEFAULT_HIGH_VOLTAGE  //target voltage for captor 13 trigger high 4.0V
  135.  
  136. #define CAPTOR_TRIGGER_LOW_14   DEFAULT_LOW_VOLTAGE   //target voltage for captor 14 trigger low 2.0V
  137. #define CAPTOR_TRIGGER_HIGH_14  DEFAULT_HIGH_VOLTAGE  //target voltage for captor 14 trigger high 4.0V
  138.  
  139. #define CAPTOR_TRIGGER_LOW_15   DEFAULT_LOW_VOLTAGE   //target voltage for captor 15 trigger low 2.0V
  140. #define CAPTOR_TRIGGER_HIGH_15  DEFAULT_HIGH_VOLTAGE  //target voltage for captor 15 trigger high 4.0V
  141.  
  142. #define CAPTOR_TRIGGER_LOW_16   DEFAULT_LOW_VOLTAGE   //target voltage for captor 16 trigger low 2.0V
  143. #define CAPTOR_TRIGGER_HIGH_16  DEFAULT_HIGH_VOLTAGE  //target voltage for captor 16 trigger high 4.0V
  144.  
  145. //////////////////////////////// Enum ////////////////////////////////////////
  146. //enum for color captor state
  147. enum colorLed {THRESHOLD_HIGH=0, THRESHOLD_LOW=1, LEDOFF=2};
  148.  
  149.  
  150. //////////////////////////////// Variables ////////////////////////////////////////
  151.     //Captors
  152. uint16_t captorStateLow {0};                          //bit 0 = captor_1 ... bit 15 = captor_16 0=false 1=true
  153. uint16_t captorStateHight {0};                        //bit 0 = captor_1 ... bit 15 = captor_16 0=false 1=true
  154. float captorTriggerLow[16] {CAPTOR_TRIGGER_LOW_1, CAPTOR_TRIGGER_LOW_2, CAPTOR_TRIGGER_LOW_3, CAPTOR_TRIGGER_LOW_4, CAPTOR_TRIGGER_LOW_5, CAPTOR_TRIGGER_LOW_6, CAPTOR_TRIGGER_LOW_7, CAPTOR_TRIGGER_LOW_8, CAPTOR_TRIGGER_LOW_9, CAPTOR_TRIGGER_LOW_10, CAPTOR_TRIGGER_LOW_11, CAPTOR_TRIGGER_LOW_12, CAPTOR_TRIGGER_LOW_13, CAPTOR_TRIGGER_LOW_14, CAPTOR_TRIGGER_LOW_15, CAPTOR_TRIGGER_LOW_16};  //array of captor trigger low values
  155. float captorTriggerHigh[16] {CAPTOR_TRIGGER_HIGH_1,CAPTOR_TRIGGER_HIGH_2, CAPTOR_TRIGGER_HIGH_3, CAPTOR_TRIGGER_HIGH_4, CAPTOR_TRIGGER_HIGH_5, CAPTOR_TRIGGER_HIGH_6, CAPTOR_TRIGGER_HIGH_7, CAPTOR_TRIGGER_HIGH_8, CAPTOR_TRIGGER_HIGH_9, CAPTOR_TRIGGER_HIGH_10, CAPTOR_TRIGGER_HIGH_11, CAPTOR_TRIGGER_HIGH_12, CAPTOR_TRIGGER_HIGH_13, CAPTOR_TRIGGER_HIGH_14, CAPTOR_TRIGGER_HIGH_15, CAPTOR_TRIGGER_HIGH_16};  //array of captor trigger low values
  156. float captorSampling[16]={0};                         //array of captor values
  157. unsigned long timeCycle {0};                          //time in ms for one cycle
  158.  
  159.     //LEDs
  160. volatile uint16_t ledsStateOff {0xFFFF};              //bit 0 = captor_1 ... bit 15 = captor_16 0=false 1=true
  161. volatile uint16_t ledsStateHighThresholdWaterway {0}; //bit 0 = captor_1 ... bit 15 = captor_16 0=false 1=true
  162. volatile uint16_t ledsStateLowThresholdWaterway {0};  //bit 0 = captor_1 ... bit 15 = captor_16 0=false 1=true
  163. volatile uint8_t ledState {0};                        //0 = off, 1 = on
  164.     //Button
  165. volatile uint8_t btn_pressed {0};                     //0 false, 1 true
  166. volatile unsigned long timeBtnPressed {0};            //time in ms for one cycle
  167. volatile uint16_t AlarmTriggered {0};                 //bit 0 = captor_1 ... bit 15 = captor_16 0=false 1=true
  168.  
  169.  
  170.  
  171. //////////////////////////////// Objects ////////////////////////////////////////
  172.  
  173.   //NEO_GRB for WS2812B Green first, Red second and Blue last
  174.   //NEO_KHZ800 for WS2812B 800KHz bitstream (most NeoPixel products w/WS2812 LEDs)
  175.   // if you want to use RGBW leds, declare it as NEO_GRBW + NEO_KHZ800
  176. Adafruit_NeoPixel displayLed(NUMPIXELS, LED_ADDRESSABLE, NEO_GRB + NEO_KHZ800);
  177.  
  178.  
  179. //////////////////////////////// prototypes of functions ////////////////////////////////////////
  180.  
  181. void initPins(void);
  182. void initInterrupts(void);
  183. uint16_t readADC0(void);
  184. void initLedTimer();
  185. void setLedColor(const uint8_t& led, const uint8_t& color);
  186. void setCaptorStateOk(const uint8_t& index);
  187. void setCaptorStateFalse(const uint8_t& index, const uint8_t& color, uint16_t& captorState);
  188.  
  189.  
  190. ////////// if Buzzer Passif or Actif
  191. #if BUZZER_PASSIVE == 1
  192.   //protype of functions for buzzer
  193.   void setBuzzerTimer();
  194.   void setFrequency(const uint16_t& frequency);
  195.  
  196.   //ISR for buzzer
  197.   ISR(TIMER2_COMPA_vect) {
  198.     if(AlarmTriggered) PORTB ^= (1 << BUZZER); // Inverser l'état du buzzer
  199.     else PORTB &= ~(1 << BUZZER); // Eteindre le buzzer
  200.   }
  201. #else
  202.   uint8_t buzzerState {0};
  203. #endif
  204.  
  205.  
  206. /*
  207. * @brief ISR for INT0 interrupt
  208. * @details ISR for INT0 interrupt on pin 2 of arduino nano
  209. * for button pressed Stop alarm
  210. * @param none
  211. */
  212. ISR(INT0_vect){
  213.   if(!btn_pressed){
  214.     btn_pressed=true; timeBtnPressed = millis();
  215.   }
  216. }
  217.  
  218. /*
  219. * @brief ISR for TIMER1_COMPA_vect interrupt
  220. * @details ISR for TIMER1_COMPA_vect interrupt for Led Flashing display
  221. * @param none
  222. */
  223. ISR(TIMER1_COMPA_vect){
  224.     if (ledState){
  225.     displayLed.clear();                                                     // Set all pixel colors to 'off'
  226.     displayLed.show();                                                      // Send the updated pixel colors to the hardware.                
  227.     ledState = 0;
  228.     }
  229.     else{
  230.       for(uint8_t i = 0; i <16 ; i++){
  231.         if(ledsStateOff & (1 << i)) displayLed.setPixelColor(i, LED_COLOR_OFF);
  232.         else if(ledsStateHighThresholdWaterway & (1 << i)) displayLed.setPixelColor(i, LED_COLOR_THRESHOLD_HIGH);
  233.         else if(ledsStateLowThresholdWaterway & (1 << i)) displayLed.setPixelColor(i, LED_COLOR_THRESHOLD_LOW);
  234.         else displayLed.setPixelColor(i, LED_COLOR_OFF);
  235.        
  236.       }
  237.       ledState = 1;
  238.     }
  239.     displayLed.show();
  240. }
  241.  
  242. //////////////////////////////// Main ////////////////////////////////////////
  243. /*
  244. * @brief setup function
  245. */
  246. void setup() {
  247.   SERIAL_BEGIN(9600);   //if debug == 1 start serial communication a 115200 bauds
  248.   SERIAL_DELAY(100);
  249.   DEBUG_PRINT("setup");
  250.   DEBUG_PRINTLN(__TIME__) ;
  251.   WATCHDOG_ENABLE;      //enable watchdog
  252.  
  253.   //initiliaze pins
  254.   initPins();
  255.  
  256.   //initialize interrupts
  257.   initInterrupts();
  258.  
  259.   //initialize display led
  260.   displayLed.begin();
  261.   displayLed.setBrightness(BRIGHTNESS);
  262. }
  263.  
  264. /*
  265. * @brief loop function
  266. */
  267. void loop() {
  268.  
  269.   //check if button is pressed. desactivate alarm on btn_pressed
  270.   if(btn_pressed && (abs(millis() - timeBtnPressed) >= TIME_ANTIREBONS) ){
  271.     btn_pressed = false;
  272.     AlarmTriggered = 0;
  273.     DEBUG_PRINTLN(F("btn pressed, raz alarm and btn_pressed"));
  274.   }
  275.  
  276.   //cycle time mesure captors
  277.   if( abs(millis() - timeCycle) >= CAPTOR_DELAY_CYCLE){
  278.     timeCycle = millis();
  279.  
  280.     //initialize sampling array
  281.     memset(captorSampling, 0, sizeof(captorSampling));
  282.  
  283.     //read captors values and store it in captorSampling
  284.     for(uint8_t i=0 ; i < CAPTOR_SAMPLING ; i++){
  285.       for(uint8_t j=0 ; j < 16 ; j++){      
  286.         //set CD4067 multiplexer pins
  287.         PORTD = (PORTD & 0b00001111) | ((j & 0b00001111) << 4);
  288.         captorSampling[j] += static_cast<float>(readADC0()*VOLTAGE_SCALE);                //store voltage in captorSampling
  289. /*
  290.         DEBUG_PRINT(F("captorSampling["));
  291.         DEBUG_PRINT(j);
  292.         DEBUG_PRINT(F("] = "));
  293.         DEBUG_PRINTLN(captorSampling[j]);
  294.         */
  295.       }
  296.       delayMicroseconds(CPATOR_DELAY_READ); //wait between each captor read for sampling
  297.      
  298.     }
  299.  
  300.     //check if captor is triggered
  301.     for(uint8_t i=0 ; i < 16 ; i++){      
  302.       float adcVoltage= static_cast<float>(captorSampling[i] / CAPTOR_SAMPLING); //average of captorSampling
  303.      
  304.       /*
  305.       DEBUG_PRINT(F("adcVoltage = "));
  306.       DEBUG_PRINT(adcVoltage);
  307.       DEBUG_PRINT(F(" captorStateLow = "));
  308.       DEBUG_PRINTBIN(captorStateLow);
  309.       DEBUG_PRINT(F(" captorStateHight = "));
  310.       DEBUG_PRINTLNBIN(captorStateHight);
  311. */
  312.  
  313.       //if captor is not triggered
  314.       if( (!( (captorStateLow)&(1<<i) )) && (!( (captorStateHight)&(1<<i) )) ){
  315. //        DEBUG_PRINTLN(F("captor is not triggered"));
  316.  
  317.         if(adcVoltage < captorTriggerLow[i]) setCaptorStateFalse(i, THRESHOLD_LOW, captorStateLow);
  318.         else if(adcVoltage > captorTriggerHigh[i]) setCaptorStateFalse(i, THRESHOLD_HIGH, captorStateHight);
  319.         else setCaptorStateOk(i);
  320.       }
  321.       else if(captorStateLow &(1<<i)){
  322. //        DEBUG_PRINTLN(F("captor triggered low"));
  323.         if( adcVoltage >= (captorTriggerLow[i]+CAPTOR_HYSTERESIS_LOW) )  {
  324.           captorStateLow &= ~(1 << i);  //set captor state to false
  325.           AlarmTriggered &= ~(1 << i);  //set Alarm state to false
  326.           setCaptorStateOk(i);
  327.         }
  328.       }
  329.       else if(captorStateHight &(1<<i)){
  330. /*        
  331.         DEBUG_PRINTLN(F("captor triggered high"));
  332.         DEBUG_PRINT(F(" adcVoltage = "));
  333.         DEBUG_PRINTLN(adcVoltage);
  334.        
  335.         DEBUG_PRINT(F("  captorTriggerHigh[i] = "));
  336.         DEBUG_PRINT(captorTriggerHigh[i]);
  337.  
  338.         DEBUG_PRINT(F("  CAPTOR_HYSTERESIS_HIGH = "));
  339.         DEBUG_PRINT(CAPTOR_HYSTERESIS_HIGH);
  340.  
  341.         DEBUG_PRINT(F("  captorTriggerHigh[i]-CAPTOR_HYSTERESIS_HIGH = "));
  342.         DEBUG_PRINTLN(captorTriggerHigh[i]-CAPTOR_HYSTERESIS_HIGH);
  343. */
  344.         if( adcVoltage <= (captorTriggerHigh[i]-CAPTOR_HYSTERESIS_HIGH) ){
  345. //          DEBUG_PRINTLN(F("triggered high captorStateOk"));
  346.           captorStateHight &= ~(1 << i);  //set captor state to false
  347.           AlarmTriggered &= ~(1 << i);  //set Alarm state to false
  348.           setCaptorStateOk(i);
  349.         }
  350.       }
  351.     }//end for
  352.   }//end if timeCycle
  353.  
  354. #if BUZZER_PASSIVE == 0
  355.   //check if alarm is triggered
  356.   if(AlarmTriggered && !buzzerState) {
  357.     PORTB |= (1 << BUZZER);
  358.     buzzerState = 1;
  359.   }
  360.   else if(!AlarmTriggered && buzzerState) {
  361.     PORTB &= ~(1 << BUZZER);
  362.     buzzerState = 0;
  363.   }
  364.  
  365. #endif
  366.  
  367.  WATCHDOG_RESET;
  368. }
  369.  
  370.  
  371. ///////////////////////////////// Functions ///////////////////////////////////
  372. //functions
  373. /*
  374. * @brief initPins function
  375. * @details set pins as input or output and set initial state
  376. * @param none
  377. */
  378.  
  379. void initPins(void)
  380. {
  381.   //set pins as output
  382.   DDRD |= (1 << CD4067_A) | (1 << CD4067_B) | (1 << CD4067_C) | (1 << CD4067_D);
  383.   DDRB |= (1 << BUZZER);
  384.   //pinMode(CD4067_A, OUTPUT);
  385.   //pinMode(CD4067_B, OUTPUT);
  386.   //pinMode(CD4067_C, OUTPUT);
  387.   //pinMode(CD4067_D, OUTPUT);
  388.   //pinMode(BUZZER, OUTPUT);
  389.  
  390.   //set pins as input
  391.   DDRD &= ~(1 << BTN_STOP_ALARM) ;
  392.   PORTD |= (1 << BTN_STOP_ALARM);
  393.   //pinMode(BTN_STOP_ALARM, INPUT_PULLUP);
  394.  
  395.   //set initial state of pins as low
  396.   PORTD &= ~(1 << CD4067_A) & ~(1 << CD4067_B) & ~(1 << CD4067_C) & ~(1 << CD4067_D);
  397.   PORTB &= ~(1 << BUZZER);
  398.   //digitalWrite(CD4067_A, LOW);
  399.   //digitalWrite(CD4067_B, LOW);
  400.   //digitalWrite(CD4067_C, LOW);
  401.   //digitalWrite(CD4067_D, LOW);
  402.   //digitalWrite(BUZZER, LOW);
  403.  
  404.  
  405. }
  406.  
  407. /*
  408. * @brief initInterrupts function
  409. * @details init interrupts for INT0
  410. */
  411. void initInterrupts(void){
  412.   EICRA = 0b00000001; //INT0 falling edge
  413.   EIMSK = 0b00000001; //enable INT0
  414.  
  415.   //init timer0 for led blinking
  416.   initLedTimer();
  417.  
  418.   sei(); //enable global interrupts
  419. }
  420.  
  421.  
  422. /*
  423. * @brief initADC function
  424. * @details init ADC for A0 pin
  425. * @param none
  426. * @return <uint16_t> ADC value
  427. */
  428. uint16_t readADC0(void){
  429. //ADC A0 conversion settings
  430.   // refs1 0 refs0 1 - AVcc with external capacitor at AREF pin  100nf vcc to gnd at AREF
  431.   ADMUX &= ~(1 << REFS1) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0);
  432.   ADMUX |= (1 << REFS0);
  433. //start convetion
  434. //prescale define to 128 for 16MHz clock 16000000/128 = 125000Hz
  435. //todo if F_CPU < 8000000 then prescale define to 64
  436.   ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
  437. //wait for conversion to complete
  438.   while(ADCSRA & (1<<ADSC));
  439.   //clear ADIF by writing 1 to it
  440.   ADCSRA |= (1<<ADIF);
  441.   //read ADC value
  442.   //uint16_t adc_value = ADC;
  443.  
  444.   return ADC;
  445. }
  446.  
  447. /*
  448. * @brief setLedColor function
  449. * @details set led color
  450. * @param const <uint8_t> &led   index led number
  451. * @param const <uint8_t> &color
  452. * @return none
  453. */
  454. void setLedColor(const uint8_t& led, const uint8_t& color){
  455.   switch (color)
  456.   {
  457.   case THRESHOLD_HIGH:
  458.     displayLed.setPixelColor(led, LED_COLOR_THRESHOLD_HIGH);
  459.     ledsStateOff &= ~(1 << led);
  460.     ledsStateLowThresholdWaterway &= ~(1 << led);
  461.     ledsStateHighThresholdWaterway |= (1 << led);
  462.   break;
  463.   case THRESHOLD_LOW:
  464.     displayLed.setPixelColor(led, LED_COLOR_THRESHOLD_LOW);
  465.     ledsStateOff &= ~(1 << led);
  466.     ledsStateHighThresholdWaterway &= ~(1 << led);
  467.     ledsStateLowThresholdWaterway |= (1 << led);
  468.   break;
  469.   case LEDOFF:
  470.     displayLed.setPixelColor(led, LED_COLOR_OFF);
  471.     ledsStateOff |= (1 << led);
  472.     ledsStateHighThresholdWaterway &= ~(1 << led);
  473.     ledsStateLowThresholdWaterway &= ~(1 << led);
  474.   break;
  475.   default:
  476.     displayLed.setPixelColor(led, LED_COLOR_OFF);
  477.     ledsStateOff |= (1 << led);
  478.     ledsStateHighThresholdWaterway &= ~(1 << led);
  479.     ledsStateLowThresholdWaterway &= ~(1 << led);
  480.   break;
  481.   }
  482. }
  483.  
  484. /*
  485. * @brief setLedColor function
  486. * @details set led color
  487. * @param const <uint8_t> &led   index led number
  488. * @param const <uint8_t> &color
  489. * @return none
  490. */
  491. //void setLedColor(const uint8_t& led, const uint8_t& red, const uint8_t& green, const uint8_t& blue){
  492. //  displayLed.setPixelColor(led, red, green, blue);
  493. //}
  494.  
  495. /*
  496. * @brief setCaptorStateOk function
  497. * @details set captor state to ok
  498. * @param const <uint8_t> &index   index captor number
  499. * @return none
  500. */
  501. void setCaptorStateOk(const uint8_t& index){
  502.   //DEBUG_PRINTLN("setCaptorStateOk LEDOFF");  
  503.   setLedColor(index, LEDOFF);
  504. }
  505.  
  506. /*
  507. * @brief setCaptorStateFalse function
  508. * @details set captor state to false
  509. * @param const <uint8_t> &index   index captor number
  510. * @param const <uint8_t> &color   color of led
  511. * @param <uint16_t> &captorState  captor state
  512. * @return none
  513. */
  514. void setCaptorStateFalse(const uint8_t& index, const uint8_t& color, uint16_t& captorState){
  515. //  DEBUG_PRINTLN(F("setCaptorStateFalse"));
  516.   setLedColor(index, color);
  517.   AlarmTriggered |= (1 << index);  //set captor state to true
  518.   captorState |= (1 << index);  //set captor state to true
  519. }
  520.  
  521. /////////////////// Buzzer Passive ///////////////////////
  522. #if BUZZER_PASSIVE == 1
  523.   void setBuzzerTimer(){
  524.     TCCR2A |= (1 << WGM21); // Mode CTC  Clear Timer on Compare match
  525.     TCCR2B |= (1 << CS22); // PRESCALE 64
  526.     #define PRESCALE_TIMER2       64  //Prescaler for timer2  
  527.     setFrequency(BUZZER_FREQ1); // calculate value for frequency
  528.     TIMSK2 |= (1 << OCIE2A); // Enable Interrupt compare A for Timer2
  529.     sei(); // Enable global interrupts
  530.   }
  531.  
  532.   void setFrequency(const uint16_t& frequency){
  533.     uint16_t valueOcr2A =  ( (F_CPU / PRESCALE_TIMER2 / frequency /2) - 1);
  534.     OCR2A = valueOcr2A;
  535.   }
  536.  
  537. #endif
  538.  
  539. /////////////////// Led Timer1 16b ///////////////////////
  540. /*
  541. * @brief initLedTimer function
  542. * @details init timer1 for led blinking
  543. */
  544. void initLedTimer(){
  545.   TCCR1A = 0; //CTC mode Clear Timer on Compare match
  546.   TCCR1B = (1 << WGM12); // CTC
  547.   TIMSK1 = (1 << OCIE1A); // Enable Interrupt compare A for Timer1  
  548.   float f = static_cast<float>((F_CPU / 1000.0f ) * LED_DELAY_FLASH );
  549.   uint16_t prescaler = 1;
  550. //set Prescaler
  551.   if( (f / prescaler)  > 65535.0f ){
  552.       prescaler = 8;
  553.       if( (f / prescaler)  > 65535.0f ){
  554.           prescaler = 64;
  555.           if( (f / prescaler)  > 65535.0f ){
  556.               prescaler = 256;
  557.               if( (f / prescaler)  > 65535.0f ){
  558.                   prescaler = 1024;
  559.               }
  560.           }
  561.       }
  562.   }
  563.  
  564.   switch (prescaler)
  565.   {
  566.     case 1: TCCR1B |= (1 << CS10); TCCR1B &=~(1<<CS12) & ~(1<<CS11); break;
  567.     case 8: TCCR1B |= (1 << CS11); TCCR1B &=~(1<<CS12) & ~(1<<CS10); break;
  568.     case 64: TCCR1B |= (1 << CS11) | (1 << CS10); TCCR1B &=~(1<<CS12); break;
  569.     case 256: TCCR1B |= (1 << CS12); TCCR1B &=~(1<<CS11) & ~(1<<CS10); break;
  570.     case 1024: TCCR1B |= (1 << CS12) | (1 << CS10); TCCR1B &=~(1<<CS11); break;
  571.   }
  572.  
  573.   OCR1A = static_cast<uint16_t>(  ( static_cast<float>((F_CPU / 1000.0f / prescaler )) * LED_DELAY_FLASH));
  574.   sei(); // Enable global interrupts
  575. }
  576.  
  577.  
Advertisement
Add Comment
Please, Sign In to add comment