-
-
Save ericoporto/fb9c975a290a822edca9 to your computer and use it in GitHub Desktop.
| /* | |
| Web Client to consume Open WeatherMap web service | |
| This sketch connects to a website (http://api.openweathermap.org) | |
| using an Arduino Ethernet shield and get data from site. | |
| Circuit: | |
| * Arduino MEGA 2560 R3 Board | |
| * Ethernet shield attached to pins 10, 11, 12, 13 | |
| created 24 May 2015 | |
| by Erico Porto | |
| Based on the WeatherUnderground version from Afonso C. Turcato | |
| */ | |
| #include <ArduinoJson.h> | |
| #include <SPI.h> | |
| #include <Ethernet.h> | |
| #define RBUFFSIZE 600 | |
| byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; | |
| const char server[] = "api.openweathermap.org"; | |
| // Set the static IP address to use if the DHCP fails to assign | |
| IPAddress ip(192,168,1,202); | |
| EthernetClient client; | |
| char responseBuffer[RBUFFSIZE]; | |
| int rbindex = 0; | |
| boolean startCapture; | |
| void setup() { | |
| Serial.begin(9600); | |
| // start the Ethernet connection: | |
| if (Ethernet.begin(mac) == 0) | |
| { | |
| Serial.println("Failed to configure Ethernet using DHCP"); | |
| Ethernet.begin(mac, ip); | |
| } | |
| // give the Ethernet shield a half-second to initialize: | |
| delay(500); | |
| Serial.print("My IP Address is: "); | |
| Serial.println(Ethernet.localIP()); | |
| Serial.println("Connecting..."); | |
| // if you get a connection, report back via serial: | |
| if (client.connect(server, 80)) | |
| { | |
| Serial.println("Connected!"); | |
| const String html_cmd1 = "GET /data/2.5/weather?q=SaoPaulo,BR HTTP/1.1"; | |
| const String html_cmd2 = "Host: api.openweathermap.org"; | |
| const String html_cmd3 = "Connection: close"; | |
| //You can comment the following 3 lines | |
| Serial.println(" " + html_cmd1); | |
| Serial.println(" " + html_cmd2); | |
| Serial.println(" " + html_cmd3); | |
| // Make a HTTP request: | |
| client.println(html_cmd1); | |
| client.println(html_cmd2); | |
| client.println(html_cmd3); | |
| client.println(); | |
| responseBuffer[0] = '\0'; | |
| rbindex = 0; | |
| startCapture = false; | |
| } | |
| else | |
| { | |
| // if you didn't get a connection to the server: | |
| Serial.println("Connection failed!"); | |
| } | |
| } | |
| void loop() | |
| { | |
| // if there are incoming bytes available | |
| // from the server, read them and buffer: | |
| if (client.available()) | |
| { | |
| char c = client.read(); | |
| if(c == '{') { | |
| startCapture=true; | |
| } | |
| if(startCapture && rbindex < RBUFFSIZE) { | |
| responseBuffer[rbindex] = c; | |
| rbindex++; | |
| } | |
| } | |
| // if the server's disconnected, stop the client: | |
| if (!client.connected()) { | |
| Serial.print("Received bytes"); | |
| Serial.print(strlen(responseBuffer)); | |
| Serial.println("Disconnecting."); | |
| client.stop(); | |
| client.flush(); | |
| Serial.println(responseBuffer); | |
| Serial.println(); | |
| StaticJsonBuffer<500> jsonBuffer; | |
| JsonObject& root = jsonBuffer.parseObject(responseBuffer); | |
| if (!root.success()) { | |
| Serial.println("parseObject() failed"); | |
| } else { | |
| //Now, some examples of how to use it! | |
| Serial.print("Current Temperature: "); | |
| Serial.print((double)root["main"]["temp"]); | |
| Serial.println(" K\n"); | |
| Serial.print("Rain: "); | |
| Serial.println((double)root["rain"]["3h"]); | |
| Serial.println(); | |
| Serial.print("Wind: "); | |
| Serial.println((double)root["wind"]["speed"]); | |
| Serial.println(); | |
| } | |
| // do nothing forevermore: | |
| while(true); | |
| } | |
| } |
@moonisshah yes, it's. Damn, Github doesn't have notifications. The reason I did this was to rotate a motor (that one where you pass the angle and it turns to that angle) so I could build one of those wooden devices that use pressure difference to detect rain - except I planned to use the Arduino getting data instead. My wooden habilities failed me so I couldn't do. I will try to find some code to do just this and get back to you.
@ericoporto thank you for sharing code. i have a project which use this code which is a smart sprinkler :
If soil moisture is below a specific threshold and it will not rain in 2 coming days the sprinkler turn on. please can you help me doing this using your code?
Thanks for sharing the code. I guess it won't work as it is, unless you provide your APPID at the end of GET request.
hello eric,
Thank you for sharing code.. I was stuck on how to get the uno to communicate with an api. I want to ask you that is it possible to give the weather data to run a motor. say the wind data from the api runs a dc motor?... can u please help with that ...