/* * --------------------------------------------------- * ESP-WROOM WATCH v1.00 2017.04.01 @uzuran_n * ESP-WROOM-02 + Adafruit SSD1306 128x32 OLED Display * --------------------------------------------------- * FUNCTION 1: ADJUST TIME by NTP * FUNCTION 2: TWITTER - CHECK LAST MENTION * FUNCTION 3: TWITTER - にゃーん * FUNCTION 4: BATTERY * --------------------------------------------------- */ #include <EEPROM.h> #include <ESP8266WiFi.h> #include <WiFiUdp.h> #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Ticker.h> Ticker ticker1; #include <Stewitter.h> Stewitter twitter("-- your TOKEN here --"); volatile int ti = 0; volatile int ss = 0; volatile int mm = 0; volatile int hh = 0; volatile int menuNo = 0; volatile boolean dispTimeEnable = true; volatile boolean reWriteTimeEnable = true; volatile boolean startinWiFi = false; volatile float batt_rv; volatile float batt; String string1 = String(""); boolean network = 0; // "network 0" (home) char ssid_0[] = "-- SSID(home) here --"; // your network SSID (name) char pass_0[] = "-- PASS(home) here --"; // your network password // "network 1" (mobile) char ssid_1[] = "-- SSID(mobile) here --"; // your network SSID (name) char pass_1[] = "-- PASS(mobile) here --"; // your network password unsigned int localPort = 2390; // local port to listen for UDP packets /* Don't hardwire the IP address or we won't get the benefits of the pool. * Lookup the IP address for the host name instead */ //IPAddress timeServer(129, 6, 15, 28); // time.nist.gov NTP server IPAddress timeServerIP; // time.nist.gov NTP server address const char* ntpServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets // A UDP instance to let us send and receive packets over UDP WiFiUDP udp; // If using software SPI (the default case): #define OLED_CS 16 #define OLED_RESET 14 #define OLED_DC 12 #define OLED_CLK 13 #define OLED_MOSI 15 Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); //Uncomment this block to use hardware SPI /* #define OLED_DC 12 #define OLED_CS 15 #define OLED_RESET 16 Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS); */ #define NUMFLAKES 10 #define XPOS 0 #define YPOS 1 #define DELTAY 2 #define LOGO16_GLCD_HEIGHT 16 #define LOGO16_GLCD_WIDTH 16 static const unsigned char PROGMEM logo16_glcd_bmp[] = { B00000000, B11000000, B00000001, B11000000, B00000001, B11000000, B00000011, B11100000, B11110011, B11100000, B11111110, B11111000, B01111110, B11111111, B00110011, B10011111, B00011111, B11111100, B00001101, B01110000, B00011011, B10100000, B00111111, B11100000, B00111111, B11110000, B01111100, B11110000, B01110000, B01110000, B00000000, B00110000 }; #if (SSD1306_LCDHEIGHT != 32) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif extern "C" { #include "user_interface.h" } void setup() { delay(200); batt_rv = system_adc_read(); batt = batt_rv * 1.055 / 100; if(batt < 3.50) { ESP.deepSleep(600 * 1000 * 1000 , WAKE_RF_DISABLED); delay(1000); } // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) display.begin(SSD1306_SWITCHCAPVCC); // init done // Show image buffer on the display hardware. // Since the buffer is intialized with an Adafruit splashscreen // internally, this will display the splashscreen. display.display(); delay(2000); // Clear the buffer. display.clearDisplay(); ticker1.attach_ms(100, interrupt1); pinMode(4, INPUT); pinMode(5, INPUT); Serial.begin(9600); Serial.println(); Serial.println(); string1 = "network 0"; while(true) { if(digitalRead(5) == 0) { string1 = ""; delay(80); while(digitalRead(5) == 0) { delay(3); } network ^= 1; if(network == 0){ string1 = "network 0"; } else{ string1 = "network 1"; } delay(80); } if(digitalRead(4) == 0) { string1 = ""; delay(80); while(digitalRead(4) == 0) { delay(3); } string1 = "selected"; delay(1000); //wait while displaying result string1 = ""; break; } delay(2); } // We start by connecting to a WiFi network startinWiFi = true; Serial.print("Connecting to "); if(network == 0) { Serial.println(ssid_0); WiFi.begin(ssid_0, pass_0); } else { Serial.println(ssid_1); WiFi.begin(ssid_1, pass_1); } while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); Serial.println("Starting UDP"); udp.begin(localPort); Serial.print("Local port: "); Serial.println(udp.localPort()); startinWiFi = false; EEPROM.begin(100); } void interrupt1() { static int i; if(reWriteTimeEnable) { ++ti; if(ti == 10) { ti = 0; ++ss; } if(ss == 60) { ss = 0; ++mm; } if(mm == 60) { mm = 0; ++hh; } if(hh == 24) { hh = 0; } } display.setTextColor(WHITE); display.setTextSize(2); display.clearDisplay(); display.setCursor(0,0); display.print(hh / 10); display.print(hh % 10); if(ti < 5) { display.print(":"); } else { display.print(" "); } display.print(mm / 10); display.print(mm % 10); if(startinWiFi == true) { if(i < 2){string1 = "";} else if(i < 4){string1 = ".";} else if(i < 6){string1 = "..";} else if(i < 8){string1 = "...";} else if(i < 10){string1 = "....";} else if(i < 12){string1 = ".....";} else if(i < 14){string1 = "......";} else if(i < 16){string1 = ".......";} else if(i < 18){string1 = "........";} else if(i < 20){string1 = ".........";} else if(i < 22){string1 = "..........";} i++; if(i == 23) { i = 0; } } display.setCursor(0,16); display.print(string1); display.display(); batt_rv = system_adc_read(); batt = batt_rv * 1.055 / 100; } void getTime() { //get a random server from the pool WiFi.hostByName(ntpServerName, timeServerIP); sendNTPpacket(timeServerIP); // send an NTP packet to a time server // wait to see if a reply is available delay(1000); int cb = udp.parsePacket(); if (!cb) { Serial.println("no packet yet"); // ******* modified ******* string1 = "no packet"; } else { Serial.print("packet received, length="); Serial.println(cb); // ******* modified ******* string1 = "received!"; // We've received a packet, read the data from it udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer //the timestamp starts at byte 40 of the received packet and is four bytes, // or two words, long. First, esxtract the two words: unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); // combine the four bytes (two words) into a long integer // this is NTP time (seconds since Jan 1 1900): unsigned long secsSince1900 = highWord << 16 | lowWord; Serial.print("Seconds since Jan 1 1900 = " ); Serial.println(secsSince1900); // now convert NTP time into everyday time: Serial.print("Unix time = "); // Unix time starts on Jan 1 1970. In seconds, that's 2208988800: const unsigned long seventyYears = 2208988800UL; // subtract seventy years: unsigned long epoch = secsSince1900 - seventyYears; // print Unix time: Serial.println(epoch); // print the hour, minute and second: Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT) Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day) Serial.print(':'); if ( ((epoch % 3600) / 60) < 10 ) { // In the first 10 minutes of each hour, we'll want a leading '0' Serial.print('0'); } Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute) Serial.print(':'); if ( (epoch % 60) < 10 ) { // In the first 10 seconds of each minute, we'll want a leading '0' Serial.print('0'); } Serial.println(epoch % 60); // print the second // ******* modified ******* reWriteTimeEnable = false; hh = (epoch % 86400L) / 3600; hh += 9; //JST if(hh > 23) { hh -= 24; } mm = (epoch % 3600) / 60; ss = epoch % 60; reWriteTimeEnable = true; } } void loop() { int i; String string2 = ""; String string3 = ""; String string4 = ""; if(digitalRead(5) == 0) { string1 = ""; delay(80); while(digitalRead(5) == 0) { delay(3); } ++menuNo; if(menuNo == 4) { menuNo = 0; } } if(menuNo == 0) { string1 = "adj time"; if(digitalRead(4) == 0) { string1 = ""; delay(80); while(digitalRead(4) == 0) { delay(3); } string1 = "connect"; getTime(); delay(1000); //wait while displaying result } } else if(menuNo == 1) { string1 = "chk ment"; if(digitalRead(4) == 0) { string1 = ""; delay(80); while(digitalRead(4) == 0) { delay(3); } string1 = "connect"; if (twitter.lastMention()) { int status = twitter.wait(); if (status == 200) { Serial.println(twitter.response()); string3 = String(twitter.response()); string2 = String(string3.substring(0, 4)); string2 = String(string2 + " "); string2 = String(string2 + string3.substring(4, 8)); string2 = String(string2 + " "); string2 = String(string2 + string3.substring(8, 12)); string2 = String(string2 + " "); string2 = String(string2 + string3.substring(34)); string1 = String(string2); delay(1000); for(i = 0; i < 40; i++) { delay(333); string1 = string1.substring(1); } } else { Serial.print("failed : code "); Serial.println(status); string1 = String(status); delay(1000); } } else { Serial.println("connection failed."); string1 = "failed"; delay(1000); } } } else if(menuNo == 2) { uint8_t nyanCount; char buff[18]; string1 = "nya-n"; if(digitalRead(4) == 0) { string1 = ""; delay(80); while(digitalRead(4) == 0) { delay(3); } nyanCount = EEPROM.read(0); Serial.println(nyanCount); string2 = String("にゃーん ("); string2 = String(string2 + (nyanCount / 10)); string2 = String(string2 + (nyanCount % 10)); string2 = String(string2 + ")"); string2.toCharArray(buff, 18); string1 = "connect"; if (twitter.post(buff)) { int status = twitter.wait(); if (status == 200) { Serial.println(twitter.response()); string1 = "tweeted!"; delay(1000); nyanCount++; if(nyanCount >= 100) { nyanCount = 0; } EEPROM.write(0, nyanCount); EEPROM.commit(); } else { Serial.print("failed : code "); Serial.println(status); string1 = String(status); delay(1000); } } else { Serial.println("connection failed."); string1 = "failed"; delay(1000); } } } else if(menuNo == 3) { string2 = "b "; string3 = String(batt); string4 = "V"; string1 = String(string2 + string3 + string4); } if(batt < 3.30) { for(i = 0; i < 60; i++) { string1 = "low bat"; delay(500); string1 = ""; delay(500); } ESP.deepSleep(600 * 1000 * 1000 , WAKE_RF_DISABLED); delay(1000); } delay(2); } // send an NTP request to the time server at the given address unsigned long sendNTPpacket(IPAddress& address) { Serial.println("sending NTP packet..."); // set all bytes in the buffer to 0 memset(packetBuffer, 0, NTP_PACKET_SIZE); // Initialize values needed to form NTP request // (see URL above for details on the packets) packetBuffer[0] = 0b11100011; // LI, Version, Mode packetBuffer[1] = 0; // Stratum, or type of clock packetBuffer[2] = 6; // Polling Interval packetBuffer[3] = 0xEC; // Peer Clock Precision // 8 bytes of zero for Root Delay & Root Dispersion packetBuffer[12] = 49; packetBuffer[13] = 0x4E; packetBuffer[14] = 49; packetBuffer[15] = 52; // all NTP fields have been given values, now // you can send a packet requesting a timestamp: udp.beginPacket(address, 123); //NTP requests are to port 123 udp.write(packetBuffer, NTP_PACKET_SIZE); udp.endPacket(); }