|
@@ -1,4 +1,9 @@
|
|
#include <FastLED.h>
|
|
#include <FastLED.h>
|
|
|
|
+#include <ArduinoJson.h>
|
|
|
|
+#include <ESP8266HTTPClient.h>
|
|
|
|
+#include <ESP8266WiFi.h>
|
|
|
|
+#include <ESP8266WiFiMulti.h>
|
|
|
|
+#include <WiFiClient.h>
|
|
|
|
|
|
#define LED_PIN 0
|
|
#define LED_PIN 0
|
|
|
|
|
|
@@ -6,23 +11,53 @@
|
|
#define CHIPSET WS2811
|
|
#define CHIPSET WS2811
|
|
|
|
|
|
#define BRIGHTNESS 10
|
|
#define BRIGHTNESS 10
|
|
|
|
+
|
|
|
|
+#ifndef STASSID
|
|
|
|
+#define STASSID "FNT-Gast"
|
|
|
|
+#define STAPSK "Laserjet09"
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+const char* ssid = STASSID;
|
|
|
|
+const char* password = STAPSK;
|
|
|
|
|
|
// networking and json
|
|
// networking and json
|
|
String apiUrl;
|
|
String apiUrl;
|
|
int status = WL_IDLE_STATUS;
|
|
int status = WL_IDLE_STATUS;
|
|
|
|
|
|
-int connectWiFi() {
|
|
|
|
- WiFi.begin("Wokwi-GUEST", "", 6);
|
|
|
|
- while (WiFi.status() != WL_CONNECTED) {
|
|
|
|
- delay(100);
|
|
|
|
|
|
+ESP8266WiFiMulti WiFiMulti;
|
|
|
|
+WiFiClient client;
|
|
|
|
+HTTPClient http;
|
|
|
|
+
|
|
|
|
+unsigned long millisTime;
|
|
|
|
+boolean firstIteration = true;
|
|
|
|
+
|
|
|
|
+void connectWiFi() {
|
|
|
|
+
|
|
|
|
+ // We start by connecting to a WiFi network
|
|
|
|
+ WiFi.mode(WIFI_STA);
|
|
|
|
+ WiFiMulti.addAP(ssid, password);
|
|
|
|
+
|
|
|
|
+ Serial.println();
|
|
|
|
+ Serial.println();
|
|
|
|
+ Serial.print("Wait for WiFi... ");
|
|
|
|
+
|
|
|
|
+ while (WiFiMulti.run() != WL_CONNECTED) {
|
|
|
|
+ Serial.print(".");
|
|
|
|
+ delay(500);
|
|
}
|
|
}
|
|
- return WiFi.status();
|
|
|
|
|
|
+
|
|
|
|
+ Serial.println("");
|
|
|
|
+ Serial.println("WiFi connected");
|
|
|
|
+ Serial.println("IP address: ");
|
|
|
|
+ Serial.println(WiFi.localIP());
|
|
|
|
+
|
|
|
|
+ delay(500);
|
|
}
|
|
}
|
|
|
|
|
|
String buildAPIUrl (double lat, double lon, const String& apiKey) {
|
|
String buildAPIUrl (double lat, double lon, const String& apiKey) {
|
|
const String latStr(lat, 4);
|
|
const String latStr(lat, 4);
|
|
const String lonStr(lon, 4);
|
|
const String lonStr(lon, 4);
|
|
- return String("https://api.openweathermap.org/data/2.5/weather?lat=" +
|
|
|
|
|
|
+ return String("http://api.openweathermap.org/data/2.5/weather?lat=" +
|
|
latStr + "&lon=" + lonStr + "&appid=" + apiKey);
|
|
latStr + "&lon=" + lonStr + "&appid=" + apiKey);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -90,35 +125,123 @@ uint8_t cloud_yx[16][16] = {
|
|
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
|
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
|
};
|
|
};
|
|
|
|
|
|
-void DrawFrame(uint8_t arr[][16])
|
|
|
|
|
|
+uint8_t rain_yx[16][16] = {
|
|
|
|
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
|
|
|
+ {0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0},
|
|
|
|
+ {0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0},
|
|
|
|
+ {0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0},
|
|
|
|
+ {0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0},
|
|
|
|
+ {0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0},
|
|
|
|
+ {0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0},
|
|
|
|
+ {0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
|
|
|
|
+ {0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
|
|
|
|
+ {0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
|
|
|
|
+ {0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0},
|
|
|
|
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
|
|
|
+ {0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0},
|
|
|
|
+ {0,0,0,1,0,1,0,1,0,0,0,1,0,1,0,0},
|
|
|
|
+ {0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0},
|
|
|
|
+ {0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0}
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+uint8_t cloudSun_yx[16][16] = {
|
|
|
|
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
|
|
|
+ {0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0},
|
|
|
|
+ {0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0},
|
|
|
|
+ {0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0},
|
|
|
|
+ {0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0},
|
|
|
|
+ {0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0},
|
|
|
|
+ {0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0},
|
|
|
|
+ {0,1,0,0,1,1,1,0,0,0,0,0,1,0,0,0},
|
|
|
|
+ {0,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0},
|
|
|
|
+ {0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0},
|
|
|
|
+ {0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0},
|
|
|
|
+ {0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
|
|
|
|
+ {0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
|
|
|
|
+ {0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
|
|
|
|
+ {0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0},
|
|
|
|
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+void DrawFrame(uint8_t arr[][16], String identifier)
|
|
{
|
|
{
|
|
|
|
+ FastLED.clear();
|
|
|
|
+ FastLED.show();
|
|
for (int i = 0; i < 16; i++) {
|
|
for (int i = 0; i < 16; i++) {
|
|
for (int j = 0; j < 16; j++) {
|
|
for (int j = 0; j < 16; j++) {
|
|
uint8_t elem = arr[i][j];
|
|
uint8_t elem = arr[i][j];
|
|
if (elem == 1) {
|
|
if (elem == 1) {
|
|
- leds[ XYsafe(i, j)] = CRGB::Yellow;
|
|
|
|
|
|
+ if (identifier == "Rain") {
|
|
|
|
+ if (i >= 12) {
|
|
|
|
+ leds[ XYsafe(i, j)] = CRGB::Blue;
|
|
|
|
+ } else {
|
|
|
|
+ leds[ XYsafe(i, j)] = CRGB::WhiteSmoke;
|
|
|
|
+ }
|
|
|
|
+ } else if (identifier == "Clouds") {
|
|
|
|
+ leds[ XYsafe(i, j)] = CRGB::WhiteSmoke;
|
|
|
|
+ } else if (identifier == "Sun") {
|
|
|
|
+ leds[ XYsafe(i, j)] = CRGB::Yellow;
|
|
|
|
+ } else if (identifier == "CloudSun") {
|
|
|
|
+ if ((((i >= 0) && (i <= 8))
|
|
|
|
+ && ((j >= 0) && (j <= 2)))
|
|
|
|
+ ||
|
|
|
|
+ (((i >= 0) && (i <= 4))
|
|
|
|
+ && ((j >= 0) && (j <= 15)))) {
|
|
|
|
+ leds[ XYsafe(i, j)] = CRGB::Yellow;
|
|
|
|
+ Serial.println("Yellow!");
|
|
|
|
+ } else {
|
|
|
|
+ leds[ XYsafe(i, j)] = CRGB::WhiteSmoke;
|
|
|
|
+ Serial.println("White!");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ FastLED.show();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
void loop()
|
|
void loop()
|
|
{
|
|
{
|
|
- DrawFrame(sun_yx);
|
|
|
|
- FastLED.show();
|
|
|
|
- delay(3000);
|
|
|
|
- FastLED.clear();
|
|
|
|
- DrawFrame(cloud_yx);
|
|
|
|
- FastLED.show();
|
|
|
|
- delay(3000);
|
|
|
|
- FastLED.clear();
|
|
|
|
|
|
+ millisTime = millis();
|
|
|
|
+
|
|
|
|
+ if (firstIteration || millisTime % 60000 == 0) {
|
|
|
|
+ int respCode = http.GET();
|
|
|
|
+
|
|
|
|
+ JsonDocument payload;
|
|
|
|
+
|
|
|
|
+ if(respCode > 0){
|
|
|
|
+ const String response = http.getString();
|
|
|
|
+ deserializeJson(payload, response);
|
|
|
|
+
|
|
|
|
+ if (String("Clouds") == String(payload["weather"][0]["main"])) {
|
|
|
|
+ if (payload["weather"][0]["id"] >= 803) {
|
|
|
|
+ DrawFrame(cloud_yx, "Clouds");
|
|
|
|
+ } else {
|
|
|
|
+ DrawFrame(cloudSun_yx, "CloudSun");
|
|
|
|
+ }
|
|
|
|
+ } else if (String("Rain") == String(payload["weather"][0]["main"]) || String("Drizzle") == String(payload["weather"][0]["main"])) {
|
|
|
|
+ DrawFrame(rain_yx, "Rain");
|
|
|
|
+ } else if (String("Clear") == String(payload["weather"][0]["main"])) {
|
|
|
|
+ DrawFrame(sun_yx, "Sun");
|
|
|
|
+ } else {
|
|
|
|
+ DrawFrame(cloudSun_yx, "CloudSun");
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ Serial.print("error ");
|
|
|
|
+ Serial.println(respCode);
|
|
|
|
+ }
|
|
|
|
+ firstIteration = false;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void setup() {
|
|
void setup() {
|
|
- Serial.begin(9600);
|
|
|
|
|
|
+ Serial.begin(115200);
|
|
|
|
|
|
// weather api
|
|
// weather api
|
|
const float lat = 48.9517;
|
|
const float lat = 48.9517;
|
|
@@ -130,21 +253,7 @@ void setup() {
|
|
if (WiFi.status() != WL_CONNECTED) {
|
|
if (WiFi.status() != WL_CONNECTED) {
|
|
Serial.println(WiFi.status());
|
|
Serial.println(WiFi.status());
|
|
}
|
|
}
|
|
- HTTPClient http;
|
|
|
|
- http.begin(apiUrl);
|
|
|
|
- int respCode = http.GET();
|
|
|
|
-
|
|
|
|
- JsonDocument payload;
|
|
|
|
-
|
|
|
|
- if(respCode > 0){
|
|
|
|
- const String response = http.getString();
|
|
|
|
- deserializeJson(payload, response);
|
|
|
|
- Serial.println(payload.size());
|
|
|
|
- } else {
|
|
|
|
- Serial.print("error ");
|
|
|
|
- Serial.println(respCode);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ http.begin(client, apiUrl);
|
|
|
|
|
|
FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalSMD5050);
|
|
FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalSMD5050);
|
|
FastLED.setBrightness( BRIGHTNESS );
|
|
FastLED.setBrightness( BRIGHTNESS );
|