Stap 3: Code
Je moet voor het begin ssid en pass van uw netwerk, API-sleutel van OpenWeatherMap en TimezoneDB. Deze snaren aan het begin van de code te definiëren.
#define ssid "" //write your ssid #define PASS "" //write your pass #define owmIP "" //OpenWeatherMap api IP#define timeIP "" //timezoneDB api IP #define owmKey ""; //OpenWeatherMap api Key #define timeKey ""; //timezoneDB api Key
Daarna definiëren uw LED en LCD pinnen.
int rainLED[] = {31, 33, 35}; int eyesLED [] = {37, 39}; int sunLED = 41;<br>int cloudLED = 45; int thunderLED = 43; LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
In setup start LCD-scherm. seriële communicatie tussen de Arduino en PC (voor het kiezen van stad/land) en Arduino en ESP8266. Ook beginnen de SDA/SCL-communicatie met uw RTC-module. Baud-rate van de hangt af van het model van de ESP8266. ESP8266 gebruikt in dit voorbeeld maakt gebruik van 115200 baud-rate.
Wire.begin(); lcd.begin(16, 2); Serial.begin(9600); Serial1.begin(115200);
Als er een data in het EEPROM geheugen gebruikt die gegevens, als niet voor de nieuwe gegevens.
if (EEPROM.read(0) == 255) { Serial.println("ENTER CITY NAME (city or city,country):"); setLCD("ENTER CITY NAME", ""); bool isTxt = false; int br = 0; while (!isTxt) { if (Serial.available() > 0) { while (Serial.available() > 0) { char c = char(Serial.read()); if (c != '\n' && c != '\r') { city += c; EEPROM.write(br, byte(c)); ++br; } delay(2); } isTxt = true; } } } else { int br = 0; while (EEPROM.read(br) != 255) { city += char(EEPROM.read(br)); ++br; } }
De ESP8266 verbinden met het netwerk met behulp van de AT-commando's. Aangezien ESP8266 zal worden verbinding met twee webservices moet u opdracht AT + CIPMUX = 1 toe aan de ESP8266.
while (true) { Serial1.println("AT+RST"); delay(5000); if (Serial1.find("OK")) { Serial.println("ESP8266 OK"); setLCD("ESP8266 OK", "BOOTING UP..."); if (connectWiFi()) { Serial.println("WIFI OK"); setLCD("WIFI OK", ""); } break; } } Serial1.println("AT+CIPMUX=1");
connectWiFi functie:
boolean connectWiFi() { Serial1.println("AT+CWMODE=1"); delay(2000); String cmd = "AT+CWJAP=\""; cmd += ssid; cmd += "\",\""; cmd += PASS; cmd += "\""; Serial1.println(cmd); delay(5000); if (Serial1.find("OK")) { return true; } else { return false; } }
Verbinding maken met de OpenWeatherMap-service:
String cmd = "AT+CIPSTART=0,\"TCP\",\""; cmd += owmIP; cmd += "\",80"; Serial1.println(cmd); delay(2000); if (Serial1.find("Error")) { return; } cmd = "GET /data/2.5/weather?q=" + city + "&appid=" + owmKey + "&units=metric"; cmd += "\r\n";<br> Serial1.print("AT+CIPSEND=0,"); Serial1.println(cmd.length()); if (Serial1.find(">")) { Serial1.print(cmd); ... }
Verbinding maken met de TimezoneDB-service:
String cmd = "AT+CIPSTART=1,\"TCP\",\""; cmd += timeIP; cmd += "\",80"; Serial1.println(cmd); delay(2000); if (Serial1.find("Error")) { return; } cmd = "GET /?key=" + timeKey + "&lat=" + lat + "&lng=" + lng + "&format=json HTTP/1.1\r\nHost: api.timezonedb.com\r\n\r\n"; cmd += "\r\n"; Serial1.print("AT+CIPSEND=1,"); Serial1.println(cmd.length()); if (Serial1.find(">")) { Serial1.print(cmd); ... }
Webservices gegevens retourneren in de indeling XML of JSON en er is een goede bibliotheek voor het ontleden van JSON in Arduino maar omdat er een probleem met het krijgen van de hele respone-tekenreeks moeten we alle gegevens handmatig met behulp van de functie find().
while (!Serial1.find("\"lon\":")) { if ((millis() - currentMillis) > 10000) { again = true; return; } } while (true) { if (Serial1.available()) { char c = Serial1.read(); if (c == ',') break; lng += c; } } ...
Afhankelijk van het weer gegevens kreeg van OWM dienst draaien LEDs in- of uitschakelen. Wippen is vrij lastig voor de regen effect omdat blauwe LEDs moeten worden draaien aan en uit (in voorbeeld elke seconde) asynchroon naar de rest van het programma (ze mogen niet blokkeren programma). U kunt millis() gebruiken om dat effect te bereiken. Deel van code verantwoordelijk voor het draaien van de LEDs als het normale regen in een gekozen stad:
else if (description == "light rain") { if (isSun) { pinMode(sunLED, OUTPUT); digitalWrite(sunLED, HIGH); } pinMode(cloudLED, OUTPUT); pinMode(rainLED[rainDrop], OUTPUT); digitalWrite(cloudLED, HIGH); digitalWrite(rainLED[rainDrop], HIGH); if ((millis() - weatherTime) > 1000) { digitalWrite(rainLED[rainDrop], LOW); ++rainDrop; weatherTime = millis(); }
Functies voor het opslaan en het krijgen van tijd van de RTC-module worden genomen van de verwijzing en ze zijn enigszins gewijzigd voor het tonen van gegevens naar het LCD-scherm. Gewijzigde deel van de returnTime() functie:
char buffer1[10]; itoa(hour, buffer1, 10); char buffer2[10]; itoa(minute, buffer2, 10); if (hour < 10 && minute < 10) { return currentTime = country + " " + weekDay + " 0" + buffer1 + ":0" + buffer2; } else if (hour < 10) { return currentTime = country + " " + weekDay + " 0" + buffer1 + ":" + buffer2; } else if (minute < 10) { return currentTime = country + " " + weekDay + " " + buffer1 + ":0" + buffer2; } return currentTime = country + " " + weekDay + " " + buffer1 + ":" + buffer2;
Volledige code voor dit project kan worden gevonden in een bijlage.
Ik hoop dat je genoten hebt van dit Instructable en ik dank u voor het lezen :) Als u vragen heeft over dit project hebben voel je vrij om contact met mij of vragen me in de commentaren :)