Fully functional code for LÜTR v1.
Dependencies: PM2_Libary Adafruit_GFX BME680
Diff: main.cpp
- Revision:
- 17:80e441d2b10a
- Parent:
- 16:7536b5d2365c
- Child:
- 18:5019da899a41
--- a/main.cpp Mon May 17 12:23:31 2021 +0000 +++ b/main.cpp Sun May 23 11:53:32 2021 +0000 @@ -18,6 +18,8 @@ #define BME_MOSI 11 #define BME_CS 10 +#define ARRAYLENGTH 60 + using namespace std::chrono; //Namespce für printf usw... @@ -50,6 +52,7 @@ int servoPeriod_mus = 20000; //Zeitperiode int servoMax = 580, servoMin = 350; //2300: 180 ; 300: 0 float a = -2.3, b = 810; //Gas -> Rotation +float tempA = 0.8369, tempB = -0.6236; //Temperaturkompensation /* Methodendeklaration */ @@ -62,19 +65,19 @@ /* Zeitmanagement */ bool executeMainTask = false; Timer power_button_timer,mode_button_timer, loop_timer; -int Ts_ms = 500; //Durchlaufzeit -int mode = 1; -int counter = 0; +int Ts_ms = 500; //Durchlaufzeit -> 2Hz +int mode = 1; //Anzeigemodus: Start auf aktuellen Werten +int counter = 0; //Zähler für verschiedene Frequnzen -/* Array für Mittelwerte*/ -float tempAr[30], humAr[30]; -int pressAr[30], vocAr[30]; +/* Arrays für Mittelwerte*/ +float tempAr[ARRAYLENGTH], humAr[ARRAYLENGTH]; +int pressAr[ARRAYLENGTH], vocAr[ARRAYLENGTH]; int arrayNr = 0; -int firstThirty = 0; +int firstRound = 0; bool firstLap = true; /* Sonstige Parameter */ -bool maxOneTime = true; //identische Position maximal ein mal einstellen +bool maxOneTime = true; //identische Position maximal ein Mal einstellen bool resetExtreme = true; //reset float temp, maxTemp, minTemp, hum, maxHum, minHum; int press, maxPress, minPress, voc, maxVoc, minVoc; @@ -106,6 +109,8 @@ oled.clearDisplay(); if (!bme680.begin()) { //begin() startet Sensor: Vorheizen usw... oled.printf("BME680 Begin failed \r\n"); //Fehlermeldung + }else{ + bme680.performReading(); //Nullwerte abfangen } servoPos(servoMax,1000,1000); //Endpositionen anfahren servoPos(servoMin,1000,1000); @@ -134,7 +139,7 @@ /* Werte auslesen */ if (bme680.performReading()) { - temp = bme680.getTemperature()-4.0; + temp = tempA*bme680.getTemperature()+TempB; //Temperaturkompensation hum = bme680.getHumidity(); press = static_cast<int>(bme680.getPressure()/100); voc = static_cast<int>(bme680.getGasResistance()/1000.0); @@ -142,9 +147,9 @@ oled.printf("Failed to perform reading :(\n"); } /* Mittelwerte */ - if(counter%3600==0||((counter%120==0)&& firstLap)){ //erste 30min: 1 mal in der Minute; danach alle 30 min + if(((counter%(24*3600/ARRAYLENGTH)==0)&& !firstLap)||((counter%(3600/ARRAYLENGTH)==0)&& firstLap)){ //erste 30min: array füllen; danach alle 30 min einen Wert eintragen setAverage(temp, hum, press, voc, arrayNr); - (arrayNr==29)? arrayNr= 0: arrayNr++; + (arrayNr==(ARRAYLENGTH-1))? arrayNr= 0: arrayNr++; } /* Extremwerte */ checkExtreme(temp, hum, press, voc, resetExtreme); @@ -164,7 +169,6 @@ oled.printf("Luftf.: %.2f %%\r\n",getAverageF(humAr)); oled.printf("Luftdr.: %d hPa\r\n",getAverageI(pressAr)); oled.printf("VOC: %d kOhm\r\n",getAverageI(vocAr)); - oled.printf("count: %d, fT: %d",counter,firstThirty); oled.display(); break; @@ -178,7 +182,7 @@ } /* Servo */ - if(counter%10==0){ + if(counter%10==0){ //Nur alle 5s Position ändern int output = static_cast<int>(a*(bme680.getGasResistance()/1000.0)+b); if(output>=servoMin && output<=servoMax){ servoPos(output,250,0); @@ -200,18 +204,21 @@ int T_loop_ms = duration_cast<milliseconds>(loop_timer.elapsed_time()).count(); int dT_loop_ms = Ts_ms - T_loop_ms; if(dT_loop_ms>=0 && dT_loop_ms<=Ts_ms)thread_sleep_for(dT_loop_ms); + oled.clearDisplay(); - if(counter==3600){ - counter = 0; + + (counter==1440000)?counter=0: counter++; //Zähler um 1 erhöhen und nach 720000s wiederholen + if(counter==3600){ //Erste Runde um Array zu füllen firstLap = false; - }else{ - counter++; } }else{ oled.clearDisplay(); oled.display(); - servoPos(servoMax,Ts_ms,0); + if(maxOneTime){ + servoPos(servoMax,Ts_ms,0); + maxOneTime = false; + } } } } @@ -263,22 +270,23 @@ humAr[arrayNr] = hum; pressAr[arrayNr] = press; vocAr[arrayNr] = voc; - if(firstThirty<29)firstThirty++; -} -int getAverageI(int array[]){ - int sum = 0; - for(int j=0; j<firstThirty;j++){ - sum+=array[j]; - } - return sum/(firstThirty+1); + if(firstRound<ARRAYLENGTH)firstRound++; //Arraylänge für Durchschnitt } -float getAverageF(float array[]){ +int getAverageI(int array[]){ //int als Rückgabewert + int sum = 0; + for(int j=0; j<firstRound;j++){ + if(array[j]!=0)sum+=array[j]; + } + return sum/firstRound; +} + +float getAverageF(float array[]){ //float als Rückgabewert float sum = 0; - for(int j=0; j<firstThirty;j++){ - sum+=array[j]; + for(int j=0; j<firstRound;j++){ + if(array[j]!=0)sum+=array[j]; } - return sum/firstThirty; + return sum/firstRound; } /* Extemwerte */