Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Arduino.h>
- #include <avr/io.h>
- #include <avr/power.h>
- #include <Adafruit_NeoPixel.h>
- //////////////// MACROS For debugging in serial monitor ///////////////////////
- #define DEBUG 0 //debug mode 1=on 0=off
- #if DEBUG == 1
- #define DEBUG_PRINT(x) Serial.print(x)
- #define DEBUG_PRINTHEX(x) Serial.print(x, HEX)
- #define DEBUG_PRINTBIN(x) Serial.print(x, BIN)
- #define DEBUG_PRINTLN(x) Serial.println(x)
- #define DEBUG_PRINTLNHEX(x) Serial.println(x, HEX)
- #define DEBUG_PRINTLNBIN(x) Serial.println(x, BIN)
- #define SERIAL_BEGIN(x) Serial.begin(x)
- #define SERIAL_DELAY(x) delay(x)
- #else
- #define DEBUG_PRINT(x)
- #define DEBUG_PRINTHEX(x)
- #define DEBUG_PRINTBIN(x)
- #define DEBUG_PRINTLN(x)
- #define DEBUG_PRINTLNHEX(x)
- #define DEBUG_PRINTLNBIN(x)
- #define SERIAL_BEGIN(x)
- #define SERIAL_DELAY(x)
- #endif
- ///////////////////////////////////////////////////////////////////////////////
- //Pins definitions BITS
- #define CD4067_A 4 //PD4 - pin A 10 of CD4067 connected to pin 4 of Arduino
- #define CD4067_B 5 //PD5 - pin B 11 of CD4067 connected to pin 5 of Arduino
- #define CD4067_C 6 //PD6 - pin C 14 of CD4067 connected to pin 6 of Arduino
- #define CD4067_D 7 //PD7 - pin D 13 of CD4067 connected to pin 7 of Arduino
- #define CD4067_SIG 0 //PC0 - pin SIG 0 of CD4067 connected to pin A0(PC0) of Arduino
- #define BTN_STOP_ALARM 2 //PD2 - pin 2 of Arduino connected to button STOP ALARM pull-up (active low)
- #define BUZZER 1 //PB1 - pin 9 of Arduino connected to buzzer
- //Pins definitions Digital ports
- #define LED_ADDRESSABLE 8 //d8 On Trinket or Gemma, suggest changing this to 1
- //Watchdog
- #define WATCHDOG 1 //watchdog 1=on 0=off
- #if WATCHDOG == 1
- #include <avr/wdt.h>
- #define WATCHDOG_RESET wdt_reset()
- //WDTO_8S 8seconds without wdt_reset() before reinitailisation
- //WDTO_4S 4seconds without wdt_reset() before reinitailisation
- //WDTO_2S 2seconds without wdt_reset() before reinitailisation
- //WDTO_1S 1seconds without wdt_reset() before reinitailisation
- #define WATCHDOG_ENABLE wdt_enable(WDTO_2S)
- #else
- #define WATCHDOG_RESET
- #define WATCHDOG_ENABLE
- #endif
- //global variables
- //Led addressable
- #define NUMPIXELS 16 // Popular NeoPixel ring size
- #define BRIGHTNESS 255 //max brightness 0..255
- #define LED_DELAY_FLASH 250 //delay flash in ms
- //Couleur definit par RGB (Red Green Blue) de 0 at 255 for each color
- #define LED_COLOR_OFF Adafruit_NeoPixel::Color(0, 0, 0) //Led Off
- #define LED_COLOR_THRESHOLD_LOW Adafruit_NeoPixel::Color(0, 0, 255) //Led Blue
- #define LED_COLOR_THRESHOLD_HIGH Adafruit_NeoPixel::Color(255, 0, 0) //Led Red
- //Buzzer
- #define BUZZER_PASSIVE 0 //passive buzzer 0=off 1=on
- #define BUZZER_FREQ1 440 //frequency for buzzer 1 note A4 440Hz for buzzer passive
- //Button
- #define TIME_ANTIREBONS 250 //time in ms for anti-rebound
- //Other
- #ifdef F_CPU
- #undef F_CPU
- #endif
- #define F_CPU 16000000L //CPU frequency 16MHz
- #define VCC 5.0f //VCC voltage 5V
- #define ADC_RESOLUTION 1024.0f //ADC resolution 10 bits 0..1024 //1024 values
- #define VOLTAGE_SCALE (VCC/ADC_RESOLUTION) //scale factor for voltage calculation
- //Captors
- #define CAPTOR_DELAY_CYCLE 2000 //delay in milli_second between captor read and next cycle captor read
- #define CPATOR_DELAY_READ 5000 //delay in micro_second between captor sampling read 5000us=5ms
- #define CAPTOR_SAMPLING 10 //number of captor read for average
- //target voltage for captor trigger
- #define CAPTOR_HYSTERESIS_LOW 0.1f //hysteresis for captor trigger low 0.1V
- #define CAPTOR_HYSTERESIS_HIGH 0.1f //hysteresis for captor trigger high 0.1V
- #define DEFAULT_LOW_VOLTAGE 2.0f //default low voltage 2.0V
- #define DEFAULT_HIGH_VOLTAGE 4.0f //default high voltage 4.0V
- //Individual captor trigger
- #define CAPTOR_TRIGGER_LOW_1 DEFAULT_LOW_VOLTAGE //target voltage for captor 1 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_1 DEFAULT_HIGH_VOLTAGE //target voltage for captor 1 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_2 DEFAULT_LOW_VOLTAGE //target voltage for captor 2 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_2 DEFAULT_HIGH_VOLTAGE //target voltage for captor 2 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_3 DEFAULT_LOW_VOLTAGE //target voltage for captor 3 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_3 DEFAULT_HIGH_VOLTAGE //target voltage for captor 3 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_4 DEFAULT_LOW_VOLTAGE //target voltage for captor 4 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_4 DEFAULT_HIGH_VOLTAGE //target voltage for captor 4 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_5 DEFAULT_LOW_VOLTAGE //target voltage for captor 5 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_5 DEFAULT_HIGH_VOLTAGE //target voltage for captor 5 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_6 DEFAULT_LOW_VOLTAGE //target voltage for captor 6 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_6 DEFAULT_HIGH_VOLTAGE //target voltage for captor 6 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_7 DEFAULT_LOW_VOLTAGE //target voltage for captor 7 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_7 DEFAULT_HIGH_VOLTAGE //target voltage for captor 7 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_8 DEFAULT_LOW_VOLTAGE //target voltage for captor 8 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_8 DEFAULT_HIGH_VOLTAGE //target voltage for captor 8 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_9 DEFAULT_LOW_VOLTAGE //target voltage for captor 9 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_9 DEFAULT_HIGH_VOLTAGE //target voltage for captor 9 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_10 DEFAULT_LOW_VOLTAGE //target voltage for captor 10 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_10 DEFAULT_HIGH_VOLTAGE //target voltage for captor 10 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_11 DEFAULT_LOW_VOLTAGE //target voltage for captor 11 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_11 DEFAULT_HIGH_VOLTAGE //target voltage for captor 11 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_12 DEFAULT_LOW_VOLTAGE //target voltage for captor 12 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_12 DEFAULT_HIGH_VOLTAGE //target voltage for captor 12 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_13 DEFAULT_LOW_VOLTAGE //target voltage for captor 13 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_13 DEFAULT_HIGH_VOLTAGE //target voltage for captor 13 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_14 DEFAULT_LOW_VOLTAGE //target voltage for captor 14 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_14 DEFAULT_HIGH_VOLTAGE //target voltage for captor 14 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_15 DEFAULT_LOW_VOLTAGE //target voltage for captor 15 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_15 DEFAULT_HIGH_VOLTAGE //target voltage for captor 15 trigger high 4.0V
- #define CAPTOR_TRIGGER_LOW_16 DEFAULT_LOW_VOLTAGE //target voltage for captor 16 trigger low 2.0V
- #define CAPTOR_TRIGGER_HIGH_16 DEFAULT_HIGH_VOLTAGE //target voltage for captor 16 trigger high 4.0V
- //////////////////////////////// Enum ////////////////////////////////////////
- //enum for color captor state
- enum colorLed {THRESHOLD_HIGH=0, THRESHOLD_LOW=1, LEDOFF=2};
- //////////////////////////////// Variables ////////////////////////////////////////
- //Captors
- uint16_t captorStateLow {0}; //bit 0 = captor_1 ... bit 15 = captor_16 0=false 1=true
- uint16_t captorStateHight {0}; //bit 0 = captor_1 ... bit 15 = captor_16 0=false 1=true
- 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
- 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
- float captorSampling[16]={0}; //array of captor values
- unsigned long timeCycle {0}; //time in ms for one cycle
- //LEDs
- volatile uint16_t ledsStateOff {0xFFFF}; //bit 0 = captor_1 ... bit 15 = captor_16 0=false 1=true
- volatile uint16_t ledsStateHighThresholdWaterway {0}; //bit 0 = captor_1 ... bit 15 = captor_16 0=false 1=true
- volatile uint16_t ledsStateLowThresholdWaterway {0}; //bit 0 = captor_1 ... bit 15 = captor_16 0=false 1=true
- volatile uint8_t ledState {0}; //0 = off, 1 = on
- //Button
- volatile uint8_t btn_pressed {0}; //0 false, 1 true
- volatile unsigned long timeBtnPressed {0}; //time in ms for one cycle
- volatile uint16_t AlarmTriggered {0}; //bit 0 = captor_1 ... bit 15 = captor_16 0=false 1=true
- //////////////////////////////// Objects ////////////////////////////////////////
- //NEO_GRB for WS2812B Green first, Red second and Blue last
- //NEO_KHZ800 for WS2812B 800KHz bitstream (most NeoPixel products w/WS2812 LEDs)
- // if you want to use RGBW leds, declare it as NEO_GRBW + NEO_KHZ800
- Adafruit_NeoPixel displayLed(NUMPIXELS, LED_ADDRESSABLE, NEO_GRB + NEO_KHZ800);
- //////////////////////////////// prototypes of functions ////////////////////////////////////////
- void initPins(void);
- void initInterrupts(void);
- uint16_t readADC0(void);
- void initLedTimer();
- void setLedColor(const uint8_t& led, const uint8_t& color);
- void setCaptorStateOk(const uint8_t& index);
- void setCaptorStateFalse(const uint8_t& index, const uint8_t& color, uint16_t& captorState);
- ////////// if Buzzer Passif or Actif
- #if BUZZER_PASSIVE == 1
- //protype of functions for buzzer
- void setBuzzerTimer();
- void setFrequency(const uint16_t& frequency);
- //ISR for buzzer
- ISR(TIMER2_COMPA_vect) {
- if(AlarmTriggered) PORTB ^= (1 << BUZZER); // Inverser l'état du buzzer
- else PORTB &= ~(1 << BUZZER); // Eteindre le buzzer
- }
- #else
- uint8_t buzzerState {0};
- #endif
- /*
- * @brief ISR for INT0 interrupt
- * @details ISR for INT0 interrupt on pin 2 of arduino nano
- * for button pressed Stop alarm
- * @param none
- */
- ISR(INT0_vect){
- if(!btn_pressed){
- btn_pressed=true; timeBtnPressed = millis();
- }
- }
- /*
- * @brief ISR for TIMER1_COMPA_vect interrupt
- * @details ISR for TIMER1_COMPA_vect interrupt for Led Flashing display
- * @param none
- */
- ISR(TIMER1_COMPA_vect){
- if (ledState){
- displayLed.clear(); // Set all pixel colors to 'off'
- displayLed.show(); // Send the updated pixel colors to the hardware.
- ledState = 0;
- }
- else{
- for(uint8_t i = 0; i <16 ; i++){
- if(ledsStateOff & (1 << i)) displayLed.setPixelColor(i, LED_COLOR_OFF);
- else if(ledsStateHighThresholdWaterway & (1 << i)) displayLed.setPixelColor(i, LED_COLOR_THRESHOLD_HIGH);
- else if(ledsStateLowThresholdWaterway & (1 << i)) displayLed.setPixelColor(i, LED_COLOR_THRESHOLD_LOW);
- else displayLed.setPixelColor(i, LED_COLOR_OFF);
- }
- ledState = 1;
- }
- displayLed.show();
- }
- //////////////////////////////// Main ////////////////////////////////////////
- /*
- * @brief setup function
- */
- void setup() {
- SERIAL_BEGIN(9600); //if debug == 1 start serial communication a 115200 bauds
- SERIAL_DELAY(100);
- DEBUG_PRINT("setup");
- DEBUG_PRINTLN(__TIME__) ;
- WATCHDOG_ENABLE; //enable watchdog
- //initiliaze pins
- initPins();
- //initialize interrupts
- initInterrupts();
- //initialize display led
- displayLed.begin();
- displayLed.setBrightness(BRIGHTNESS);
- }
- /*
- * @brief loop function
- */
- void loop() {
- //check if button is pressed. desactivate alarm on btn_pressed
- if(btn_pressed && (abs(millis() - timeBtnPressed) >= TIME_ANTIREBONS) ){
- btn_pressed = false;
- AlarmTriggered = 0;
- DEBUG_PRINTLN(F("btn pressed, raz alarm and btn_pressed"));
- }
- //cycle time mesure captors
- if( abs(millis() - timeCycle) >= CAPTOR_DELAY_CYCLE){
- timeCycle = millis();
- //initialize sampling array
- memset(captorSampling, 0, sizeof(captorSampling));
- //read captors values and store it in captorSampling
- for(uint8_t i=0 ; i < CAPTOR_SAMPLING ; i++){
- for(uint8_t j=0 ; j < 16 ; j++){
- //set CD4067 multiplexer pins
- PORTD = (PORTD & 0b00001111) | ((j & 0b00001111) << 4);
- captorSampling[j] += static_cast<float>(readADC0()*VOLTAGE_SCALE); //store voltage in captorSampling
- /*
- DEBUG_PRINT(F("captorSampling["));
- DEBUG_PRINT(j);
- DEBUG_PRINT(F("] = "));
- DEBUG_PRINTLN(captorSampling[j]);
- */
- }
- delayMicroseconds(CPATOR_DELAY_READ); //wait between each captor read for sampling
- }
- //check if captor is triggered
- for(uint8_t i=0 ; i < 16 ; i++){
- float adcVoltage= static_cast<float>(captorSampling[i] / CAPTOR_SAMPLING); //average of captorSampling
- /*
- DEBUG_PRINT(F("adcVoltage = "));
- DEBUG_PRINT(adcVoltage);
- DEBUG_PRINT(F(" captorStateLow = "));
- DEBUG_PRINTBIN(captorStateLow);
- DEBUG_PRINT(F(" captorStateHight = "));
- DEBUG_PRINTLNBIN(captorStateHight);
- */
- //if captor is not triggered
- if( (!( (captorStateLow)&(1<<i) )) && (!( (captorStateHight)&(1<<i) )) ){
- // DEBUG_PRINTLN(F("captor is not triggered"));
- if(adcVoltage < captorTriggerLow[i]) setCaptorStateFalse(i, THRESHOLD_LOW, captorStateLow);
- else if(adcVoltage > captorTriggerHigh[i]) setCaptorStateFalse(i, THRESHOLD_HIGH, captorStateHight);
- else setCaptorStateOk(i);
- }
- else if(captorStateLow &(1<<i)){
- // DEBUG_PRINTLN(F("captor triggered low"));
- if( adcVoltage >= (captorTriggerLow[i]+CAPTOR_HYSTERESIS_LOW) ) {
- captorStateLow &= ~(1 << i); //set captor state to false
- AlarmTriggered &= ~(1 << i); //set Alarm state to false
- setCaptorStateOk(i);
- }
- }
- else if(captorStateHight &(1<<i)){
- /*
- DEBUG_PRINTLN(F("captor triggered high"));
- DEBUG_PRINT(F(" adcVoltage = "));
- DEBUG_PRINTLN(adcVoltage);
- DEBUG_PRINT(F(" captorTriggerHigh[i] = "));
- DEBUG_PRINT(captorTriggerHigh[i]);
- DEBUG_PRINT(F(" CAPTOR_HYSTERESIS_HIGH = "));
- DEBUG_PRINT(CAPTOR_HYSTERESIS_HIGH);
- DEBUG_PRINT(F(" captorTriggerHigh[i]-CAPTOR_HYSTERESIS_HIGH = "));
- DEBUG_PRINTLN(captorTriggerHigh[i]-CAPTOR_HYSTERESIS_HIGH);
- */
- if( adcVoltage <= (captorTriggerHigh[i]-CAPTOR_HYSTERESIS_HIGH) ){
- // DEBUG_PRINTLN(F("triggered high captorStateOk"));
- captorStateHight &= ~(1 << i); //set captor state to false
- AlarmTriggered &= ~(1 << i); //set Alarm state to false
- setCaptorStateOk(i);
- }
- }
- }//end for
- }//end if timeCycle
- #if BUZZER_PASSIVE == 0
- //check if alarm is triggered
- if(AlarmTriggered && !buzzerState) {
- PORTB |= (1 << BUZZER);
- buzzerState = 1;
- }
- else if(!AlarmTriggered && buzzerState) {
- PORTB &= ~(1 << BUZZER);
- buzzerState = 0;
- }
- #endif
- WATCHDOG_RESET;
- }
- ///////////////////////////////// Functions ///////////////////////////////////
- //functions
- /*
- * @brief initPins function
- * @details set pins as input or output and set initial state
- * @param none
- */
- void initPins(void)
- {
- //set pins as output
- DDRD |= (1 << CD4067_A) | (1 << CD4067_B) | (1 << CD4067_C) | (1 << CD4067_D);
- DDRB |= (1 << BUZZER);
- //pinMode(CD4067_A, OUTPUT);
- //pinMode(CD4067_B, OUTPUT);
- //pinMode(CD4067_C, OUTPUT);
- //pinMode(CD4067_D, OUTPUT);
- //pinMode(BUZZER, OUTPUT);
- //set pins as input
- DDRD &= ~(1 << BTN_STOP_ALARM) ;
- PORTD |= (1 << BTN_STOP_ALARM);
- //pinMode(BTN_STOP_ALARM, INPUT_PULLUP);
- //set initial state of pins as low
- PORTD &= ~(1 << CD4067_A) & ~(1 << CD4067_B) & ~(1 << CD4067_C) & ~(1 << CD4067_D);
- PORTB &= ~(1 << BUZZER);
- //digitalWrite(CD4067_A, LOW);
- //digitalWrite(CD4067_B, LOW);
- //digitalWrite(CD4067_C, LOW);
- //digitalWrite(CD4067_D, LOW);
- //digitalWrite(BUZZER, LOW);
- }
- /*
- * @brief initInterrupts function
- * @details init interrupts for INT0
- */
- void initInterrupts(void){
- EICRA = 0b00000001; //INT0 falling edge
- EIMSK = 0b00000001; //enable INT0
- //init timer0 for led blinking
- initLedTimer();
- sei(); //enable global interrupts
- }
- /*
- * @brief initADC function
- * @details init ADC for A0 pin
- * @param none
- * @return <uint16_t> ADC value
- */
- uint16_t readADC0(void){
- //ADC A0 conversion settings
- // refs1 0 refs0 1 - AVcc with external capacitor at AREF pin 100nf vcc to gnd at AREF
- ADMUX &= ~(1 << REFS1) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0);
- ADMUX |= (1 << REFS0);
- //start convetion
- //prescale define to 128 for 16MHz clock 16000000/128 = 125000Hz
- //todo if F_CPU < 8000000 then prescale define to 64
- ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
- //wait for conversion to complete
- while(ADCSRA & (1<<ADSC));
- //clear ADIF by writing 1 to it
- ADCSRA |= (1<<ADIF);
- //read ADC value
- //uint16_t adc_value = ADC;
- return ADC;
- }
- /*
- * @brief setLedColor function
- * @details set led color
- * @param const <uint8_t> &led index led number
- * @param const <uint8_t> &color
- * @return none
- */
- void setLedColor(const uint8_t& led, const uint8_t& color){
- switch (color)
- {
- case THRESHOLD_HIGH:
- displayLed.setPixelColor(led, LED_COLOR_THRESHOLD_HIGH);
- ledsStateOff &= ~(1 << led);
- ledsStateLowThresholdWaterway &= ~(1 << led);
- ledsStateHighThresholdWaterway |= (1 << led);
- break;
- case THRESHOLD_LOW:
- displayLed.setPixelColor(led, LED_COLOR_THRESHOLD_LOW);
- ledsStateOff &= ~(1 << led);
- ledsStateHighThresholdWaterway &= ~(1 << led);
- ledsStateLowThresholdWaterway |= (1 << led);
- break;
- case LEDOFF:
- displayLed.setPixelColor(led, LED_COLOR_OFF);
- ledsStateOff |= (1 << led);
- ledsStateHighThresholdWaterway &= ~(1 << led);
- ledsStateLowThresholdWaterway &= ~(1 << led);
- break;
- default:
- displayLed.setPixelColor(led, LED_COLOR_OFF);
- ledsStateOff |= (1 << led);
- ledsStateHighThresholdWaterway &= ~(1 << led);
- ledsStateLowThresholdWaterway &= ~(1 << led);
- break;
- }
- }
- /*
- * @brief setLedColor function
- * @details set led color
- * @param const <uint8_t> &led index led number
- * @param const <uint8_t> &color
- * @return none
- */
- //void setLedColor(const uint8_t& led, const uint8_t& red, const uint8_t& green, const uint8_t& blue){
- // displayLed.setPixelColor(led, red, green, blue);
- //}
- /*
- * @brief setCaptorStateOk function
- * @details set captor state to ok
- * @param const <uint8_t> &index index captor number
- * @return none
- */
- void setCaptorStateOk(const uint8_t& index){
- //DEBUG_PRINTLN("setCaptorStateOk LEDOFF");
- setLedColor(index, LEDOFF);
- }
- /*
- * @brief setCaptorStateFalse function
- * @details set captor state to false
- * @param const <uint8_t> &index index captor number
- * @param const <uint8_t> &color color of led
- * @param <uint16_t> &captorState captor state
- * @return none
- */
- void setCaptorStateFalse(const uint8_t& index, const uint8_t& color, uint16_t& captorState){
- // DEBUG_PRINTLN(F("setCaptorStateFalse"));
- setLedColor(index, color);
- AlarmTriggered |= (1 << index); //set captor state to true
- captorState |= (1 << index); //set captor state to true
- }
- /////////////////// Buzzer Passive ///////////////////////
- #if BUZZER_PASSIVE == 1
- void setBuzzerTimer(){
- TCCR2A |= (1 << WGM21); // Mode CTC Clear Timer on Compare match
- TCCR2B |= (1 << CS22); // PRESCALE 64
- #define PRESCALE_TIMER2 64 //Prescaler for timer2
- setFrequency(BUZZER_FREQ1); // calculate value for frequency
- TIMSK2 |= (1 << OCIE2A); // Enable Interrupt compare A for Timer2
- sei(); // Enable global interrupts
- }
- void setFrequency(const uint16_t& frequency){
- uint16_t valueOcr2A = ( (F_CPU / PRESCALE_TIMER2 / frequency /2) - 1);
- OCR2A = valueOcr2A;
- }
- #endif
- /////////////////// Led Timer1 16b ///////////////////////
- /*
- * @brief initLedTimer function
- * @details init timer1 for led blinking
- */
- void initLedTimer(){
- TCCR1A = 0; //CTC mode Clear Timer on Compare match
- TCCR1B = (1 << WGM12); // CTC
- TIMSK1 = (1 << OCIE1A); // Enable Interrupt compare A for Timer1
- float f = static_cast<float>((F_CPU / 1000.0f ) * LED_DELAY_FLASH );
- uint16_t prescaler = 1;
- //set Prescaler
- if( (f / prescaler) > 65535.0f ){
- prescaler = 8;
- if( (f / prescaler) > 65535.0f ){
- prescaler = 64;
- if( (f / prescaler) > 65535.0f ){
- prescaler = 256;
- if( (f / prescaler) > 65535.0f ){
- prescaler = 1024;
- }
- }
- }
- }
- switch (prescaler)
- {
- case 1: TCCR1B |= (1 << CS10); TCCR1B &=~(1<<CS12) & ~(1<<CS11); break;
- case 8: TCCR1B |= (1 << CS11); TCCR1B &=~(1<<CS12) & ~(1<<CS10); break;
- case 64: TCCR1B |= (1 << CS11) | (1 << CS10); TCCR1B &=~(1<<CS12); break;
- case 256: TCCR1B |= (1 << CS12); TCCR1B &=~(1<<CS11) & ~(1<<CS10); break;
- case 1024: TCCR1B |= (1 << CS12) | (1 << CS10); TCCR1B &=~(1<<CS11); break;
- }
- OCR1A = static_cast<uint16_t>( ( static_cast<float>((F_CPU / 1000.0f / prescaler )) * LED_DELAY_FLASH));
- sei(); // Enable global interrupts
- }
Advertisement
Add Comment
Please, Sign In to add comment