Hallo Ihr Programmierer, Arduino Fans und Geeks ;),
Ich habe in einem anderen Forum eine halblebige Anleitung gefunden wie man nen WLan Thermometer mit dem Arduino und dem ESP8266 baut. Da ich aber nur sehr begrenztes wissen im bereich Programmierung und Mikroprozessoren habe, bitte ich euch um hilfe um dieses Projekt nachbauen zukönnen. Ich scanne seit tagen das Netz und YouTube und hab schon unzählige Tutorials und Anleitungen gelesen und Videos angesehen, aber hänge einfach fest und finde den Fehler nicht. Zum Setup:
Im moment versuch ich es erstmal auf dem Arduino 2560 zum laufen zubringen später soll das ein Nano oder Mini übernehmen. Die Verkabelung scheint unterschiedlich zusein, ein paar sagen RX-RX,TX-TX wobei die meisten wohl RX-TX,TX-RX bevorzugen. Habe beides erfolglos probiert.
Wenn ich den ESP8266 über den USB-TTL anschließe mit RX-TX,TX-RX taucht er auf an COM9 und ich kann über das Arduino Programm mit dem Serial Manager ihn ans WLan anbinden. Wenn ich dann den Arduino anschließe an USB dann taucht der Arduino an COM8 auf und ich kann den sketch aufspielen, allerdings wenn ich dann den ESP8266 anschliesse ans Arduino passiert garnichts wenn ich im Seriel Manager AT eingebe zum beispiel.
Die Stromversorgung vom ESP8266 kommt vom Steckbrett mit 3,3V an VCC und CH_PD. Masse ist ebenfalls auf dem Steckbrett. Der Arduino wird mit USB betrieben.
Der Sketch soll später Temperaturdaten an Thingspeak senden, wo ich sie von überall übers Internet abrufen kann, wobei ich da noch rauskriegen muss welche IPs ich wo eintragen muss. Doch zunächst muss es überhaupt mal laufen.
// Based on https://github.com/wvuong/bbqsmoker/blob/master/bbqsmoker.ino
#define DST_IP "199.199.199.199" // IP der Internetseite
int led = 13; //Pin der LED
int mess1 = 0;
int vcc;
String stringValue = "";
const int numProbes = 2;
const int bufferLength = 30;
float temp;
int Temperatur;
int Temperatur1;
// probe datastructure
struct Probe {
String name;
int pin;
double A;
double B;
double C;
int buffer[bufferLength];
int currentTemp;
int resistor;
};
// probes array
Probe probes[2];
void setup() {
Serial.begin(9600);
Serial.println("AT+RST");
//WiFi modul bootup
delay(800);
//"client" mode
Serial.println("AT+CWMODE=1");
//Einwahl ins WLAN
//SSID und Passwort auf das eigene Netzwerk anpassen.
Serial.println("AT+CWJAP=\"SSID\",\"Passwort\"");
// configure probes
Probe p0 = Probe();
p0.name = "ET-732-1";
p0.pin = A1;
p0.A = 5.36924e-4;
p0.B = 1.91396e-4;
p0.C = 6.60399e-8;
p0.resistor = 22000;
probes[0] = p0;
Probe p1 = Probe();
p1.name = "ET-732-2";
p1.pin = A2;
p1.A = 5.36924e-4;
p1.B = 1.91396e-4;
p1.C = 6.60399e-8;
p1.resistor = 22001;
probes[1] = p1;
delay(2000);
}
void loop() {
int sensorValue = 0;
int outputValue = 0;
// loop für jeden Geber
for (int i = 0; i < numProbes; i++) {
Probe *ptr = &probes[i];
// Wert einlesen:
outputValue = readAndOverSample((*ptr).pin, (*ptr).A, (*ptr).B, (*ptr).C, (*ptr).resistor);
// Wert in den Buffer schreiben
(*ptr).currentTemp = outputValue;
for (int i = bufferLength -1; i >= 1; i--) {
(*ptr).buffer[i] = (*ptr).buffer[i-1];
}
(*ptr).buffer[0] = outputValue;
}
for (int i = 0; i < numProbes; i++) {
Probe *ptr = &probes[i];
// maximal 4 Geber!
int x; int y;
if (i % 2 == 0) {
x = 0;
}
else if (i % 2 == 1) {
x = 8;
}
if (i / 2 == 0) {
y = 0;
}
else if (i / 2 == 1) {
y = 1;
}
}
delay(10000);
int per = 50000/numProbes/5000;
for (int p = 0; p < per; p++) {
for (int i = 0; i < numProbes; i++) {
Probe *ptr = &probes[i];
// Durchschnitt errechnen 5 Minuten
int five, fifteen, thirty;
int accum = 0;
for (int i = 0; i < 5; i++) {
if ((*ptr).buffer == 0) {
accum = 0;
break;
}
accum += (*ptr).buffer[i];
}
five = accum/5;
// Durchschnitt errechnen 15 Minuten
accum = 0;
for (int i = 0; i < 15; i++) {
if ((*ptr).buffer == 0) {
accum = 0;
break;
}
accum += (*ptr).buffer[i];
}
fifteen = accum/15;
// Durchschnitt errechnen 30 Minuten
accum = 0;
for (int i = 0; i < 30; i++) {
if ((*ptr).buffer == 0) {
accum = 0;
break;
}
accum += (*ptr).buffer[i];
}
thirty = accum/30;
}
}
// Spannungsmessung mit Spannnungsteiler
int mess1 = analogRead(mess1);
vcc = ((mess1/36.35)*1000); // Faktor für Spannungsteiler
//Vertbindung zum web server
String cmd = "AT+CIPSTART=\"TCP\",\""; //make this command: AT+CPISTART="TCP","199.199.199.199",80
cmd += DST_IP;
cmd += "\",80";
Serial.println(cmd);
//warten auf Verlinkung
delay(300);
//HTTP GET Request
cmd = "GET /datei.php?Wert1="; // Datei des Internetservices aufrufen
cmd += Temperatur;
cmd += "&Wert2=";
cmd += Temperatur1;
cmd +="&VCC=";
cmd += vcc;
cmd += " HTTP/1.0\r\n";
cmd += "Host: 217.160.107.197\r\n\r\n";
//Größe des Requests für ESP8266
Serial.print("AT+CIPSEND=");
Serial.println(cmd.length());
Serial.println(cmd);
}
int readAndOverSample(int apin, double A, double B, double C, int resistor) {
int sensorvalue = 0;
unsigned int accumulated = 0;
int numsamples = 64;
int n = 0;
sensorvalue = analogRead(apin);
delay(2);
// einlesen der 64 samples
for (int i = 0; i < numsamples; i++) {
sensorvalue = analogRead(apin);
if (sensorvalue == 0 || sensorvalue >= 1023) {
return -1;
}
accumulated += sensorvalue;
n++;
delay(2);
}
unsigned int ADCmax = (1 << 13) - 1;
unsigned int ADCval = accumulated >> 3;
float R, T;
R = log( resistor / ((ADCmax/(float)ADCval) - 1.0f));
T = 1.0f / ((C * R * R + B) * R + A);
temp = (T - 273.15f);
// Serial.print("temp="); Serial.println(temp);
if (resistor > 22000) {
Temperatur = temp; // Wert für Internetseite speichern
}
else {
Temperatur1 = temp; // Wert für Internetseite speichern
}
//return temp;
delay(60000); // 1 Minute warten
}