diff --git a/sw/prototipo_0/uv_meter_arduino/uv_meter.ino b/sw/prototipo_0/uv_meter_arduino/uv_meter_arduino.ino similarity index 57% rename from sw/prototipo_0/uv_meter_arduino/uv_meter.ino rename to sw/prototipo_0/uv_meter_arduino/uv_meter_arduino.ino index 4263c276697245fd82641b299f515c45528ff4ec..00b03ecb7d9257928ae27a9c6885fb0e8321cc21 100644 --- a/sw/prototipo_0/uv_meter_arduino/uv_meter.ino +++ b/sw/prototipo_0/uv_meter_arduino/uv_meter_arduino.ino @@ -8,6 +8,9 @@ * v0.1 * * + * Timer idea + * https://techtutorialsx.com/2017/10/07/esp32-arduino-timer-interrupts/ + * * LedControl library * Instalarla y editar * #include <avr/pgmspace.h> @@ -16,8 +19,8 @@ */ #include <pgmspace.h> - - +#include <EEPROM.h> +#include <WiFi.h> // WiFi control for ESP32 /* Editar "LedControl.h" y cambiar # include <avr\pgmspace.h> @@ -30,11 +33,11 @@ por */ #include "LedControl.h" // 8 digit 7 segment. MAX -#include <WiFi.h> // WiFi control for ESP32 + /**************************************** - * Aplication parameters + * User parameters ****************************************/ // WiFi access point #define WIFI_AP_NAME "este" @@ -45,9 +48,6 @@ int radiation_power_theorical = 20; // mW/cm2 //int target_dose = 2500; // mJ/cm2 int target_dose = 200; // mJ/cm2 -// Main application loop delay -int quant = 100; //ms - // Period of sending information //int send_delay = 600000; //10min = 10*60*1000 ms int send_delay = 1000; //1seg = 1000 ms @@ -56,10 +56,23 @@ int send_delay = 1000; //1seg = 1000 ms /**************************************** * Platform parameters ****************************************/ -// Main application loop timers -int quant_passed = 0; -//const int quants_per_sec = 1000 / quant; -const int quants_per_sec = 1000 / quant; +// Main application loop delay +const int timer_mhz = 80; +const int tic_period = 100; //ms +const int timer_constant = tic_period*1000; //us 100000 + +int tics_passed = 0; +int time_on_tics = 0; +const int tics_per_sec = 1000 / tic_period; +const int tics_per_minute = 60*tics_per_sec; +const int tics_per_dec_minute = 10*tics_per_minute; +int tic = LOW; + +volatile int interruptCounter; +int totalInterruptCounter; + +hw_timer_t * timer = NULL; +portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; // Baud rate for debug serial #define SERIAL_DEBUG_BAUD 115200 @@ -81,22 +94,40 @@ const int alarm_led_pin = 26; const int alarm_buz_pin = 25; int alarm_state = LOW; -// load detection -const int load_status_pin = 33; -int load_present = LOW; +// load position sensor +const int back_position_pin = 32; +int back_position = LOW; // HIGH when present +const int front_position_pin = 33; +int front_position = LOW; // HIGH when present -// Period of sending information +// Period for sending information int send_passed = 0; // Time passed after data was sent, milliseconds. +// EEPROM +// define the number of byte needed +#define ADD_POWER 0 // address 0 and 1 store radiation power (16 bits) +#define ADD_ON_TIME 2 // address 1 and 2 store TIME on decens of minutes (16 bits) +#define ADD_CAL_1 4 // address 3 and 4 store Calibration parameter 1 (16 bits) +#define ADD_CAL_2 6 // address 5 and 6 store Calibration parameter 1 (16 bits) +#define EEPROM_SIZE 8 // // UV metering int radiation_power = radiation_power_theorical; -int total_desinfection_time = target_dose/radiation_power ; // seconds +int total_desinfection_time = target_dose/radiation_power; // seconds int remaining_desinfection_time = total_desinfection_time; // States enum State_enum {POWER_UP, NO_LOAD_PRESENT, DOSE_CALCULATION, DOSE_APPLY, DOSE_END}; uint8_t state = POWER_UP; +int unload_complete = LOW; // flag to detect unload has been done. + + +void IRAM_ATTR onTimer() { + portENTER_CRITICAL_ISR(&timerMux); + tic = HIGH; + portEXIT_CRITICAL_ISR(&timerMux); + +} /**************************************** * SETUP @@ -115,9 +146,24 @@ pinMode(alarm_led_pin, OUTPUT); ledcSetup(0,1E5,12); ledcAttachPin(alarm_buz_pin,0); -// init load sensor pin -pinMode(load_status_pin, INPUT); +// init sensor pins +pinMode(back_position_pin, INPUT); +pinMode(front_position_pin, INPUT); + +// Initialize EEPROM + EEPROM.begin(EEPROM_SIZE); +// Init values from EEPROM +// sss resolver primera vez +radiation_power = radiation_power_theorical; // sss cambiar por lecturas a eeprom +total_desinfection_time = target_dose/radiation_power; // sss cambiar por lecturas a eeprom + +// Initialize TIC timer + timer = timerBegin(0, timer_mhz, true); + timerAttachInterrupt(timer, &onTimer, true); + timerAlarmWrite(timer, timer_constant, true); + timerAlarmEnable(timer); + // Initialize Wifi // Serial.println("==== wifi setup ===="); // WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD); @@ -130,71 +176,95 @@ pinMode(load_status_pin, INPUT); ****************************************/ void loop() { - delay(quant); + if (checkLoadInFrontSwitch() == HIGH){ + measureRadiationPower(); // time to measure radiation and calculate dose time + if (state == DOSE_END){ + // in DOSE END state waiting for unload complete + unload_complete= HIGH; + + } + } + + + //delay(tic_period); + //tic = HIGH; + + if (tic){ + portENTER_CRITICAL(&timerMux); + tic = LOW; + portEXIT_CRITICAL(&timerMux); + on_tic(); + } + +} + +void on_tic(){ +time_on_tics += 1; + +if (time_on_tics % tics_per_minute == 0){ + update_time_on(); +} + + switch(state) { /////////////////////////////////////// case POWER_UP: Serial.println("state: POWER_UP"); - if(loadPresent()==LOW){ + if(checkLoadPresent()==LOW){ // wait no load to start normal operation state = NO_LOAD_PRESENT; } lc.clearDisplay(0); // Get radiation power and show it. - radiation_power = getRadiationPower(); + radiation_power = currentRadiationPower(); snprintf(digitos_disp1,5,"%04d", radiation_power); displayRadiationPower(digitos_disp1); + // Remaining time display is off break; /////////////////////////////////////// case NO_LOAD_PRESENT: Serial.println("state: NO_LOAD_PRESENT"); - if(loadPresent()==HIGH){ - state = DOSE_CALCULATION; + if(checkLoadPresent()==HIGH){ // wait load present + state = DOSE_APPLY; + + tics_passed = 0; + remaining_desinfection_time = total_desinfection_time; } lc.clearDisplay(0); // Get radiation power and show it. - radiation_power = getRadiationPower(); + radiation_power = currentRadiationPower(); snprintf(digitos_disp1,5,"%04d", radiation_power); displayRadiationPower(digitos_disp1); break; - /////////////////////////////////////// - case DOSE_CALCULATION: - Serial.println("state: DOSE_CALCULATION"); - state = DOSE_APPLY; - - quant_passed = 0; - remaining_desinfection_time = total_desinfection_time; - - break; - /////////////////////////////////////// case DOSE_APPLY: - Serial.println("state: DOSE_APPLY"); + //Serial.println("state: DOSE_APPLY"); - quant_passed += 1; + tics_passed += 1; - if (quant_passed >= quants_per_sec){ + if (tics_passed >= tics_per_sec){ remaining_desinfection_time -=1; - quant_passed = 0; + tics_passed = 0; } - if(loadPresent()==LOW){ + if(checkLoadPresent()==LOW){ // cancel if door opened state = NO_LOAD_PRESENT; } else if (remaining_desinfection_time == 0){ state = DOSE_END; - quant_passed = 0; + unload_complete = LOW; + tics_passed = 0; alarm_state = LOW; } // Get radiation power and show it. - radiation_power = getRadiationPower(); + radiation_power = currentRadiationPower(); snprintf(digitos_disp1,5,"%04d", radiation_power); displayRadiationPower(digitos_disp1); // Show remaining time @@ -205,12 +275,12 @@ switch(state) /////////////////////////////////////// case DOSE_END: - Serial.println("state: DOSE_END"); + //Serial.println("state: DOSE_END"); - quant_passed += 1; + tics_passed += 1; - if (quant_passed >= quants_per_sec){ - quant_passed = 0; + if (tics_passed >= tics_per_sec){ + tics_passed = 0; alarm_state = not(alarm_state); digitalWrite(alarm_led_pin, alarm_state); @@ -228,7 +298,7 @@ switch(state) } - if(loadPresent()==LOW){ + if(unload_complete == HIGH){ // state = NO_LOAD_PRESENT; ledcWriteTone(0,0); digitalWrite(alarm_led_pin, 0); @@ -251,31 +321,52 @@ switch(state) * AUX FUNCTIONS ****************************************/ -int loadPresent() + +int checkLoadPresent() +// detect if both: front and back sensor high { - // HIGH if load to germinize present - return digitalRead(load_status_pin); + int back_position, front_position; + front_position = digitalRead(front_position_pin); + back_position = digitalRead(back_position_pin); + return (front_position and back_position); } -int getRadiationPower() +int checkLoadInFrontSwitch() +// detect if only front sensor high +{ + int back_position, front_position; + front_position = digitalRead(front_position_pin); // sss cambiar. el mismo solo para debug + back_position = digitalRead(back_position_pin); + return (front_position and !back_position); +} + +void update_time_on() +{ + Serial.println("Updating Time On."); +} + +int measureRadiationPower() +{ + Serial.println("measureRadiationPower!!!!!!!!!!"); + radiation_power = radiation_power_theorical; ///sss cambiar por funcion que lee sensor + total_desinfection_time = target_dose/radiation_power; + + return radiation_power_theorical; +} + +int currentRadiationPower() { return radiation_power_theorical; } void displayRadiationPower(const char *chars4) { - //lc.clearDisplay(0); - //for (int i = 0; i < 5 && chars4[i] != 0; i++) { for (int i = 0; i < 4; i++) { lc.setChar(0, 7 - i, chars4[i], false); } } void displayRemainingDesinfectionTime(const char *chars4) { - //lc.clearDisplay(0); for (int i = 0; i < 4; i++) { - Serial.print(i); - Serial.print("-->"); - Serial.println(chars4[i]); lc.setChar(0, 3 - i, chars4[i], false); } } @@ -307,6 +398,8 @@ void reconnect() { } } + + /**************************************** * Trash ****************************************/