diff --git a/lib/MeasureUnit/MeasureUnit.cpp b/lib/MeasureUnit/MeasureUnit.cpp index dff56e5..eb7c0e1 100644 --- a/lib/MeasureUnit/MeasureUnit.cpp +++ b/lib/MeasureUnit/MeasureUnit.cpp @@ -14,6 +14,8 @@ _globalOffset(0), _error(OK), _state(IDLING), _channel(0), +_offsetComputeIte(7), +_offsetCounter(7), _courant(0.0), _tension(0.0), _triggerLevelOff(false) @@ -22,17 +24,20 @@ _triggerLevelOff(false) _temperatures = (double*) calloc(_thermistorCount, sizeof(double)); _rOffsetMap = (double*) calloc(_thermistorCount, sizeof(double)); _resistanceMap = (double*) malloc(_thermistorCount * sizeof(double)); + _rOffsetBuffer = (double*) malloc(_thermistorCount * sizeof(double)); - if(_temperatures == NULL || _rOffsetMap == NULL || _resistanceMap == NULL) + if(_temperatures == NULL || _rOffsetMap == NULL || _resistanceMap == NULL || _rOffsetBuffer == NULL) { _error = MALLOC_ERR; _temperatures != NULL ? free(_temperatures):(void)_temperatures; _rOffsetMap != NULL ? free(_rOffsetMap):(void)_rOffsetMap; _resistanceMap != NULL ? free(_resistanceMap):(void)_resistanceMap; + _rOffsetBuffer != NULL ? free(_rOffsetBuffer):(void)_rOffsetBuffer; _temperatures = NULL; _rOffsetMap = NULL; _resistanceMap = NULL; + _rOffsetBuffer = NULL; } _adc.begin(); @@ -45,9 +50,83 @@ MeasureUnit::~MeasureUnit() free(_temperatures); free(_rOffsetMap); free(_resistanceMap); + free(_rOffsetBuffer); } } +void MeasureUnit::run() +{ + if(_offsetCounter < _offsetComputeIte && isMeasurementReady()) + { + //We reset the offset array + if(_offsetCounter == 0) + { + Serial.printf("Initiating average \n"); + for(int i(0); i < _thermistorCount; i++) + { + _rOffsetBuffer[i] = 0; + _rOffsetMap[i] = 0; + } + } + else if(_offsetCounter == _offsetComputeIte-1) + { + double averageTemp(0); + + for(int i(0); i < _thermistorCount; i++) + { + _rOffsetBuffer[i] += _temperatures[i]; + } + //We compute the average for each thermistor: + for(int i(0); i < _thermistorCount; i++) + { + _rOffsetBuffer[i] /= _offsetCounter; + averageTemp += _rOffsetBuffer[i]; + } + + averageTemp /= _thermistorCount; + for(int i(0); i < _thermistorCount; i++) + { + _rOffsetMap[i] = averageTemp - _rOffsetBuffer[i]; + } + + Serial.println("Offset done"); + Serial.print("|"); + for(int i(0); i < _thermistorCount; i++) + { + if(i != 7) + { + Serial.print(" ");Serial.print(_rOffsetMap[i],2);Serial.print(" |"); + } + else + { + Serial.print(" ");Serial.print(_rOffsetMap[i],2);Serial.print(" |"); + } + } + Serial.println(""); + } + else + { + for(int i(0); i < _thermistorCount; i++) + { + _rOffsetBuffer[i] += _temperatures[i]; + } + } + + _offsetCounter++; + } +} + +void MeasureUnit::setOffsetIteration(uint8_t iteration) +{ + _offsetComputeIte = iteration; + _offsetCounter = iteration; +} + +void MeasureUnit::startOffsetComputing() +{ + _offsetCounter = 0; +} + /** * Methode permettant d'effectuer les mesures de température et de les récupérer */ @@ -282,3 +361,9 @@ double *MeasureUnit::getAsyncTemperatures() return p; } + +void MeasureUnit::init() +{ + Serial.println(computeTemperature(3380, 18000, 10000)); + Serial.println(computeTemperature(3380, 11700, 10000)); +} diff --git a/lib/MeasureUnit/MeasureUnit.h b/lib/MeasureUnit/MeasureUnit.h index c69d3ed..ed998ee 100644 --- a/lib/MeasureUnit/MeasureUnit.h +++ b/lib/MeasureUnit/MeasureUnit.h @@ -12,6 +12,9 @@ class MeasureUnit MeasureUnit(uint8_t *analogInput, uint16_t thermistorCount, uint64_t precResistor, ThermistorSetting thermistorSetting, Adc &adc); ~MeasureUnit(); void init(); + void run(); + void startOffsetComputing(); + void setOffsetIteration(uint8_t iteration); void setGlobalTempOffset(double offset); void levelTemperaturesOff(); double getGlobalTempOffset(); @@ -34,7 +37,7 @@ class MeasureUnit double _globalOffset; //Correspond à l'offset global nécessaire afin d'avoir une température qui corresponde à la réalité double *_temperatures; //Tableau contenant toutes les températures - double *_rOffsetMap; //Tableau qui contient les offsets individuels pour chaque thermistance + double *_rOffsetMap,*_rOffsetBuffer; //Tableau qui contient les offsets individuels pour chaque thermistance double *_resistanceMap; //Tableau qui contient les resistances associées aux thermistances (pour debug seulement) uint8_t *_analogInput; //Pointeur qui garde l'adresse du tableau contenant le nom des entrées analogiques uint16_t _thermistorCount; @@ -46,7 +49,7 @@ class MeasureUnit //Async part STATE _state; - uint8_t _channel; + uint8_t _channel, _offsetComputeIte,_offsetCounter; double _courant, _tension; boolean _triggerLevelOff; //Attribut permettant de savoir si un étalonnage a été demandé }; diff --git a/lib/MeasureUnit/MeasureUnit.ino b/lib/MeasureUnit/MeasureUnit.ino index f91f9d6..ece4da3 100644 --- a/lib/MeasureUnit/MeasureUnit.ino +++ b/lib/MeasureUnit/MeasureUnit.ino @@ -5,13 +5,17 @@ * Anatole SCHRAMM-HENRY * 17/12/2019 */ - +#include +#include +#include +#include #include "MeasureUnit.h" #include "PayloadFormatter.h" #include "Ads1115.h" #include "LoRaRadio.h" -//#define RADIO_ENABLED +#define RADIO_ENABLED +#define PUSH_BUTTON 0 uint8_t analogInput[] = {0,1,2,3,4,5,6,7}; double *tempArray = NULL; @@ -20,13 +24,17 @@ double *tempArray = NULL; //ThermistorSetting thermistorSetting(3380, 10000); ThermistorSetting thermistorSetting(3650, 470); //AdcSetting adcSetting(3300.0, 12, 310, 3); -AdcSetting adcSetting(3298.13, 15, 6, 10);//6, 10); +AdcSetting adcSetting(3285, 15, 6, 10); Ads1115 adc; -//MeasureUnit measureUnit(analogInput, 8, 990, thermistorSetting, adc); -MeasureUnit measureUnit(analogInput, 8, 99, thermistorSetting, adc); +MeasureUnit measureUnit(analogInput, 8, 990, thermistorSetting, adc); +//MeasureUnit measureUnit(analogInput, 8, 99, thermistorSetting, adc); //Objet de création des trames LoRa PayloadFormatter payloadFormatter(2,4); -DateTime payloadDate(2020,12,26,8,42); + +RTC_DS3231 rtc; +DateTime payloadDate; +TwoWire sc(1); +Adafruit_SSD1306 display(128,64,&sc, 16); boolean data(false); uint8_t *payload(NULL), _timeCounter(0), size(0), _channel(0); @@ -55,6 +63,7 @@ void setup() { Serial.begin(115200); delay(1000); Serial.println("Start setup"); + pinMode(PUSH_BUTTON, INPUT); //Radio init #ifdef RADIO_ENABLED radio.init(); @@ -65,22 +74,37 @@ void setup() { adc.setAdcSetting(adcSetting); //measureUnit.setGlobalTempOffset(-17); _time = millis(); - Serial.println("End setup"); + if(rtc.begin())Serial.println("RTC Ok!"); + else Serial.println("RTC Fail!"); + sc.begin(4, 15); + if(display.begin(SSD1306_SWITCHCAPVCC,0x3C)) + { + Serial.println("SCREEN Ok!"); + display.clearDisplay(); + display.setTextColor(WHITE); + display.setCursor(0,15); + display.setTextSize(2); + display.print("LES ALEAS DU DIRECT"); + display.display(); + } + else Serial.println("SCREEN Fail!"); + + display.startscrollleft(0,16); + Serial.println("End setup"); + measureUnit.init(); Serial.println("| T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 |"); } -void loop() { - //Version synchrone (bloquante) - //tempArray = measureUnit.getTemperatures(); - +void loop() { //Version asynchrone : measureUnit.startTemperatureMeasurement(); //On peut tester si la conversion est terminée avec : //if(measureUnit.isMeasurementReady()) + measureUnit.run(); //measureUnit.getAsyncTemperatures() renvoie NULL si la recupération de la température n'est pas terminée tempArray = measureUnit.getAsyncTemperatures(); @@ -101,6 +125,7 @@ void loop() { //On affiche la trame associée: payloadFormatter.startSession(1); + payloadDate = rtc.now(); size = payloadFormatter.buildPayload(&payload, &payloadDate,tempArray); if(size != 0) { @@ -109,13 +134,13 @@ void loop() { { payload[i] <= 0x0F ? Serial.print("0") : Serial.print(""); Serial.print(payload[i], HEX); Serial.print(" "); } - Serial.println(); + Serial.printf("|%u-%u-%u %u:%u \n", payloadDate.day(),payloadDate.month(),payloadDate.year(),payloadDate.hour(),payloadDate.minute()); } else Serial.print("Failed to build LoRa packet"); - //if(payloadFormatter.endSession()) - //Serial.println("Session ended successfully"); - + + payloadFormatter.endSession(); + #ifdef RADIO_ENABLED if(_timeCounter == 30 && size != 0) { @@ -129,13 +154,11 @@ void loop() { } //On effectue la calibration - /*if(millis() - _time > 5000 && !calibrer) + if(digitalRead(PUSH_BUTTON) == 0) { - Serial.println("********************Starting calibration********************"); - measureUnit.levelAsyncTemperaturesOff(); - Serial.println("********************Ending calibration********************"); - calibrer = true; - }*/ + delay(500); + measureUnit.startOffsetComputing(); + } #ifdef RADIO_ENABLED radio.run(); #endif