Letztes Jahr habe ich mit FS1000A-Sendern und passenden Empfängern versucht, einige Funksensoren dazu du bringen, dass sie über 433 MHz die Messwerte an den Raspberry Pi schicken. Auch die Versuche mit dem RF12b wollten nicht so richtig erfolgreich sein. Das Problem dabei war an sich nicht die Programmierung, eher ein Übertragungs-/Timingproblem.
Dann bin ich irgendwann auf die ESP8266-Reihe aufmerksam geworden. Die Module kombinieren viele Vorteile:
- Bereits implementiertes TCP/IP Protokoll (über WLAN)
- Vorteile eines Mikrokontrollers
- Energiesparend
- einfacher Zugriff auf IO-Pins
- Programmierbar mit der Arduino-IDE
- sehr kostengünstig
Die Module bieten eine serielle Schnittstelle zur Programmierung und für Konsolenausgabe an, man benötigt lediglich einen USB/seriell-Adapter wie diesen hier. Zum Testen habe ich mir drei Varianten des Moduls liefern lassen: ESP8266-01, ESP8266-12 und ESP8266-201. Die erste ist am weitesten verbreitet, also habe ich damit angefangen und wie folgt verkabelt:
Der FTDI-Adapter sieht hier ein wenig anders aus, die Pins werden aber gleich verbunden. Mann sollte übrigens genau drauf achten, dass man 3.3V Versorgungsspannung verwendet, die Module sind nicht tolerant zu 5V und werden’s vermutlich nicht überleben.
Zum Programmieren möchte ich die Arduino IDE verwenden, um im Bereich Mikrokontrollerprogrammierung bei der gleichen Entwicklungsumgebung und Sprache zu bleiben. Inzwischen gibt es auch eine bereits angepasste Variante, die man parallel zur bereits verwendeten IDE runterladen und ausführen kann, darin sind die ESP8266-Boards, Libraries und Beispiele bereits enthalten und man kann direkt loslegen.
Der erste Sketch sollte möglichst ein einfacher sein, sowas wie eine LED blinken zu lassen, etc., ich habe mit einer Messung und dem Hochladen zu data.sparkfun.com angefangen. 😉 Das hier ist mein Sketch, der von einem DHT22 die Temperatur und Luftfeuchtigkeit misst, den Heat-Index berechnet, die Versorgungsspannung ermittelt und die Ergebnisse zu Sparkfun hochlädt. Parallel kann man im Browser nachsehen, welche Daten ankommen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
/* * This sketch sends data via HTTP GET requests to data.sparkfun.com service. * * You need to get streamId and privateKey at data.sparkfun.com and paste them * below. Or just customize this script to talk to other HTTP servers. * */ extern "C" { #include "user_interface.h" uint16 readvdd33(void); } #include <ESP8266WiFi.h> #include "DHT.h" #include <Arduino.h> #define DHTPIN 2 // GPIO 2 pin of ESP8266 #define DHTTYPE DHT22 // DHT 22 (AM2302) ADC_MODE(ADC_VCC); const char* ssid = "..."; const char* password = "..."; const char* host = "data.sparkfun.com"; const char* publicKey = "..."; const char* privateKey = "..."; DHT dht(DHTPIN, DHTTYPE,30); // 30 is for cpu clock of esp8266 80Mhz void setup() { Serial.begin(9600); dht.begin(); delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.println(); Serial.print("ESP8266 Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); int c = 0; while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); c++; if (c > 20) {ESP.restart();} } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { delay(5000); // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); // Read temperature as Celsius float t = dht.readTemperature(); // Read temperature as Fahrenheit float f = dht.readTemperature(true); // Read power supply voltage float vdd = ESP.getVcc() / 1000.0; // Check if any reads failed and exit early (to try again). //if (isnan(h) || isnan(t) || isnan(f)) { // Serial.println("Failed to read from DHT sensor!"); // return; //} // Compute heat index // Must send in temp in Fahrenheit! float hi = dht.computeHeatIndex(t, h); Serial.print("Humidity: "); //Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); //Serial.print(t); Serial.print(" *C "); //Serial.print(f); Serial.print(" *F\t"); Serial.print("Heat index: "); //Serial.print(hi); Serial.println(" *F"); Serial.print("connecting to "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // We now create a URI for the request String url = "/input/"; url += publicKey; url += "?private_key="; url += privateKey; url += "&temp="; url += t; url += "&humidity="; url += h; url += "&heat="; url += hi; url += "&voltage="; url += vdd; Serial.print("Requesting URL: "); Serial.println(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(10); // Read all the lines of the reply from server and print them to Serial while(client.available()){ String line = client.readStringUntil('\r'); Serial.print(line); } Serial.println(); Serial.println("closing connection"); delay(30000); // Send data every 10 minutes } |
Die serielle Ausgabe habe ich auskommentiert, da ich sie nicht verwende. Ansonsten basiert der Sketch größtenteils auf einem Beispiel.
Und siehe da, es funktioniert und bei Sparkfun werden Daten geloggt.