From bb4d9d0bb6fa8c16ecf1f2fa5c2bc0a44c79678d Mon Sep 17 00:00:00 2001 From: Eric Date: Sun, 7 Jul 2019 23:47:39 -0700 Subject: [PATCH] Adding Esp32_temperature_humidity --- .../Esp32_temperature_humidity.ino | 326 ++++++++++++++++++ Esp32_temperature_humidity/data/humidity.jpg | Bin 0 -> 1313 bytes .../data/temperature.jpg | Bin 0 -> 1281 bytes 3 files changed, 326 insertions(+) create mode 100644 Esp32_temperature_humidity/Esp32_temperature_humidity.ino create mode 100644 Esp32_temperature_humidity/data/humidity.jpg create mode 100644 Esp32_temperature_humidity/data/temperature.jpg diff --git a/Esp32_temperature_humidity/Esp32_temperature_humidity.ino b/Esp32_temperature_humidity/Esp32_temperature_humidity.ino new file mode 100644 index 0000000..28a4ee3 --- /dev/null +++ b/Esp32_temperature_humidity/Esp32_temperature_humidity.ino @@ -0,0 +1,326 @@ +#include "SPIFFS.h" +#include + +#include +#include +#include +#include +#include + +#define DHTPIN 19 +#define DHTTYPE DHT11 + +DHT_Unified dht(DHTPIN, DHTTYPE); + +uint32_t delayMS; + +#define SCREEN_WIDTH 128 +#define SCREEN_HEIGHT 128 + +#define SCLK_PIN 18 +#define MOSI_PIN 23 +#define DC_PIN 17 +#define CS_PIN 5 +#define RST_PIN 4 + +// Color definitions +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +const String fileTemperature = "/temperature.jpg"; +const String fileHumidity = "/humidity.jpg"; + +Adafruit_SSD1351 tft = Adafruit_SSD1351(SCREEN_WIDTH, SCREEN_HEIGHT, CS_PIN, DC_PIN, MOSI_PIN, SCLK_PIN, RST_PIN); + +int prev_temp; +int prev_humidity; + + +void setup() { + Serial.begin(115200); + // Initialize device. + + tft.begin(); + tft.fillRect(0,0,128,128,WHITE); + + dht.begin(); + + // Print temperature sensor details. + sensor_t sensor; + dht.temperature().getSensor(&sensor); + + // Print humidity sensor details. + dht.humidity().getSensor(&sensor); + + // Set delay between sensor readings based on sensor details. + delayMS = sensor.min_delay / 1000; + + if(!SPIFFS.begin()){ + while(1) yield(); + } + + initScreen(); +} + +void initScreen(){ + drawFSJpeg(fileTemperature.c_str(), 0, 0); + drawFSJpeg(fileHumidity.c_str(), 0, 64); + + tft.setCursor(72, 24); + tft.setTextColor(BLACK); + tft.setTextSize(3); + tft.print("?"); + + tft.setCursor(72, 88); + tft.setTextColor(BLACK); + tft.setTextSize(3); + tft.print("?"); +} + +void loop() { + // Delay between measurements. + delay(delayMS); + // Get temperature event and print its value. + sensors_event_t event; + dht.temperature().getEvent(&event); + if (isnan(event.temperature)) { + Serial.println(F("Error reading temperature!")); + } + else { + Serial.print(F("Temperature: ")); + Serial.print(event.temperature); + Serial.println(F("°C")); + updateTemp((int)event.temperature); + } + // Get humidity event and print its value. + dht.humidity().getEvent(&event); + if (isnan(event.relative_humidity)) { + Serial.println(F("Error reading humidity!")); + } + else { + Serial.print(F("Humidity: ")); + Serial.print(event.relative_humidity); + Serial.println(F("%")); + updateHumidity((int)event.relative_humidity); + } +} + +void updateTemp(int temp){ + if(prev_temp != temp){ + tft.fillRect(64, 0, 128, 64, WHITE); + tft.setCursor(70, 24); + tft.setTextColor(BLACK); + tft.setTextSize(3); + String tempString = ""; + tempString += temp; + tempString += "C"; + tft.print(tempString); + prev_temp = temp; + } +} + +void updateHumidity(int humidity){ + if(prev_humidity != humidity){ + tft.fillRect(64, 64, 128, 128, WHITE); + tft.setCursor(70, 88); + tft.setTextColor(BLACK); + tft.setTextSize(3); + String humidityString = ""; + humidityString += humidity; + humidityString += "%"; + tft.print(humidityString); + prev_humidity = humidity; + } +} + +/*==================================================================================== + This sketch contains support functions to render the Jpeg images. + + Created by Bodmer 15th Jan 2017 + ==================================================================================*/ + +// Return the minimum of two values a and b +#define minimum(a,b) (((a) < (b)) ? (a) : (b)) + +//==================================================================================== +// This function opens the Filing System Jpeg image file and primes the decoder +//==================================================================================== +void drawFSJpeg(const char *filename, int xpos, int ypos) { + + Serial.println("====================================="); + Serial.print("Drawing file: "); Serial.println(filename); + Serial.println("====================================="); + + // Open the file (the Jpeg decoder library will close it) + fs::File jpgFile = SPIFFS.open( filename, "r"); // File handle reference for SPIFFS + // File jpgFile = SD.open( filename, FILE_READ); // or, file handle reference for SD library + + if ( !jpgFile ) { + Serial.print("ERROR: File \""); Serial.print(filename); Serial.println ("\" not found!"); + return; + } + + // To initialise the decoder and provide the file, we can use one of the three following methods: + //boolean decoded = JpegDec.decodeFsFile(jpgFile); // We can pass the SPIFFS file handle to the decoder, + //boolean decoded = JpegDec.decodeSdFile(jpgFile); // or we can pass the SD file handle to the decoder, + boolean decoded = JpegDec.decodeFsFile(filename); // or we can pass the filename (leading / distinguishes SPIFFS files) + // The filename can be a String or character array + if (decoded) { + // print information about the image to the serial port + jpegInfo(); + + // render the image onto the screen at given coordinates + jpegRender(xpos, ypos); + } + else { + Serial.println("Jpeg file format not supported!"); + } +} + +//==================================================================================== +// Decode and paint onto the TFT screen +//==================================================================================== +void jpegRender(int xpos, int ypos) { + + // retrieve infomration about the image + uint16_t *pImg; + uint16_t mcu_w = JpegDec.MCUWidth; + uint16_t mcu_h = JpegDec.MCUHeight; + uint32_t max_x = JpegDec.width; + uint32_t max_y = JpegDec.height; + + // Jpeg images are draw as a set of image block (tiles) called Minimum Coding Units (MCUs) + // Typically these MCUs are 16x16 pixel blocks + // Determine the width and height of the right and bottom edge image blocks + uint32_t min_w = minimum(mcu_w, max_x % mcu_w); + uint32_t min_h = minimum(mcu_h, max_y % mcu_h); + + // save the current image block size + uint32_t win_w = mcu_w; + uint32_t win_h = mcu_h; + + // record the current time so we can measure how long it takes to draw an image + uint32_t drawTime = millis(); + + // save the coordinate of the right and bottom edges to assist image cropping + // to the screen size + max_x += xpos; + max_y += ypos; + + // read each MCU block until there are no more + while ( JpegDec.read()) { + + // save a pointer to the image block + pImg = JpegDec.pImage; + + // calculate where the image block should be drawn on the screen + int mcu_x = JpegDec.MCUx * mcu_w + xpos; + int mcu_y = JpegDec.MCUy * mcu_h + ypos; + + // check if the image block size needs to be changed for the right edge + if (mcu_x + mcu_w <= max_x) win_w = mcu_w; + else win_w = min_w; + + // check if the image block size needs to be changed for the bottom edge + if (mcu_y + mcu_h <= max_y) win_h = mcu_h; + else win_h = min_h; + + // copy pixels into a contiguous block + if (win_w != mcu_w) + { + for (int h = 1; h < win_h-1; h++) + { + memcpy(pImg + h * win_w, pImg + (h + 1) * mcu_w, win_w << 1); + } + } + + + // draw image MCU block only if it will fit on the screen + if ( ( mcu_x + win_w) <= tft.width() && ( mcu_y + win_h) <= tft.height()) + { + tft.drawRGBBitmap(mcu_x, mcu_y, pImg, win_w, win_h); + } + + // Stop drawing blocks if the bottom of the screen has been reached, + // the abort function will close the file + else if ( ( mcu_y + win_h) >= tft.height()) JpegDec.abort(); + + } + + // calculate how long it took to draw the image + drawTime = millis() - drawTime; + + // print the results to the serial port + Serial.print ("Total render time was : "); Serial.print(drawTime); Serial.println(" ms"); + Serial.println("====================================="); + +} + +//==================================================================================== +// Send time taken to Serial port +//==================================================================================== +void jpegInfo() { + Serial.println(F("===============")); + Serial.println(F("JPEG image info")); + Serial.println(F("===============")); + Serial.print(F( "Width :")); Serial.println(JpegDec.width); + Serial.print(F( "Height :")); Serial.println(JpegDec.height); + Serial.print(F( "Components :")); Serial.println(JpegDec.comps); + Serial.print(F( "MCU / row :")); Serial.println(JpegDec.MCUSPerRow); + Serial.print(F( "MCU / col :")); Serial.println(JpegDec.MCUSPerCol); + Serial.print(F( "Scan type :")); Serial.println(JpegDec.scanType); + Serial.print(F( "MCU width :")); Serial.println(JpegDec.MCUWidth); + Serial.print(F( "MCU height :")); Serial.println(JpegDec.MCUHeight); + Serial.println(F("===============")); +} + +//==================================================================================== +// Open a Jpeg file and dump it to the Serial port as a C array +//==================================================================================== +void createArray(const char *filename) { + + fs::File jpgFile; // File handle reference for SPIFFS + // File jpgFile; // File handle reference For SD library + + if ( !( jpgFile = SPIFFS.open( filename, "r"))) { + Serial.println(F("JPEG file not found")); + return; + } + + uint8_t data; + byte line_len = 0; + Serial.println("// Generated by a JPEGDecoder library example sketch:"); + Serial.println("// https://github.com/Bodmer/JPEGDecoder"); + Serial.println(""); + Serial.println("#if defined(__AVR__)"); + Serial.println(" #include "); + Serial.println("#endif"); + Serial.println(""); + Serial.print("const uint8_t "); + while (*filename != '.') Serial.print(*filename++); + Serial.println("[] PROGMEM = {"); // PROGMEM added for AVR processors, it is ignored by Due + + while ( jpgFile.available()) { + + data = jpgFile.read(); + Serial.print("0x"); if (abs(data) < 16) Serial.print("0"); + Serial.print(data, HEX); Serial.print(",");// Add value and comma + line_len++; + if ( line_len >= 32) { + line_len = 0; + Serial.println(); + } + + } + + Serial.println("};\r\n"); + // jpgFile.seek( 0, SeekEnd); + jpgFile.close(); +} +//==================================================================================== diff --git a/Esp32_temperature_humidity/data/humidity.jpg b/Esp32_temperature_humidity/data/humidity.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1e856ebfc472357011bf87ac4aca9e0b2c390201 GIT binary patch literal 1313 zcmex=W3kC&HER#Z$- zLRnr_MM+*sQBB)iUrp0QQ&Gvl(a^-w+Rn~SRnNuK*~Y`%*3KGa2qPCaHyP)J14kWE<0u~AgnC@`pSqL@>nO7g~oCe9aux+H<70gZ$k z2sDF%nUx7-n~ER<6B8o~Bg{CU8b&5TW)>kuLq}nyz=uXb2mjw<;9+J2I*?hA!Jgr_ ziN{1Gfe$VWEG`+0+_yE&gHkFRv=;We9(6fzcp>is_6M3$WiwySKE0uX|5aSyQ-e>8 zANd{rB{+I{@*JFeDCG_Z?{s;kPX=GRlexQ7w(R&RqvSs8_{KoS{&?RBMJcyV7J4$U ziXIi2`ohpjc>CWKSG!-j35(XY9})HE2q|J{>bo49cHDP!kJU0h(H!R67fM?%Z>_tX zrSjwDG_$vV=N=5++-z&QE?)3X=HjJ38GRxF9m`Th3`ANO4STE@SjxGoqfM+<3kBUY z){>MxA&@z3LDZ*p`vspUJ$Whf@ky^=<(h+@yOs+0&EB>|e#^Y|g}r?OzL$#^tO#l6 z;&7PcFY2&>`_vUrrB1knc&y^yTiuIp zyfVx02w8Y&>I3gxeG_(-``>x%GGA8rVD$dY`?aQjNMAPP^fQ&J-#W28es?C$Hl4Hb zp+{5Up9_krv$Q35&eJj1dUE@6|Go*Qw}#i6e7l>=-`%u<_nJ1(JpSTbi|tb{Pt_EE zIW?Mf)gO_%`qsi3Z#wsiP6%{+)wj&!%K9B{GbTKn{N_y0Q})8N|{4vdf8dalv_9M zy*0g-Q*ztl@T!D|VFzsYvPZ;Phrivn$iHu9a^C%$cSNl%j4ww${V4rhs8aCzX3bfm z3s_&p)fzFJSp4=BZ-olGTcgnq@EH9V{{NX5WpTTcAG5L!2wyx&#m8}eqWYqaR7vG6Av#ZiL z$@_7=(sM38$B7KjH(Iycx?mY*<>|Dx>`mT=L%{(i0^K2HPdjcKC2UgT4N=VZscH%6 zxfJJU86_I(v+&3>t;`uNK31=#xRn;$MOFS=cbZ){IqkHWcrfd;CfSSJJ6&ocuN?mC z>ic9e=b`OZK4&63o(0N%b@;UWHgAW*@Li4@dw2 literal 0 HcmV?d00001 diff --git a/Esp32_temperature_humidity/data/temperature.jpg b/Esp32_temperature_humidity/data/temperature.jpg new file mode 100644 index 0000000000000000000000000000000000000000..af63a330ecc5e59d9f130e1ad2a48d0a3b011f49 GIT binary patch literal 1281 zcmex=W3kC&HER#Z$- zLRnr_MM+*sQBB)iUrp0QQ&Gvl(a^-w+Rn~SRnNuK*~Y`%*3KGa2qPCaHy1Ny#WMY{{mJ&cTfn7bb#?19}_;5XJ$GXJTOm zN~sGnFflT*GO@!Y8JQTE1%(t19Y3%HDk&Q!7B((C`2Q9I4>KdseawOk_6*;$Uac(H z<+RQ8%uGey=PB=&R`Q+|n}2k2>Qk|Azm(&5JveoK!i^xd&r6+dxeC9Vu(r2Y&BMF$ zruE7==VG_Ck0md)F6X5h&XQm8;ndVWIoh1l=FZmmQg(N?%KXfuGLO%?XWeT*lzMR8 zbA>hkE~|6Or5AfDmOj67LuuX4lMf1~%`q=ap8oKBhEVe}bCGE_ZK+0beXnG5qcz!; zTF*Y5Inii`UdgiknTK2Zl{c=LaegmbpkZ7YPvd(tH{)lMZ)BZ#uIw9q+174X*MY~n z5_xZq>mQzXL6!YXo~E{t zQe_6Y`}|q!4?Xm)D0=qY`1quYhuml0xwc)RJT86ld*AqlHySu*v0LOSC$=S8n&pwe ztb0+?!h80n&oAoRX|UKig}-C+V@ZYXNc%OTJ*}RuWZh`$?;jt zMH8;)NF*hkzRo739B7xT|(2^zh|re}s7x6*UhZJnJw=cH5gpXUzKC=9CFG zJM}0`wrh9xdl$Xs!ba!qK08ljRVVsssQNH1RkvUdGpMf7+*`SA>QRout&_Ih@tXak zdG5+1JGYyqXbP^CRbAL)c`2ypKLgvWhOKMTV!cFH&ii@7V)gE#z4BF=s$7pax4W;I zBt1F(#amgcIWINi=4Vv!{;t+ss}NcF)+XQ3;_$A|w(?b3e*^d2Opk3|)4g3yxzRFt z@zUso-#6I{XZ5dKUvF3|WN&Kph#^j)LG}5}JZJ6HE3ce8H3RGvF8q`+ENc5GaA~H` z{Bmv10Qv8>Q@UX~?)p~$?0zxv=gN?EkH2O5ZCsYOEH$bk&)q98^th9=dyu5(`K=$- zCSS`Bj{BGNOQkM**R1cK#V;y+i{zh(LahZ{v*1J3F-S5rvbXWaw_fkpfvB~w< vE`3~S%d2c*`N3W=>e`FTi&YPrJ-+PKaj8->-~V{->jgU7_MGi7{(lnyo^}$% literal 0 HcmV?d00001