Wehr genießen

Home
Interessantes
Arduino
Wehr

 Bild Dietmar Bild Ida
Ida und Dietmar 22 Jahre auf Teneriffa

Letzte HP Änderung:
17.09.2019

 

 

Es gibt viele Dinge zwischen Himmel und Erde, die man nicht kaufen kann,

 aber wir genießen sie!

 

 Aktuelle Temperaturen "79664 Wehr" über ESP8266

über Internet of Things halbstündlich aktualisierte Temperaturen von Ida und Dietmar in Wehr über die letzen 3 Tage. (Mit der Maus über die Temperaturlinie fahren, um für jede vergangene halbe Stunde die Temperatur zu sehen)

 

 

 << 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  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 endlich eingebaute, fertige IoT Temperaturmodul.

Erste Internet-Übertragung am 7. Juni 2019.

Ohne Computer, 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 (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 7.6.2019:

String file1="P21_Thingspeak"; //openweather.com Wehr,DE
String file2="_34";// 25.3.19, neu 31.5.2019

#define SSID "xxxxxx"
#define PASSWORD "xxxxxxx"
#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 "xxxxxxx"
#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=3;// korrigiert und angepasst nach ca. 3 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, 255, 0);
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;

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).

------------

 

 
 

    

 

 

 

 

 Campari-Kühler mit Arduino und Peltier-Modul

Die "Kreativ mit Technik-Zeitschrift"   hat meinen Campari Kühler in der Ausgabe 5/2016 2-seitig vorgestellt.

 

 

 

bearbeitet: 30.12.17