DIY världen klocka och väder bot (Arduino + ESP8266) (3 / 3 steg)
Steg 3: kod
För starten behöver du ssid och passera av ditt nätverk, API-nyckel från OpenWeatherMap och TimezoneDB. Definiera dessa strängar i början av koden.
#define ssid "" //write ssid
#define PASS "" //write ditt pass
#define owmIP "" //OpenWeatherMap api
IP #define timeIP "" //timezoneDB api IP
#define owmKey ""; OpenWeatherMap api-nyckel
#define timeKey ""; timezoneDB api nyckel
Efter att definiera din LED och LCD stift.
int rainLED [] = {31, 33, 35};
int eyesLED [] = {37, 39};
int SolLED = 41; < br > int cloudLED = 45;
int thunderLED = 43;
LiquidCrystal lcd (8, 9, 10, 11, 12, 13);
I installationsprogrammet starta LCD-skärmen. seriell kommunikation mellan Arduino och PC (för att välja stad/land) och Arduino och ESP8266. Också starta SDA/SCL meddelande med din RTC modul. Överföringshastigheten i beror på vilken modell av ESP8266. ESP8266 används i det här exemplet använder 115200 överföringshastigheten.
Wire.BEGIN();
LCD.BEGIN (16, 2);
Serial.BEGIN(9600);
Serial1.BEGIN(115200);
Om det finns en data i EEPROM-minne använda dessa uppgifter, om inte som för nya data.
om (EEPROM.read(0) == 255) {
Serial.println ("ENTER ORTSNAMNET (stad eller stad, land):");
setLCD ("In STADSNAMN", "");
bool isTxt = false;
int br = 0;
medan (! isTxt) {
om (Serial.available() > 0)
{
medan (Serial.available() > 0)
{
char c = char(Serial.read());
om (c! = '\n' & & c! = '\r') {
staden += c;
EEPROM.write (br, byte(c));
++ br;
}
Delay(2);
}
isTxt = sant;
}
}
}
annat {
int br = 0;
medan (EEPROM.read(br)! = 255) {
staden += char(EEPROM.read(br));
++ br;
}
}
Anslutning av ESP8266 till nätverket med AT-kommandon. Eftersom ESP8266 kommer att ansluta till två webbtjänster ska du skicka kommandot AT + CIPMUX = 1 till ESP8266.
medan (sant) {
Serial1.println("at+rst");
Delay(5000);
om (Serial1.find("OK")) {
Serial.println ("ESP8266 OK");
setLCD ("ESP8266 OK", "uppstart upp...");
om (connectWiFi()) {
Serial.println ("WIFI OK");
setLCD ("WIFI OK", "");
}
bryta;
}
}
Serial1.println("at+CIPMUX=1");
connectWiFi funktion:
booleska connectWiFi() {
Serial1.println("at+CWMODE=1");
Delay(2000);
Sträng cmd = "AT + CWJAP = \" ";
CMD + = ssid;
cmd += "\",\"";
CMD + = PASS;
CMD + = "\" ";
Serial1.println(CMD);
Delay(5000);
om (Serial1.find("OK")) {
return true;
}
annat {
returnera false;
}
}
Ansluta till tjänsten OpenWeatherMap:
Sträng cmd = "AT + CIPSTART = 0, \"TCP\", \" ";
CMD += owmIP;
CMD + = "\",80";
Serial1.println(CMD);
Delay(2000);
om (Serial1.find("Error")) {
hemkomst.
}
CMD = "GET data/2.5/weather?q=" + city + "& appid =" + owmKey + "& enheter = metriska";
CMD + = "\r\n"; < br > Serial1.print("AT+CIPSEND=0,");
Serial1.println(cmd.length());
om (Serial1.find(">")) {
Serial1.Print(CMD);
...
}
Ansluta till tjänsten TimezoneDB:
Sträng cmd = "AT + CIPSTART = 1 \"TCP\", \" ";
CMD += timeIP;
CMD + = "\",80";
Serial1.println(CMD);
Delay(2000);
om (Serial1.find("Error")) {
hemkomst.
}
CMD = "få /? nyckel =" + 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());
om (Serial1.find(">")) {
Serial1.Print(CMD);
...
}
Webbtjänster returnera data i XML- eller JSON-format och det finns ett ganska bra bibliotek för att analysera JSON i Arduino men eftersom det finns ett problem med att få hela responsen strängen bör vi få alla data manuellt med hjälp av funktionen find().
tag (!. Serial1.find ("\"lon\":")) {
om ((millis()-currentMillis) > 10000) {
igen = sant;
hemkomst.
}
}
medan (sant) {
om (Serial1.available()) {
char c = Serial1.read();
om (c == ',') bryta;
LNG += c;
}
}
...
Beroende på vädret data fick från OWM service vänder lysdioder på eller av. Viskade är ganska knepigt för regneffekt eftersom blå lysdioder bör slå på och av (i exemplet varje sekund) asynkron till resten av programmet (de inte ska blockera program). Du kan använda millis() för att uppnå denna effekt. Delen av koden ansvarar för att vrida lysdioder när det är normala regn i en vald stad:
annars om (beskrivning == "ljus regn") {
om (isSun) {
pinMode (SolLED, produktionen);
digitalWrite (SolLED, hög);
}
pinMode (cloudLED, produktionen);
pinMode (rainLED [regndroppe], produktionen);
digitalWrite (cloudLED, hög);
digitalWrite (rainLED [regndroppe], hög);
om ((millis()-weatherTime) > 1000) {
digitalWrite (rainLED [regndroppe], låg);
++ Regndroppe;
weatherTime = millis();
}
Funktioner för att spara och att få tid från RTC-modulen är tagna från länken och de är något modifierad för att visa data till LCD-skärmen. Modifierade delen av funktionen returnTime():
char buffer1 [10];
itoa (timme, buffer1, 10);
char buffer2 [10];
itoa (minut, buffer2, 10);
om (timme < 10 & & minuten < 10) {
returnera currentTime = land + "" vardag "0" + + buffer1 + ": 0" + buffer2;
}
annars om (timme < 10) {
returnera currentTime = land + "" vardag "0" + + buffer1 + ":" + buffer2;
}
annars om (minut < 10) {
returnera currentTime = land + "" + vardag + "" + buffer1 + ": 0" + buffer2;
}
returnera currentTime = land + "" + vardag + "" + buffer1 + ":" + buffer2;
Fullständiga koden för detta projekt finns i en bilaga.
Jag hoppas du gillade detta Instructable och tack för att läsa :) Om du har gärna några frågor angående detta projekt kontakta mig eller fråga mig i kommentarerna :)