|
-*-
bestes aktuelles Wetter
von Wehr hier
-*-und
noch interessante Wetterdaten von Wehr von M. Bader hier
-*-
auch interessantes
Kachelmann-Wetter von Wehr
-*-
Hier meine
aktuellen
Balkon-Temperaturen "79664 Wehr"
sie werden über Internet of Things (IoT)
laufend aktualisiert.
Über IoT und den Chip
ESP8266
aktualisiere ich
laufend die Balkon-Temperaturen von Ida und Dietmar in Wehr über die letzen 3 Tage
auf meiner Homepage.
(Mit der Maus über die Temperaturlinie fahren, um für jede vergangene halbe
Stunde die Temperatur abrufen zu können)
<<
Testaufbau
mit NanoESP (PretzelBoard) um eine Verbindung mit WLAN herzustellen und mit
Arduino-Sketch die
gewünschten, aktuellen Nussbaumer-Temperaturen ins Internet aufzuspielen.
(über Thingspeak.com)
^^ Hier oben ist die momentane
Balkon Temperatur
(alle 5 Minuten aktualisiert). Eventuell die
Homepage noch einmal neu laden um die letzte aktualisierte Temperatur zu sehen
(-4 Grad ist nicht korrekt geladen).
-----------------------
Hier unten, das eingebaute, fertige IoT
Temperaturmodul.
Erste Internet-Übertragung am 7. Juni 2019.
Funktioniert ohne Computer, wird nur mit 5 V Speisespannung versorgt. Das kleine
Pretzel Board von Franzis leistet hier volle Arbeit. Die über das Internet
geholten Wehr -Temperaturen von openweather.com sind über unsere
Balkontemperaturen korrigiert.

