From 8ba3741c93f21fd58a30f6fea723b326cd11f9ba Mon Sep 17 00:00:00 2001 From: 2EEEB <192235@vutbr.cz> Date: Fri, 14 Feb 2020 14:19:51 +0100 Subject: [PATCH] add basic firmware --- thesis_fw.ino | 424 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 424 insertions(+) create mode 100644 thesis_fw.ino diff --git a/thesis_fw.ino b/thesis_fw.ino new file mode 100644 index 0000000..1346367 --- /dev/null +++ b/thesis_fw.ino @@ -0,0 +1,424 @@ +#include +// display mapping suggestion for Arduino MEGA +// BUSY -> 7, RST -> 9, DC -> 8, CS-> 53, CLK -> 52, DIN -> 51 +#include +//#include +//#include +#include +#include +#include +//rtc includes +#include +//bme280 +//#include +#include +#include + +//BME280I2C bme; +Adafruit_BME280 bme; + +#define MAX_DISPAY_BUFFER_SIZE 64 // +#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8)) +GxEPD2_BW display(GxEPD2_290(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); + +void setup() { + // put your setup code here, to run once: + pinMode(13, OUTPUT); + digitalWrite(13, LOW); + + Serial.begin(115200); + Serial2.begin(115200); + Wire.begin(); + + while(!bme.begin(0x76)) + { + Serial.println("Could not find BME280 sensor!"); + delay(1000); + } + + if(bme.sensorID() == 0x60){ + Serial.println("Found BME280 sensor"); + } + else { + Serial.println("Found unknown sensor"); + } +// switch(bme.chipModel()) +// { +// case BME280::ChipModel_BME280: +// Serial.println("Found BME280 sensor."); +// break; +// case BME280::ChipModel_BMP280: +// Serial.println("Found BMP280 sensor! No Humidity available."); +// break; +// default: +// Serial.println("Found UNKNOWN sensor."); +// } + + Serial.println(); + delay(100); + display.init(115200); //init display + delay(100); + +// initDataset(); + makeGrid(); + printRtimeToScreen(); + printRtDateToScreen(); + delay(5000); //wait for esp to finish booting +}; + +struct data { + int yr; + char mo; + char dy; + char hr; + char mn; + char s; + float temp; + float hum; + int rhum; + float pres; + unsigned int rpres; + int co2; +}; + +volatile static struct data dataset; +static bool reqTimeSync = false; +// + +void doStuff() { + dataset.temp = measureTemp(); + dataset.hum = measureHum(); + dataset.rhum = round(dataset.hum); + dataset.pres = measurePres(); + dataset.rpres = round(dataset.pres); + dataset.co2 = 0; + RTC.readTime(); + dataset.yr = RTC.yyyy; + dataset.mo = RTC.mm; + dataset.dy = RTC.dd; + dataset.hr = RTC.h; + dataset.mn = RTC.m; + dataset.s = RTC.s; +}; + +void loop() { + static unsigned char oldmins; + static bool reqTimeSync = false; + + RTC.readTime(); + if(RTC.m != oldmins){ + + printRtimeToScreen(); + doStuff(); + printTempToScreen(); + sendDataToServer(); +// updateTempOnScreen(); + oldmins = RTC.m; + } + else if(RTC.m == 0 && RTC.h == 0 && RTC.s == 30){ + printRtDateToScreen(); +// timeSynced = false; + } + if (RTC.h == 6 || RTC.h == 20 && RTC.m == 00 && RTC.s == 30 && reqTimeSync ==true){ + reqTimeSync = false; + syncTime(); + } +} + +int syncTime() { + char tbuf; + static bool trecvd = false; + static bool trecvn = false; + char tarry[21]; + int yyyy; + int mm; + int dd; + int h; + int m; + int s; + static char j = 0; + static char l = 0; + + Serial.print("Syncing time...\n"); + delay(50); + Serial2.print("?ntp\n"); + delay(5); + while(Serial2.available() > 0 && trecvd == false){ + tbuf = Serial2.read(); + if(trecvn == true) { + if(tbuf != '\n'){ + tarry[j] = tbuf; + j++; + } else { + tarry[j] = '\0'; + trecvn = false; + j = 0; + trecvd = true; + } + } else if (tbuf == '>'){ + trecvn = true; + } + } + if(trecvd == true){ + Serial.println(tarry); + Serial.println("Parsed time"); + char* token = strtok(tarry, ","); + while(token != NULL){ + if(l == 0){ + yyyy = atoi(token); + }; + if(l == 1) { + mm = atoi(token); + }; + if(l == 2) { + dd = atoi(token); + }; + if(l == 3) { + h = atoi(token); + }; + if(l == 4){ + m = atoi(token); + }; + if(l == 5){ + s = atoi(token); + }; + token = strtok(NULL, ","); + l++; + } + l = 0; + Serial.println(yyyy); + Serial.println(mm); + Serial.println(dd); + Serial.println(h); + Serial.println(m); + Serial.println(s); + RTC.yyyy = yyyy; + RTC.mm = mm; + RTC.dd = dd; + RTC.h = h; + RTC.m = m; + RTC.s = s; + RTC.writeTime(); + trecvd = false; + reqTimeSync = true; + return(0); + } +} + +void makeGrid() { + display.setRotation(2); //portrait, connector at the bottom + display.setFullWindow(); + display.firstPage(); + do { + display.fillScreen(GxEPD_WHITE); + display.drawFastVLine(64, 192, display.height(), GxEPD_BLACK); + display.drawFastHLine(0, 64, display.width(), GxEPD_BLACK); + display.drawFastHLine(0, 128, display.width(), GxEPD_BLACK); + display.drawFastHLine(0, 192, display.width(), GxEPD_BLACK); + display.drawFastHLine(0, 256, display.width(), GxEPD_BLACK); + } + while (display.nextPage()); +} + +void printRtimeToScreen() { + char delim[] = ":"; + RTC.readTime(); + + display.setFont(&FreeSans18pt7b); + display.setTextColor(GxEPD_BLACK); + int16_t tbx, tby; uint16_t tbw, tbh; + display.getTextBounds(delim, 0, 0, &tbx, &tby, &tbw, &tbh); + uint16_t x = ((display.width() / 2) - tbw); + uint16_t y = ((32 - tbh) / 2) - tby; + display.getTextBounds("00", 0, 0, &tbx, &tby, &tbw, &tbh); + uint16_t x2 = (display.width() / 2) - 8 - tbw ; + display.getTextBounds("00", 0, 0, &tbx, &tby, &tbw, &tbh); + uint16_t x3 = (display.width() / 2) + 8; + + display.setPartialWindow(0, 0, display.width(), (display.height() - (display.height() - 32))); + + display.firstPage(); + do { + display.fillScreen(GxEPD_WHITE); + display.setCursor(x, y); + display.print(delim); + display.setCursor(x2, y); + if(RTC.h < 10) { + display.print("0"); + display.print(RTC.h); + } + else { + display.print(RTC.h); + } + display.setCursor(x3, y); + if(RTC.m < 10) { + display.print("0"); + display.print(RTC.m); + } + else { + display.print(RTC.m); + } + } + while(display.nextPage()); +} + +void printRtDateToScreen() { + + RTC.readTime(); + display.setFont(&FreeSansBold9pt7b); + display.setTextColor(GxEPD_BLACK); + int16_t tbx, tby; uint16_t tbw, tbh; + display.getTextBounds("00-00-0000", 0, 0, &tbx, &tby, &tbw, &tbh); + uint16_t x = (display.width() / 2) - tbw / 2; //orig 8 + uint16_t y = 48 + (tbh / 2); + + display.setPartialWindow(0, 33, display.width(), 31); + display.firstPage(); + do { + //display.fillScreen(GxEPD_WHITE); + display.setCursor(x, y); + display.print(RTC.dd); + display.print(" - "); + display.print(RTC.mm); + display.print(" - "); + display.print(RTC.yyyy); + } + while(display.nextPage()); +} + +void printTempToScreen() { + struct data *dtsp = &dataset; + display.setFont(&FreeSansBold9pt7b); + display.setTextColor(GxEPD_BLACK); + int16_t tbx, tby; uint16_t tbw, tbh; + display.getTextBounds("00.00", 0, 0, &tbx, &tby, &tbw, &tbh); + uint16_t x = ((64 - tbw) / 2 ) - tbx; + uint16_t y = ((96 - tbh) /*/ 2 */) - tby; + display.getTextBounds("00", 0, 0, &tbx, &tby, &tbw, &tbh); + uint16_t x2 = (96 - tbw); + display.getTextBounds("1488", 0, 0, &tbx, &tby, &tbw, &tbh); + uint16_t x3 = ((display.width() - tbw) / 2) - tbx; + uint16_t y3 = ((160 - tbh) /*/ 2*/) - tby; + + display.setPartialWindow(0, 65, 62, 63); + display.firstPage(); + do { + display.fillScreen(GxEPD_WHITE); + display.setCursor(x, y); + display.print(dtsp -> temp, 1); + display.print("C"); + } + while (display.nextPage()); + + display.setPartialWindow(66, 65, 62, 63); + display.firstPage(); + do { + display.fillScreen(GxEPD_WHITE); + display.setCursor(x2, y); + display.print(dtsp -> rhum); + display.print(" %"); + display.drawFastVLine(64, 64, 64, GxEPD_BLACK); + } + while(display.nextPage()); + + display.setPartialWindow(0, 129 ,display.width(), 63); + display.firstPage(); + do { + display.fillScreen(GxEPD_WHITE); + display.setCursor(x3, y3); + display.print(dtsp -> rpres); + display.print(" hPa"); + } + while(display.nextPage()); +} + +float measureTemp() { + +// BME280::TempUnit tempUnit(BME280::TempUnit_Celsius); + + int temps[6]; + + //light led while measuring + digitalWrite(13, HIGH); + + Serial.print("Measuring temperature..."); + + for(char i = 0; i <= 5; i++){ + temps[i] = bme.readTemperature() * 100; + delay(1000); + } + + float temp; + + temp = (temps[1] + temps[2] + temps[3] + temps[4] + temps[5]) / 5; + + Serial.print("done: "); + Serial.println(temp / 100); + + digitalWrite(13, LOW); + return temp / 100; +} + +float measureHum() { + float hums[6]; + + //light led while measuring + digitalWrite(13, HIGH); + + Serial.print("Measuring humidity..."); + + for(char i = 0; i <= 5; i++){ + hums[i] = bme.readHumidity(); + delay(1000); + } + + float hum; + + hum = (hums[1] + hums[2] + hums[3] + hums[4] + hums[5]) / 5; + + Serial.print("done: "); + Serial.println(hum); + + digitalWrite(13, LOW); + return hum; +} + +float measurePres() { +// BME280::PresUnit presUnit(BME280::PresUnit_hPa); + + float presss[6]; + + //light led while measuring + digitalWrite(13, HIGH); + + Serial.print("Measuring pressure..."); + + for(char i = 0; i <= 5; i++){ +// presss[i] = bme.pres(); + presss[i] = bme.readPressure() / 100.0F; + delay(1000); + } + + float pres; + + pres = (presss[1] + presss[2] + presss[3] + presss[4] + presss[5]) / 5; + + Serial.print("done: "); + Serial.println(pres); + + digitalWrite(13, LOW); + return pres; +} + +int sendDataToServer(){ + char payload[40]; + char stemp[8]; + char shum[8]; + dtostrf(dataset.temp, 5, 2, stemp); + dtostrf(dataset.hum, 5, 2, shum); + sprintf(payload, "%d-%d-%d %d:%d:%d,%s,%s,%d,%d", dataset.yr, dataset.mo, dataset.dy, dataset.hr, dataset.mn, dataset.s, stemp, shum, dataset.rpres, dataset.co2); + Serial2.print(payload); + Serial2.print('\n'); + delay(1000); + return(0); +}