// Import required libraries #include "ESP_Base64.h" #include "ESP8266WiFi.h" #include #include #include #include #include "weatherCalcs.h" #include #include "ESP_httplib.h" #include #include #include "FS.h" ESP8266HTTPUpdateServer httpUpdater; #define QUOTE(name) #name #define STR(macro) QUOTE(macro) ESP_httplib esp = ESP_httplib(); #define VERSION "1.0" // #define BUILD "" //////////////////////////////////////////////////////////////////////////////////////////////// //////////// DEVICE SPECIFIC HEADERS AND DECLARATIONS ////////////////////////////////////////// #ifdef MCP #include "Adafruit_MCP9808.h" Adafruit_MCP9808 mcp = Adafruit_MCP9808(); #endif #ifdef HTU #include "Adafruit_HTU21DF.h" Adafruit_HTU21DF htu = Adafruit_HTU21DF(); #endif #ifdef MPL #include Adafruit_MPL3115A2 mpl = Adafruit_MPL3115A2(); #endif #ifdef INA #include Adafruit_INA219 ina219(0x44); #endif #ifdef MLX #include Adafruit_MLX90614 mlx = Adafruit_MLX90614(); #endif #ifdef SI #include "Adafruit_SI1145.h" Adafruit_SI1145 si = Adafruit_SI1145(); #endif #ifdef TMP #include "Adafruit_TMP007.h" Adafruit_TMP007 tmp(0x43); // SCL to AD0 #endif #ifdef TSL #include "Adafruit_TSL2591.h" Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591); void configureSensor(tsl2591Gain_t gainSetting, tsl2591IntegrationTime_t timeSetting); float advancedLightSensorRead(void); #endif #ifdef SSD #include #define OLED_RESET 15 // #include // Adafruit_SSD1306 display(OLED_RESET); #include // Modification of Adafruit_SSD1306 for ESP8266 compatibility ESP_SSD1306 display(OLED_RESET); // FOR I2C #endif // #include "Adafruit_LSM9DS0.h" #ifdef BMP #include "Adafruit_BMP183.h" #define BMP183_CLK 12 // CLOCK #define BMP183_SDO 13 // AKA MISO #define BMP183_SDI 14 // AKA MOSI #define BMP183_CS 15 // CHIP SELECT Adafruit_BMP183 bmp = Adafruit_BMP183(BMP183_CLK, BMP183_SDO, BMP183_SDI, BMP183_CS); #endif #ifdef LED #ifndef SSD #include "Adafruit_LEDBackpack.h" #endif #include "Adafruit_GFX.h" void write4Digit(Adafruit_AlphaNum4 alpha, float num); Adafruit_AlphaNum4 alpha4 = Adafruit_AlphaNum4(); #endif // Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0(); //////////////////////////////////////////////////////////////////////////////////////////////// float tLast = millis(); unsigned long int tBegin = millis(); float uptime = 0.0; // WiFi parameters const char* ssid = "WIFIAP"; const char* password = "PASSWORD"; ESP8266WebServer server(80); boolean ledOn=true; WiFiUDP Udp; int udpPort = 9990; // udp port String udpIP = "XX.XX.XX.XX"; // app server ip address float udpFRQ = 5.; // update frequency int rssi; String dpTemp="mcp"; boolean hasMCP=false, hasHTU=false, hasBMP=false, hasTMP=false, hasMPL=false, hasALPHNUM=false, hasSI=false, hasTSL=false, hasMLX=false, hasINA=false; static boolean hasLSM=false; float f,hum,htuT,dp,hi; float bp, bmpT; float mplbp,mplT,mplAlt; float Vshunt, Vbus, Ima, Vload; float uvI; float objT,dieT; float brightness; Settings settings; DataSet dataset; void readSensors(void){ #ifdef MCP f=mcp.readTempC() * 1.8 + 32.0; #endif #ifdef HTU hum=htu.readHumidity(); htuT=htu.readTemperature() * 1.8 + 32.0; #endif #ifdef TMP objT=tmp.readObjTempC() * 1.8 + 32.0; dieT=tmp.readDieTempC() * 1.8 + 32.0; #endif #ifdef BMP bmpT=bmp.getTemperature() * 1.8 + 32.0; bp=bmp.getPressure() * 0.0002953; float alt = 290.; bp = meanSeaLevelPressure(bp, bmpT, alt); #endif #ifdef INA Vshunt = ina219.getShuntVoltage_mV(); Vbus = ina219.getBusVoltage_V(); Ima = ina219.getCurrent_mA(); Vload = Vbus + (Vshunt / 1000.); hasINA=true; #endif #ifdef MPL mplbp = mpl.getPressure() * 0.0002953; mplT = mpl.getTemperature() * 1.8 + 32.; mplAlt = mpl.getAltitude(); float alt = 292.0; mplbp = meanSeaLevelPressure(mplbp, mplT, alt); #endif #ifdef SI uvI = si.readUV(); uvI /= 100.0; #endif #ifdef TSL brightness = advancedLightSensorRead(); #endif #ifdef MLX dieT=mlx.readAmbientTempF(); objT=mlx.readObjectTempF(); #endif if (dpTemp=="mcp"){ dp=dewPoint(f,hum); hi=heatIndex(f,hum); } else if (dpTemp=="htu"){ dp=dewPoint(htuT,hum); hi=heatIndex(htuT,hum); } rssi = WiFi.RSSI(); uptime = 0.001 * (millis() - tBegin); dataset.nData=0; // #ifdef MCP if (hasMCP){ dataset.data[dataset.nData].value=f; dataset.data[dataset.nData].name="Temperature"; dataset.data[dataset.nData].unit="°F"; dataset.data[dataset.nData].ul2 = 80.; dataset.data[dataset.nData].ul1 = 75.; dataset.data[dataset.nData].ll1 = 70.; dataset.data[dataset.nData].ll2 = 65.; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; } // #endif // #ifdef HTU if (hasHTU){ dataset.data[dataset.nData].value=htuT; dataset.data[dataset.nData].name="HTU Temp"; dataset.data[dataset.nData].unit="°F"; dataset.data[dataset.nData].ul2 = 80.; dataset.data[dataset.nData].ul1 = 75.; dataset.data[dataset.nData].ll1 = 70.; dataset.data[dataset.nData].ll2 = 65.; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; dataset.data[dataset.nData].value=hum; dataset.data[dataset.nData].name="Humidity"; dataset.data[dataset.nData].unit="%"; dataset.data[dataset.nData].ul2 = 80.; dataset.data[dataset.nData].ul1 = 60.; dataset.data[dataset.nData].ll1 = 40.; dataset.data[dataset.nData].ll2 = 20.; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; dataset.data[dataset.nData].value=dp; dataset.data[dataset.nData].name="Dewpoint"; dataset.data[dataset.nData].unit="°F"; dataset.data[dataset.nData].ul2 = 65.; dataset.data[dataset.nData].ul1 = 60.; dataset.data[dataset.nData].ll1 = 45.; dataset.data[dataset.nData].ll2 = 30.; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; dataset.data[dataset.nData].value=hi; dataset.data[dataset.nData].name="Heat Index"; dataset.data[dataset.nData].unit="°F"; dataset.data[dataset.nData].ul2 = 90.; dataset.data[dataset.nData].ul1 = 80.; dataset.data[dataset.nData].ll1 = 75.; dataset.data[dataset.nData].ll2 = -100.; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; } // #endif // #ifdef BMP if (hasBMP){ dataset.data[dataset.nData].value=bp; dataset.data[dataset.nData].name="Pressure"; dataset.data[dataset.nData].unit="in-Hg"; dataset.data[dataset.nData].ul2 = 30.25; dataset.data[dataset.nData].ul1 = 30.; dataset.data[dataset.nData].ll1 = 29.75; dataset.data[dataset.nData].ll2 = 29.5; dataset.data[dataset.nData].invertLimits = true; dataset.nData++; dataset.data[dataset.nData].value=bmpT; dataset.data[dataset.nData].name="Pressure Temp"; dataset.data[dataset.nData].unit="°F"; dataset.data[dataset.nData].ul2 = 80.; dataset.data[dataset.nData].ul1 = 75.; dataset.data[dataset.nData].ll1 = 70.; dataset.data[dataset.nData].ll2 = 65.; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; } if (hasMPL){ dataset.data[dataset.nData].value=mplbp; dataset.data[dataset.nData].name="Pressure"; dataset.data[dataset.nData].unit="in-Hg"; dataset.data[dataset.nData].ul2 = 30.25; dataset.data[dataset.nData].ul1 = 30.; dataset.data[dataset.nData].ll1 = 29.75; dataset.data[dataset.nData].ll2 = 29.5; dataset.data[dataset.nData].invertLimits = true; dataset.nData++; dataset.data[dataset.nData].value=mplT; dataset.data[dataset.nData].name="Pressure Temp"; dataset.data[dataset.nData].unit="°F"; dataset.data[dataset.nData].ul2 = 80.; dataset.data[dataset.nData].ul1 = 75.; dataset.data[dataset.nData].ll1 = 70.; dataset.data[dataset.nData].ll2 = 65.; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; } if (hasINA){ dataset.data[dataset.nData].value=Vload; dataset.data[dataset.nData].name="Load"; dataset.data[dataset.nData].unit="V"; dataset.data[dataset.nData].ul2 = 5.5; dataset.data[dataset.nData].ul1 = 5.0; dataset.data[dataset.nData].ll1 = 3.4; dataset.data[dataset.nData].ll2 = 3.2; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; dataset.data[dataset.nData].value=Ima; dataset.data[dataset.nData].name="Current"; dataset.data[dataset.nData].unit="mA"; dataset.data[dataset.nData].ul2 = 200; dataset.data[dataset.nData].ul1 = 100; dataset.data[dataset.nData].ll1 = 50; dataset.data[dataset.nData].ll2 = 30; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; } // #endif // #ifdef SI if (hasSI){ dataset.data[dataset.nData].value=uvI; dataset.data[dataset.nData].name="UV Index"; dataset.data[dataset.nData].unit=""; dataset.data[dataset.nData].ul2 = 8.0; dataset.data[dataset.nData].ul1 = 6.5; dataset.data[dataset.nData].ll1 = 5.0; dataset.data[dataset.nData].ll2 = 3.0; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; } // #endif // #ifdef TMP if (hasTMP){ dataset.data[dataset.nData].value=objT; dataset.data[dataset.nData].name="IR Temp"; dataset.data[dataset.nData].unit="°F"; dataset.data[dataset.nData].ul2 = 80.; dataset.data[dataset.nData].ul1 = 75.; dataset.data[dataset.nData].ll1 = 70.; dataset.data[dataset.nData].ll2 = 65.; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; dataset.data[dataset.nData].value=dieT; dataset.data[dataset.nData].name="TMP Temp"; dataset.data[dataset.nData].unit="°F"; dataset.data[dataset.nData].ul2 = 80.; dataset.data[dataset.nData].ul1 = 75.; dataset.data[dataset.nData].ll1 = 70.; dataset.data[dataset.nData].ll2 = 65.; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; dataset.data[dataset.nData].value=dieT - objT; dataset.data[dataset.nData].name="IR dT"; dataset.data[dataset.nData].unit="°F"; dataset.data[dataset.nData].ul2 = 25.; dataset.data[dataset.nData].ul1 = 20.; dataset.data[dataset.nData].ll1 = 15.; dataset.data[dataset.nData].ll2 = 10.; dataset.data[dataset.nData].invertLimits = true; dataset.nData++; } if (hasMLX){ dataset.data[dataset.nData].value=objT; dataset.data[dataset.nData].name="IR Temp"; dataset.data[dataset.nData].unit="°F"; dataset.data[dataset.nData].ul2 = 80.; dataset.data[dataset.nData].ul1 = 75.; dataset.data[dataset.nData].ll1 = 70.; dataset.data[dataset.nData].ll2 = 65.; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; dataset.data[dataset.nData].value=dieT; dataset.data[dataset.nData].name="MLX Temp"; dataset.data[dataset.nData].unit="°F"; dataset.data[dataset.nData].ul2 = 80.; dataset.data[dataset.nData].ul1 = 75.; dataset.data[dataset.nData].ll1 = 70.; dataset.data[dataset.nData].ll2 = 65.; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; dataset.data[dataset.nData].value=dieT - objT; dataset.data[dataset.nData].name="IR dT"; dataset.data[dataset.nData].unit="°F"; dataset.data[dataset.nData].ul2 = 25.; dataset.data[dataset.nData].ul1 = 20.; dataset.data[dataset.nData].ll1 = 15.; dataset.data[dataset.nData].ll2 = 10.; dataset.data[dataset.nData].invertLimits = true; dataset.nData++; } // #endif // #ifdef TSL if (hasTSL){ dataset.data[dataset.nData].value=brightness; dataset.data[dataset.nData].name="Brightness"; dataset.data[dataset.nData].unit="lux"; dataset.data[dataset.nData].ul2 = 100000.; dataset.data[dataset.nData].ul1 = 10000.; dataset.data[dataset.nData].ll1 = 1000.; dataset.data[dataset.nData].ll2 = 100.; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; } // #endif dataset.data[dataset.nData].value=uptime; dataset.data[dataset.nData].name="uptime"; dataset.data[dataset.nData].unit="s"; dataset.data[dataset.nData].ul2 = 80.; dataset.data[dataset.nData].ul1 = 75.; dataset.data[dataset.nData].ll1 = 70.; dataset.data[dataset.nData].ll2 = 65.; dataset.data[dataset.nData].invertLimits = false; dataset.nData++; dataset.data[dataset.nData].value=rssi; dataset.data[dataset.nData].name="RSSI"; dataset.data[dataset.nData].unit="dBm"; dataset.data[dataset.nData].ul2 = -20.; dataset.data[dataset.nData].ul1 = -40.; dataset.data[dataset.nData].ll1 = -60.; dataset.data[dataset.nData].ll2 = -70.; dataset.data[dataset.nData].invertLimits = true; dataset.nData++; } void udpSendPacket(void); //////////////////////////////////////////////////////////////////////// // Webserver handling //////////////////////////////////////////////////////////////////////// void handle_root() { Settings settings; settings.udpFRQ=udpFRQ; settings.udpIP=udpIP; settings.udpPort=udpPort; esp.http.settings = settings; esp.http.updatePage(dataset, esp.packet); server.send(200, "text/html", esp.http.page()); } void handle_post(){ esp.formPacket(dataset); // server.send(200, "application/json", esp.packet); // send to someones browser when asked server.send(200, "text/html", ""); // send to someones browser when asked Serial.println("Sent packet for temp"); for (uint8_t i=0; i"); // send to someones browser when asked Serial.println("Reset requested"); esp.triggerReset(); } void handle_ledOff(){ ledOn=false; server.send(200, "text/html", ""); } void handle_ledOn(){ ledOn=true; server.send(200, "text/html", ""); } void handle_spiffs(){ SPIFFS.begin(); File f = SPIFFS.open("/test.html", "r"); if (!f) { Serial.println("file open failed"); } else{ // Serial.println(f.readString()); server.send(200, "text/html", f.readString()); } } //////////////////////////////////////////////////////////////////////// // Setup //////////////////////////////////////////////////////////////////////// void setup(void) { Wire.begin(); Wire.pins(4, 0); // Start Serial Serial.begin(115200); esp.begin(ssid, password); // esp.http.begin(); esp.http.stationName = STR(NAME);//"Development Server"; esp.http.version = VERSION; esp.http.begin(); esp.http.updatePage(dataset, esp.packet); #ifdef SSD display.begin(SSD1306_SWITCHCAPVCC, 0x3D); // initialize with the I2C addr 0x3D (for the 128x64) display.setTextSize(0); display.setTextColor(WHITE); int line = 0; // delay(2000); #endif server.on("/", handle_root); server.on("/data", handle_data); server.on("/post", handle_post); server.on("/reset", handle_reset); server.on("/ledOff", handle_ledOff); server.on("/ledOn", handle_ledOn); server.on("/spiffs", handle_spiffs); httpUpdater.setup(&server); server.begin(); Serial.println("HTTP server started"); // MDNS.addService("http", "tcp", 80); // if (!MDNS.begin("snazzy")) { // Serial.println("Error setting up MDNS responder!"); // while(1) { // delay(1000); // } // } // Serial.println("mDNS responder started"); #ifdef MCP if (mcp.begin()) { Serial.println("Found MCP sensor"); hasMCP=true; } #endif #ifdef HTU if (htu.begin()) { Serial.println("Found HTU sensor"); hasHTU=true; } #endif #ifdef BMP if (bmp.begin()) { Serial.println("Found BMP sensor"); hasBMP=true; } #endif #ifdef TMP if (tmp.begin()) { Serial.println("Found TMP sensor"); hasTMP=true; } #endif #ifdef MLX Serial.println("MLX sensor requested"); mlx.begin(); hasMLX=true; #endif #ifdef SI Serial.println("SI requested"); if (si.begin()) { Serial.println("Found SI sensor"); hasSI=true; } hasSI=true; #endif #ifdef TSL if (tsl.begin()) { Serial.println("Found TSL sensor"); configureSensor(TSL2591_GAIN_LOW, TSL2591_INTEGRATIONTIME_100MS); hasTSL=true; } #endif #ifdef INA Serial.println("INA sensor requested"); ina219.begin(); hasINA=true; #endif #ifdef MPL if (mpl.begin()) { Serial.println("Found MPL sensor"); hasMPL=true; } #endif #ifdef LED alpha4.begin(0x70); // pass in the address #endif Serial.println("Finished uploading sensors"); // // Hostname defaults to esp8266-[ChipID] ArduinoOTA.setHostname("snazz-face"); ArduinoOTA.setPassword((const char *)"insecure"); ArduinoOTA.onStart([]() { Serial.println("Start"); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("End Failed"); }); ArduinoOTA.begin(); Serial.println("Ready"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // String str = ""; // Dir dir = SPIFFS.openDir("/"); // while (dir.next()) { // str += dir.fileName(); // str += " / "; // str += dir.fileSize(); // str += "\r\n"; // } // Serial.print(str); } void udpSendPacket(void){ if (millis() - tLast > int(1000*udpFRQ)){ Udp.beginPacket(udpIP.c_str(),udpPort); esp.formPacket(dataset); Udp.print(esp.packet); // Serial.println(esp.packet); tLast=millis(); Udp.endPacket(); if (ledOn) { esp.triggerActivityLED(); } #ifdef SSD display.clearDisplay(); display.setCursor(0,0); display.print(esp.http.stationName); display.setCursor(0,8); display.print("Version: "); display.print(VERSION); display.setCursor(0,16); display.print("RSSI: "); display.print(rssi); display.setCursor(0,24); display.print("IP: "); display.print(esp.stationIP); for (int i=0; i < dataset.nData; i++){ display.setCursor(0,32+8*i); display.print(dataset.data[i].name + " = "); display.print(dataset.data[i].value); // display.print(dataset.data[i].unit); } display.display(); // display.setTextSize(1); // display.setTextColor(WHITE); // display.setCursor(0,0); // display.println("Hello, world!"); // display.setTextColor(BLACK, WHITE); // 'inverted' text // display.println(3.141592); // display.setTextSize(2); // display.setTextColor(WHITE); // display.print("0x"); display.println(0xDEADBEEF, HEX); // display.display(); // delay(2000); #endif } } float toggleTime=millis(); float lastTime = toggleTime; int count=0, toggle=0; void loop() { ArduinoOTA.handle(); server.handleClient(); readSensors(); udpSendPacket(); #ifdef LED count++; if(millis() - toggleTime > 2*1000){ toggleTime=millis(); toggle++; } if(millis() - lastTime > 250){ lastTime = millis(); if(toggle % 2 == 0){ alpha4.setBrightness(15); write4Digit(alpha4,dataset.data[0].value); } else{ alpha4.setBrightness(3); write4Digit(alpha4,dataset.data[3].value); } } #endif } #ifdef LED static const uint16_t alphafonttable[] PROGMEM = { 0b0000000000000001, 0b0000000000000010, 0b0000000000000100, 0b0000000000001000, 0b0000000000010000, 0b0000000000100000, 0b0000000001000000, 0b0000000010000000, 0b0000000100000000, 0b0000001000000000, 0b0000010000000000, 0b0000100000000000, 0b0001000000000000, 0b0010000000000000, 0b0100000000000000, 0b1000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0001001011001001, 0b0001010111000000, 0b0001001011111001, 0b0000000011100011, 0b0000010100110000, 0b0001001011001000, 0b0011101000000000, 0b0001011100000000, 0b0000000000000000, // 0b0000000000000110, // ! 0b0000001000100000, // " 0b0001001011001110, // # 0b0001001011101101, // $ 0b0000110000100100, // % 0b0010001101011101, // & 0b0000010000000000, // ' 0b0010010000000000, // ( 0b0000100100000000, // ) 0b0011111111000000, // * 0b0001001011000000, // + 0b0000100000000000, // , 0b0000000011000000, // - 0b0000000000000000, // . 0b0000110000000000, // / 0b0000110000111111, // 0 0b0000000000000110, // 1 0b0000000011011011, // 2 0b0000000010001111, // 3 0b0000000011100110, // 4 0b0010000001101001, // 5 0b0000000011111101, // 6 0b0000000000000111, // 7 0b0000000011111111, // 8 0b0000000011101111, // 9 0b0001001000000000, // : 0b0000101000000000, // ; 0b0010010000000000, // < 0b0000000011001000, // = 0b0000100100000000, // > 0b0001000010000011, // ? 0b0000001010111011, // @ 0b0000000011110111, // A 0b0001001010001111, // B 0b0000000000111001, // C 0b0001001000001111, // D 0b0000000011111001, // E 0b0000000001110001, // F 0b0000000010111101, // G 0b0000000011110110, // H 0b0001001000000000, // I 0b0000000000011110, // J 0b0010010001110000, // K 0b0000000000111000, // L 0b0000010100110110, // M 0b0010000100110110, // N 0b0000000000111111, // O 0b0000000011110011, // P 0b0010000000111111, // Q 0b0010000011110011, // R 0b0000000011101101, // S 0b0001001000000001, // T 0b0000000000111110, // U 0b0000110000110000, // V 0b0010100000110110, // W 0b0010110100000000, // X 0b0001010100000000, // Y 0b0000110000001001, // Z 0b0000000000111001, // [ 0b0010000100000000, // 0b0000000000001111, // ] 0b0000110000000011, // ^ 0b0000000000001000, // _ 0b0000000100000000, // ` 0b0001000001011000, // a 0b0010000001111000, // b 0b0000000011011000, // c 0b0000100010001110, // d 0b0000100001011000, // e 0b0000000001110001, // f 0b0000010010001110, // g 0b0001000001110000, // h 0b0001000000000000, // i 0b0000000000001110, // j 0b0011011000000000, // k 0b0000000000110000, // l 0b0001000011010100, // m 0b0001000001010000, // n 0b0000000011011100, // o 0b0000000101110000, // p 0b0000010010000110, // q 0b0000000001010000, // r 0b0010000010001000, // s 0b0000000001111000, // t 0b0000000000011100, // u 0b0010000000000100, // v 0b0010100000010100, // w 0b0010100011000000, // x 0b0010000000001100, // y 0b0000100001001000, // z 0b0000100101001001, // { 0b0001001000000000, // | 0b0010010010001001, // } 0b0000010100100000, // ~ 0b0011111111111111, }; void write4Digit(Adafruit_AlphaNum4 alpha, float num){ int digit,indx; int lognumIndx = int(log10(num)); for (indx=3; indx>=0; indx--){ int digit = int(num * pow(10.0,-lognumIndx+indx)) % 10; char buff[1]; itoa(digit,buff,10); // Serial.print(indx); // Serial.print( buff[0]); // Serial.println(); alpha.writeDigitAscii(indx,buff[0]); if (indx == lognumIndx) { alpha.writeDigitRaw(indx,0x4000+pgm_read_word(alphafonttable+buff[0])); } } // Serial.println(); alpha4.clear(); alpha.writeDisplay(); } #endif #ifdef TSL void configureSensor(tsl2591Gain_t gainSetting, tsl2591IntegrationTime_t timeSetting) { // You can change the gain on the fly, to adapt to brighter/dimmer light situations tsl.setGain(gainSetting); //tsl.setGain(TSL2591_GAIN_LOW); // 1x gain (bright light) //tsl.setGain(TSL2591_GAIN_MED); // 25x gain //tsl.setGain(TSL2591_GAIN_HIGH); // 428x gain // Changing the integration time gives you a longer time over which to sense light // longer timelines are slower, but are good in very low light situtations! tsl.setTiming(timeSetting); //tsl.setTiming(TSL2591_INTEGRATIONTIME_100MS); // shortest integration time (bright light) //tsl.setTiming(TSL2591_INTEGRATIONTIME_200MS); //tsl.setTiming(TSL2591_INTEGRATIONTIME_300MS); //tsl.setTiming(TSL2591_INTEGRATIONTIME_400MS); //tsl.setTiming(TSL2591_INTEGRATIONTIME_500MS); //tsl.setTiming(TSL2591_INTEGRATIONTIME_600MS); // longest integration time (dim light) /* Display the gain and integration time for reference sake */ // XBee.println("------------------------------------"); // XBee.print ("Gain: "); tsl2591Gain_t gain = tsl.getGain(); // switch(gain) // { // case TSL2591_GAIN_LOW: // XBee.println("1x (Low)"); // break; // case TSL2591_GAIN_MED: // XBee.println("25x (Medium)"); // break; // case TSL2591_GAIN_HIGH: // XBee.println("428x (High)"); // break; // case TSL2591_GAIN_MAX: // XBee.println("9876x (Max)"); // break; // } // XBee.print ("Timing: "); // XBee.print((tsl.getTiming() + 1) * 100, DEC); // XBee.println(" ms"); // XBee.println("------------------------------------"); // XBee.println(""); } float advancedLightSensorRead(void) { // More advanced data read example. Read 32 bits with top 16 bits IR, bottom 16 bits full spectrum // That way you can do whatever math and comparisons you want! uint32_t lum = tsl.getFullLuminosity(); uint16_t ir, full; float lux; lum = tsl.getFullLuminosity(); // first reading will be incorrect of Gain or Time was changed ir = lum >> 16; full = lum & 0xFFFF; lux = tsl.calculateLux(full, ir); // XBee.println(); // XBee.print(F("Lux ")); // XBee.println(lux); if (full < 100){ switch (tsl.getGain()) { case TSL2591_GAIN_LOW : configureSensor(TSL2591_GAIN_MED, TSL2591_INTEGRATIONTIME_200MS); // XBee.print(F("Gain raised to MED")); break; case TSL2591_GAIN_MED : configureSensor(TSL2591_GAIN_HIGH, TSL2591_INTEGRATIONTIME_200MS); // XBee.print(F("Gain raised to HIGH")); break; /* case TSL2591_GAIN_HIGH : configureSensor(TSL2591_GAIN_MAX, TSL2591_INTEGRATIONTIME_200MS); XBee.print("Gain raised to MAX"); break; case TSL2591_GAIN_MAX : XBee.print("Gain already at MAX"); break; */ default: configureSensor(TSL2591_GAIN_MED, TSL2591_INTEGRATIONTIME_200MS); break; } } if (full > 30000){ switch (tsl.getGain()) { case TSL2591_GAIN_LOW : // XBee.print(F("Gain already at LOW")); break; case TSL2591_GAIN_MED : configureSensor(TSL2591_GAIN_LOW, TSL2591_INTEGRATIONTIME_200MS); // XBee.print(F("Gain lowered to LOW")); break; /* case TSL2591_GAIN_HIGH : configureSensor(TSL2591_GAIN_MED, TSL2591_INTEGRATIONTIME_200MS); XBee.print("Gain lowered to MED"); break; case TSL2591_GAIN_MAX : configureSensor(TSL2591_GAIN_HIGH, TSL2591_INTEGRATIONTIME_200MS); XBee.print("Gain lowered to MED"); break; */ default: configureSensor(TSL2591_GAIN_MED, TSL2591_INTEGRATIONTIME_200MS); break; } } return lux; } #endif