Hier der erstellte Sketch (Programm) für das Pretzel Board (NanoESP
(hier mit
unsichtbaren xxxx SSID und Passwortnamen unseres WLANs)) - für diejenigen, die es nachbauen wollen.
Ich hatte
damit schon ziemliche Mühe ;-))) und gebe auch keinerlei Garantie für den
Nachbau.
Stand 21.08.2020:
String file1="P23_Thingspeak"; //openweather.com Wehr,DE
20.8.2019
String file2="_37";// neu 21.08.2020
// hochladen mit Arduino nano; Prozessor: ATmega328P(Old
Boatloader), PROGRAMMER. AVrISP mkll
#define SSID "xxxxxxxx"
#define PASSWORD "xxxxxxxxxx"
#define CITY "Wehr,DE"
#define DEBUG true
#define LED_WLAN 13
#define RED 3
#define GREEN 5
#define BLUE 6
#define GND 4
#define ThingSpeakKEY "IT2M4D4XDVPIXB6U"
#define SENSOR A6
#define LED_WLAN 13
#define DEBUG true
#include <SoftwareSerial.h>
#include<LiquidCrystal.h>
// RS, E, D4, D5, D6, D7
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);
SoftwareSerial esp8266(11, 12); // RX, TX
const char thingPost[] PROGMEM = {
"POST *URL* HTTP/1.1\nHost: api.thingspeak.com\nConnection:
close\nContent-Type: application/x-www-form-urlencoded\nContent-Length:
*LEN*\n\n*APPEND*\n\0"
};
int diff=1;// korrigiert und angepasst nach ca. 4 Monaten
Testvergleich
void setup() {
Serial.begin(19200);
esp8266.begin(19200);
Serial.print (file1); Serial.println (file2);
Serial.print("diff= +");Serial.println(diff);
Serial.println ();
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print(file1);lcd.setCursor(0, 1); lcd.print(file2);
lcd.print(" diff: +");lcd.print(diff);lcd.print (char(223));
delay(3000);
lcd.setCursor(0, 0);
lcd.print("openweathermap");lcd.setCursor(0, 1);
lcd.print(".com");
delay(2000);
if (!espConfig()) serialDebug();
else digitalWrite(LED_WLAN, HIGH);
lcd.setCursor(0, 1);
lcd.print("WLAN CONNECTED");
delay(4000);
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
pinMode(GND, OUTPUT);
digitalWrite(GND, LOW);
lcd.clear();
lcd.print("Aktuell: ");lcd.print(CITY);
//
Serial.println("LED-Test");
analogWrite(RED,255);delay (1000);analogWrite(RED,LOW);delay
(1000);
analogWrite(GREEN,255); delay (1000);analogWrite(GREEN,LOW);
delay (1000);
analogWrite(BLUE,255);delay (1000);analogWrite(BLUE,LOW);delay
(1000);
//
}
void loop() {
int temp = getWeatherTemp(CITY);
Serial.print ("Temp openweathermap: ");Serial.print(temp);//
OpenWeatherMap
temp=temp+diff;
lcd.setCursor(0, 1);
lcd.print(" "+String(temp)); lcd.print
(char(223));lcd.print("C");
Serial.print(" IoT korrigiert: ");Serial.println (temp);
rgbTemp(temp);
delay(15000);
if (sendThingPost(ThingSpeakKEY, temp))
delay(300000);//delay(300000)
}
void rgbTemp(int val)
{
int green, blue , red ;
if (val <= 10 & val >= -20)
blue = map(val, -20, 10, 255, 0);
else blue = 0;
if (val >= 10 & val <= 40)
green = map(val, 10, 40, 0, 255);
else if (val >= -20 & val < 10) green = map(val, -20, 10, 0,
255);
else green = 0;
if (val > 10 & val <= 40) red = map(val, 10, 40, 0, 255);
else red = 0;
green=green/30; red=red+50;// rot hervorheben
Serial.print("Grün ");Serial.print(green);
Serial.print(" Rot ");Serial.println(red);
analogWrite( RED, red);
analogWrite(GREEN, green);
analogWrite(BLUE, blue);
}
float getWeatherTemp(String city)
{
float temp;
int humidity, clouds;
String Host = "temp.fkainka.de";
String Subpage = "/?city="+city;
if (sendCom("AT+CIPSTART=\"TCP\",\"" + Host + "\",80", "OK"))
{
String getRequest = "GET " + Subpage + " HTTP/1.1\r\nHost:" +
Host + "\r\n";
if (sendCom("AT+CIPSEND=" + String(getRequest.length() + 2),
">"))
{
esp8266.println(getRequest);
if (esp8266.find("+IPD"))
{
if (esp8266.find("\r\n\r\n"))
{
if (esp8266.find("Temp:"))
{
int vTemp = esp8266.parseInt();
//String vTemp = esp8266.readStringUntil('\"');
debug("Temp: " + String(vTemp) + "C ");
temp = vTemp;//.toFloat();
}
sendCom("AT+CIPCLOSE", "OK");
return temp;
}
}
}
}
}
String getTCP(String Host, String Subpage)
{
boolean success = true;
success &= sendCom("AT+CIPSTART=\"TCP\",\"" + Host + "\",80",
"OK");
String getRequest = "GET " + Subpage + " HTTP/1.1\r\nHost:" +
Host + "\r\n\r\n";
success &= sendCom("AT+CIPSEND=" + String(getRequest.length() +
2), ">");
return sendCom(getRequest);
}
//-----------------------------ThingsSpeak Functions------
boolean sendThingPost(String key, int value)
{
boolean success = true;
String Host = "api.thingspeak.com";
String msg = "field1=" + String(value);
success &= sendCom("AT+CIPSTART=\"TCP\",\"" + Host + "\",80",
"OK");
String postRequest = createThingPost("/update", key, msg);
if (sendCom("AT+CIPSEND=" + String(postRequest.length()), ">"))
{
esp8266.print(postRequest);
esp8266.find("SEND OK");
if (!esp8266.find("CLOSED")) success &=
sendCom("AT+CIPCLOSE", "OK");
}
else
{
success = false;
}
return success;
}
String createThingPost(String url, String key, String msg)
{
String xBuffer;
for (int i = 0; i <= sizeof(thingPost); i++)
{
char myChar = pgm_read_byte_near(thingPost + i);
xBuffer += myChar;
}
String append = "api_key=" + key + "&" + msg;
xBuffer.replace("*URL*", url);
xBuffer.replace("*LEN*", String( append.length()));
xBuffer.replace("*APPEND*", append);
return xBuffer;
}
String createThingGet(String url, String key)
{
String xBuffer;
for (int i = 0; i <= sizeof(thingPost); i++)
{
char myChar = pgm_read_byte_near(thingPost + i);
xBuffer += myChar;
}
String append = "api_key=" + key;
xBuffer.replace("POST", "GET");
xBuffer.replace("*URL*", url);
xBuffer.replace("*LEN*", String( append.length()));
xBuffer.replace("*APPEND*", append);
return xBuffer;
}
String createThingGet(String url, String key, String msg)
{
String xBuffer;
for (int i = 0; i <= sizeof(thingPost); i++)
{
char myChar = pgm_read_byte_near(thingPost + i);
xBuffer += myChar;
}
String append = "api_key=" + key + "&" + msg;
xBuffer.replace("POST", "GET");
xBuffer.replace("*URL*", url);
xBuffer.replace("*LEN*", String( append.length()));
xBuffer.replace("*APPEND*", append);
return xBuffer;
}
//-----------------------------------------Config ESP8266-
boolean espConfig()
{
boolean success = true;
esp8266.setTimeout(5000);
success &= sendCom("AT+RST", "ready");
esp8266.setTimeout(1000);
if (configStation(SSID, PASSWORD)) {
success &= true;
debug("WLAN Connected");
debug("My IP is:");
debug(sendCom("AT+CIFSR"));
}
else
{
success &= false;
}
//shorter Timeout for faster wrong UPD-Comands handling
success &= sendCom("AT+CIPMUX=0", "OK");
success &= sendCom("AT+CIPMODE=0", "OK");
return success;
}
boolean configTCPServer()
{
boolean success = true;
success &= (sendCom("AT+CIPMUX=1", "OK"));
success &= (sendCom("AT+CIPSERVER=1,80", "OK"));
return success;
}
boolean configTCPClient()
{
boolean success = true;
success &= (sendCom("AT+CIPMUX=0", "OK"));
//success &= (sendCom("AT+CIPSERVER=1,80", "OK"));
return success;
}
boolean configStation(String vSSID, String vPASSWORT)
{
boolean success = true;
success &= (sendCom("AT+CWMODE=1", "OK"));
esp8266.setTimeout(20000);
success &= (sendCom("AT+CWJAP=\"" + String(vSSID) + "\",\"" +
String(vPASSWORT) + "\"", "OK"));
esp8266.setTimeout(1000);
return success;
}
boolean configAP()
{
boolean success = true;
success &= (sendCom("AT+CWMODE=2", "OK"));
success &= (sendCom("AT+CWSAP=\"NanoESP\",\"\",5,0", "OK"));
return success;
}
boolean configUDP()
{
boolean success = true;
success &= (sendCom("AT+CIPMODE=0", "OK"));
success &= (sendCom("AT+CIPMUX=0", "OK"));
success &=
sendCom("AT+CIPSTART=\"UDP\",\"192.168.255.255\",90,91,2", "OK"); //Importand
Boradcast...Reconnect IP
return success;
//----------------------------------------Controll ESP-------
}
boolean sendUDP(String Msg)
{
boolean success = true;
success &= sendCom("AT+CIPSEND=" + String(Msg.length() + 2),
">"); //+",\"192.168.4.2\",90", ">");
if (success)
{
success &= sendCom(Msg, "OK");
}
return success;
}
boolean sendCom(String command, char respond[])
{
esp8266.println(command);
if (esp8266.findUntil(respond, "ERROR"))
{
return true;
}
else
{
debug("ESP SEND ERROR: " + command);
return false;
}
}
String sendCom(String command)
{
esp8266.println(command);
return esp8266.readString();
}
//------------------------------------Debug Functions------
void serialDebug() {
while (true)
{
if (esp8266.available())
Serial.write(esp8266.read());
if (Serial.available())
esp8266.write(Serial.read());
}
}
void debug(String Msg)
{
if (DEBUG)
{
Serial.println(Msg);
}
}
Ende des Sketches
Hier noch eine Übersicht der
verschalteten Teile (mit Corel Draw erstellt):
Die Led zeigt übrigens noch an, wie warm oder kalt das Wetter momentan ist. Man
kann aufgrund der Led-Farbe entscheiden, ob man sich warm anziehen muß oder ob
eine leichte Jacke oder ein T-Shirt genügt. (kalt=blau, grün=normal, rot=heiß,
und das in unzähligen Farbvariationen (255x255x255 Farb-Variationen und Übergängen).
------------
|