From f37e9c9e285bf8ec7b6ab5f3da36bf3cae5e370d Mon Sep 17 00:00:00 2001 From: Sebastian Fernandez <sebfer@fing.edu.uy> Date: Mon, 27 Jul 2020 13:02:39 -0300 Subject: [PATCH] Se agrega medicion de nivel durante irradiacion. Si no se llega a minimos durante calibracion o irradiacion, entra en estado erro dando un mensaje --- sw/uv_meter_arduino/uv_meter_arduino.ino | 104 ++++++++++++++---- .../uv_meter_setup_arduino.ino | 82 +++++++++----- 2 files changed, 136 insertions(+), 50 deletions(-) diff --git a/sw/uv_meter_arduino/uv_meter_arduino.ino b/sw/uv_meter_arduino/uv_meter_arduino.ino index 4d4c1c4..2ea1615 100755 --- a/sw/uv_meter_arduino/uv_meter_arduino.ino +++ b/sw/uv_meter_arduino/uv_meter_arduino.ino @@ -81,10 +81,10 @@ por /**************************************** * User parameters ****************************************/ -#define version "Version 1.1" +#define version "Version 1.2" // UV metering -const float target_dose = 2000; // mJ/cm2 - +const float target_dose = 2000; // 2000 mJ/cm2 +const float min_percent_initial_adc = 0.45; /**************************************** * Platform parameters @@ -116,7 +116,7 @@ const int tics_slow_blink = tics_per_sec ; const int tics_slow_chime = tics_slow_blink * 6; const int tics_fast_blink = tics_per_sec/2 ; const int tics_fast_chime = tics_fast_blink * 3; -const int sec_wait_power_stabilization_period = 200; +const int sec_wait_power_stabilization_period = 200; //200 const int tics_wait_power_stabilization_period = tics_per_sec * sec_wait_power_stabilization_period; volatile int tic = LOW; @@ -164,7 +164,7 @@ const int relay_pin = 2; // EEPROM #define ADD_UVC_SENSOR_PRESENT 0 // 1 is sensor present, 0 if not present #define ADD_ADC_RAW_DEF 4 // store default radiation power (4 bytes) -#define ADD_ADC_RAW 8 // store last radiation power (4 bytes) +#define ADD_ADC_MIN 8 // store last radiation power (4 bytes) #define ADD_ON_TIME 12 // store UVC_LIGHT_ON on minutes (4 bytes) #define ADD_ON_CYCLE 16 // store UVC_LIGHT ON Cycles (4 bytes) #define ADD_CAL_G 20 // address 3 and 4 store Calibration parameter 1 (4 bytes) @@ -173,12 +173,13 @@ const int relay_pin = 2; int uvc_sensor_present; float uvc_read_def; -float uvc_read_last; +float uvc_read_min; float scale; float offset; // UV metering -float last_adc_value, new_adc_value; +float new_adc_value; +float min_adc_value_while_apply; float radiation_power; int total_desinfection_time; // seconds int remaining_desinfection_time; @@ -186,7 +187,7 @@ int remaining_desinfection_time; // States enum State_enum {POWER_UP, CALIBRATE_WAIT, CALIBRATE_POWER, DOSE_CALCULATION, WAIT_TO_START, \ DOSE_APPLY, DOSE_END_NOTIFICATION, WAIT_UNLOAD, \ - AL_DOOR_OPEN_WHEN_DOSE_APPLYING + AL_DOOR_OPEN_WHEN_DOSE_APPLYING, ERROR_POWER }; uint8_t state = POWER_UP; @@ -271,6 +272,13 @@ void display_msg_7seg(const char *chars8) { } } +void display_clear() { + lcd.setCursor(0, 0); + lcd.print(" "); // + lcd.setCursor(0, 1); + lcd.print(" "); // +} + void display_calibration_unload() { //76543210 // ToDo: 7 segment message @@ -300,6 +308,15 @@ void display_calibration_power(int value) { lcd.print(" uW/cm2 "); // } +void display_low_power(int value) { + lcd.setCursor(0, 0); + lcd.print("Err: Pot. baja "); // + lcd.setCursor(0, 1); + lcd.print("Pot.: "); // + lcd.print(value); + lcd.print(" uW/cm2 "); // +} + void display_calibration_warming(int value) { //76543210 // ToDo: 7 segment message @@ -483,9 +500,9 @@ void setup() { EEPROM.get(ADD_UVC_SENSOR_PRESENT,uvc_sensor_present); Serial.println((String)"Sensor UVC presente : "+uvc_sensor_present); EEPROM.get(ADD_ADC_RAW_DEF, uvc_read_def); - Serial.println((String)"default_radiation_power_raw : "+uvc_read_def); - EEPROM.get(ADD_ADC_RAW, uvc_read_last); - Serial.println((String)"stored radiation_power_raw : "+uvc_read_last); + Serial.println((String)"uvc_read_def : "+uvc_read_def); + EEPROM.get(ADD_ADC_MIN, uvc_read_min); + Serial.println((String)"stored uvc_read_min : "+uvc_read_min); delay(20); EEPROM.get(ADD_ON_TIME, fvar); Serial.println((String)"minutes_on : "+fvar); @@ -546,7 +563,7 @@ switch(state) DEBUGST_PRINT("state: POWER_UP"); if (uvc_sensor_present == 0){ - radiation_power = calculate_radiation_power(uvc_read_last); + radiation_power = calculate_radiation_power(uvc_read_min); state = DOSE_CALCULATION; } else { radiation_power = 0; @@ -555,7 +572,6 @@ switch(state) load_detected = LOW; tics_gral_passed = 0; - last_adc_value = 0; new_adc_value = 0; digitalWrite(alarm_ledr_pin, LOW); @@ -593,15 +609,20 @@ switch(state) tics_gral_passed = 0; new_adc_value = get_adc_read(); - DEBUG_PRINT((String)"new_adc_value: " + new_adc_value); - radiation_power = calculate_radiation_power(new_adc_value); - display_calibration_power(radiation_power); - // stable if difference between read < 5% - state = DOSE_CALCULATION; - + min_adc_value_while_apply = new_adc_value * min_percent_initial_adc; + + if (new_adc_value < uvc_read_min) { + display_low_power(radiation_power); + mute_chime = LOW; + tics_gral_passed = 0; + state = ERROR_POWER; + } else { + display_calibration_power(radiation_power); + state = DOSE_CALCULATION; + } } else { tics_gral_passed += 1; remaining_warmup_sec = ((tics_wait_power_stabilization_period - tics_gral_passed) / tics_per_sec); @@ -623,6 +644,7 @@ switch(state) tics_on_passed = 0; secs_on_passed = 0; + display_clear(); lc.clearDisplay(0); display_power_time(displayPower,radiation_power); @@ -671,7 +693,8 @@ switch(state) /////////////////////////////////////// case DOSE_APPLY: DEBUGST_PRINT("state: DOSE_APPLY"); - + display_power_time(displayPower,radiation_power); + tics_on_passed += 1; if (tics_on_passed >= tics_per_sec){ @@ -683,6 +706,17 @@ switch(state) if (secs_on_passed > 60){ secs_on_passed = 0; + + new_adc_value = get_adc_read(); + DEBUG_PRINT((String)"DOSE_APPLY, new_adc_value: " + new_adc_value); + + if (new_adc_value < min_adc_value_while_apply) { + radiation_power = calculate_radiation_power(new_adc_value); + display_low_power(radiation_power); + mute_chime = LOW; + tics_gral_passed = 0; + state = ERROR_POWER; + } // S.Fernandez: comentado pues da problemas al escribir a la eeprom // update_time_on(); } @@ -701,7 +735,7 @@ switch(state) digitalWrite(alarm_ledv_pin, LOW); digitalWrite(alarm_ledr_pin, HIGH); - display_power_time(displayPower,radiation_power); + break; @@ -738,6 +772,7 @@ switch(state) if(check_load_present()!=HIGH){ // state = DOSE_CALCULATION; + display_clear(); } tics_gral_passed += 1; @@ -757,7 +792,6 @@ switch(state) state = DOSE_APPLY; else if (check_load_present() != HIGH) state = DOSE_CALCULATION; - if (check_button_pressed() == HIGH){ // espero que lo suelten mute_chime = HIGH; } @@ -778,5 +812,31 @@ switch(state) display_msg_door(); break; + + + /////////////////////////////////////// + case ERROR_POWER: + DEBUGST_PRINT("state: ERROR_POWER"); + + if (check_button_pressed() == HIGH){ // espero que lo suelten + mute_chime = HIGH; + } + + tics_gral_passed += 1; + + if ((tics_gral_passed % tics_fast_blink) == 0) + blink_led_state = !blink_led_state; + digitalWrite(alarm_ledr_pin, blink_led_state); + digitalWrite(alarm_ledv_pin, LOW); + + if (tics_gral_passed >= tics_fast_chime) + { + tics_gral_passed = 0; + if (mute_chime == LOW) + sound_alarm(); + } + + break; } + } diff --git a/sw/uv_meter_setup_arduino/uv_meter_setup_arduino.ino b/sw/uv_meter_setup_arduino/uv_meter_setup_arduino.ino index cd79a70..9b9e5cc 100755 --- a/sw/uv_meter_setup_arduino/uv_meter_setup_arduino.ino +++ b/sw/uv_meter_setup_arduino/uv_meter_setup_arduino.ino @@ -8,6 +8,7 @@ * leer valores eeprom : e * sensor uvc presente : u,presencia * guardar lectura ADC : p,lectura_raw_adc + * guardar minimo ADC : n, minimo_raw_adc * tiempo de encendido : t,minutos * ciclos de encendido : c,ciclos * calibracion scale : g,scale @@ -37,9 +38,10 @@ * * v1.0 - 2020/07/08 : version inicial * v1.1 - 2020/07/13 : no hay cambios, se aumenta version por cambios en uv)meter_arduino + * v1.2 - 2020/07/27 : ADD_ADC_RAW (ultimo valor ADC leido) se cambia por ADD_ADC_RAW_MIN *minimo valro aceptable paa funcionar) */ -#define version "Version 1.1" +#define version "Version 1.2" #include <EEPROM.h> #include "LedControl.h" // 8 digit 7 segment. MAX @@ -88,8 +90,8 @@ LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); // Change to (0x27,16,2) // EEPROM // define the number of byte needed #define ADD_UVC_SENSOR_PRESENT 0 // 1 is sensor present, 0 if not present -#define ADD_ADC_RAW_DEF 4 // store default radiation power (4 bytes) -#define ADD_ADC_RAW 8 // store last radiation power (4 bytes) +#define ADD_ADC_RAW_DEF 4 // store default radiation power (4 bytes) +#define ADD_ADC_RAW_MIN 8 // store min radiation power (4 bytes) #define ADD_ON_TIME 12 // store UVC_LIGHT_ON on minutes (4 bytes) #define ADD_ON_CYCLE 16 // store UVC_LIGHT ON Cycles (4 bytes) #define ADD_CAL_G 20 // address 3 and 4 store Calibration parameter 1 (4 bytes) @@ -109,7 +111,7 @@ float radiation_power; int uvc_sensor_present; float default_raw_adc_value; -float stored_raw_adc_value; +float min_raw_adc_value; float stored_radiation_power; float fminutes_on; @@ -117,6 +119,8 @@ int iminutes_on; float fcycles_on; +bool recepcion_ok; + float ADCValueToRadiation(float adc_value) { return adc_value * scale + offset; @@ -203,6 +207,7 @@ if (Serial.available() > 0) Serial.println("val. eeprom : e"); Serial.println("sensor uvc : u,presencia"); Serial.println("valor adc raw default : p,valor_adc "); + Serial.println("valor adc raw min : n,valor_adc "); Serial.println("tiempo ON : t,minutos"); Serial.println("ciclos ON : c,ciclos"); Serial.println("scale : g,scale"); @@ -237,7 +242,7 @@ if (Serial.available() > 0) Serial.println("= com: minutos encendido ="); // formato mensaje: t,minutos int minutos_on = 1; - bool recepcion_ok = false; + recepcion_ok = false; for (int j = 2; j < indexData; j = j + 1) { readString += inData[j]; } @@ -261,11 +266,11 @@ if (Serial.available() > 0) Serial.println("= com: ciclos encendido ="); // formato mensaje: c,ciclos int ciclos_on = 1; - bool recepcion_ok = false; + recepcion_ok = false; for (int j = 2; j < indexData; j = j + 1) { readString += inData[j]; } - if (readString) { + if (readString != "") { ciclos_on = round(readString.toInt()); Serial.print("Ciclos a grabar en EEPROM: "); Serial.println(ciclos_on); @@ -285,7 +290,7 @@ if (Serial.available() > 0) Serial.println("= com: presencia de sensor ="); // formato mensaje: u,presente int sensor_presente; - bool recepcion_ok = false; + recepcion_ok = false; for (int j = 2; j < indexData; j = j + 1) { readString += inData[j]; } @@ -305,10 +310,10 @@ if (Serial.available() > 0) if (inData[0] == 'p') //f { - Serial.println("= com: setear valor ADC manualmente ="); + Serial.println("= com: setear valor ADC default ="); // formato mensaje: p,valor_adc float valor_adc = 1; - bool recepcion_ok = false; + recepcion_ok = false; for (int j = 2; j < indexData; j = j + 1) { //Serial.println(inData[j]); readString += inData[j]; @@ -318,9 +323,30 @@ if (Serial.available() > 0) Serial.print("Valor ADC raw default a grabar en EEPROM: "); Serial.println(valor_adc); EEPROM.put(ADD_ADC_RAW_DEF, valor_adc); - Serial.print("Ultimo valor ADC leido a grabar en EEPROM: "); + + recepcion_ok = true; + } + if (not recepcion_ok) + { + Serial.println("Incompleto"); + } + } + + if (inData[0] == 'n') //n + { + Serial.println("= com: setear valor ADC minimo ="); + // formato mensaje: n,valor_adc + float valor_adc = 1; + recepcion_ok = false; + for (int j = 2; j < indexData; j = j + 1) { + Serial.println(inData[j]); + readString += inData[j]; + } + if (readString != "") { + valor_adc = (float)readString.toInt(); + Serial.print("Ultimo valor ADC minimo a grabar en EEPROM: "); Serial.println(valor_adc); - EEPROM.put(ADD_ADC_RAW, valor_adc); + EEPROM.put(ADD_ADC_RAW_MIN, valor_adc); recepcion_ok = true; } @@ -329,12 +355,12 @@ if (Serial.available() > 0) Serial.println("Incompleto"); } } - + if (inData[0] == 'g') //g { Serial.println("= com: escalado de ADC a potencia ="); // formato mensaje: g,scale - bool recepcion_ok = false; + recepcion_ok = false; for (int j = 2; j < indexData; j = j + 1) { readString += inData[j]; } @@ -356,7 +382,7 @@ if (Serial.available() > 0) Serial.println("= com: calibracion offset ="); // formato mensaje: o,offset //int offset_read = 1; - bool recepcion_ok = false; + recepcion_ok = false; for (int j = 2; j < indexData; j = j + 1) { readString += inData[j]; } @@ -379,7 +405,7 @@ if (Serial.available() > 0) Serial.println("= com: led verde ="); // formato mensaje: v, estado int estado = 0; - bool recepcion_ok = false; + recepcion_ok = false; for (int j = 2; j < indexData; j = j + 1) { readString += inData[j]; } @@ -401,7 +427,7 @@ if (Serial.available() > 0) Serial.println("= com: led rojo = "); // formato mensaje: r, estado int estado = 0; - bool recepcion_ok = false; + recepcion_ok = false; for (int j = 2; j < indexData; j = j + 1) { readString += inData[j]; } @@ -423,7 +449,7 @@ if (Serial.available() > 0) Serial.println("= com: relay =="); // formato mensaje: r, estado int estado = 0; - bool recepcion_ok = false; + recepcion_ok = false; for (int j = 2; j < indexData; j = j + 1) { readString += inData[j]; } @@ -446,7 +472,7 @@ if (Serial.available() > 0) Serial.println("= com: buzzer ="); // formato mensaje: b, estado int estado = 0; - bool recepcion_ok = false; + recepcion_ok = false; for (int j = 2; j < indexData; j = j + 1) { readString += inData[j]; } @@ -487,29 +513,29 @@ float showValuesInEEPROM(){ // Values from EEPROM EEPROM.get(ADD_UVC_SENSOR_PRESENT,uvc_sensor_present); EEPROM.get(ADD_ADC_RAW_DEF, default_raw_adc_value); - EEPROM.get(ADD_ADC_RAW, stored_raw_adc_value); + EEPROM.get(ADD_ADC_RAW_MIN, min_raw_adc_value); EEPROM.get(ADD_ON_TIME, fminutes_on); EEPROM.get(ADD_ON_CYCLE, fcycles_on); EEPROM.get(ADD_CAL_G, scale); EEPROM.get(ADD_CAL_O, offset); - Serial.print("Sensor UVC : "); + Serial.print("Sensor: "); Serial.println(uvc_sensor_present); - Serial.print("default_raw_adc_value : "); + Serial.print("default adc: "); Serial.println(default_raw_adc_value); - Serial.print("stored raw_adc_value : "); - Serial.println(stored_raw_adc_value); + Serial.print("min adc : "); + Serial.println(min_raw_adc_value); Serial.print("scale : "); Serial.println(scale); Serial.print("offset : "); Serial.println(offset); - Serial.print("minutes_on : " ); + Serial.print("min_on : " ); Serial.println(fminutes_on); - Serial.print("cylces_on : "); + Serial.print("cyc_on : "); Serial.println(fcycles_on); - Serial.print("P. default : "); - stored_radiation_power = ADCValueToRadiation(stored_raw_adc_value); + Serial.print("P.def : "); + stored_radiation_power = ADCValueToRadiation(default_raw_adc_value); Serial.println(stored_radiation_power); } -- GitLab