Arduino Mega + ESP8266 WLan Thermometer

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
}

Die Serielle Schnittstelle kann nur einen Partner haben.
Entweder USB, oder Funke.
Das ist kein Bussystem für 3 Teilnehmer, oder so.
Warnung: Du versuchst gerade die Ports zu grillen.

Tipp:
Lass USB, und damit Serial, für dein Terminal.
Nutze Serial1 für die Funke.

Du könntest dich auch mit SoftSerial vertraut machen.

Ok, das ist jetzt das was man als Fachchinesisch bezeichnen würde :wink: ;P. Ich habe am Ardulino nur den ESP8266 dran. Der Ardulino ist über USB mit dem PC verbunden.

Blacksmith:
Ok, das ist jetzt das was man als Fachchinesisch bezeichnen würde :wink:

Dann hast du ja was zum lernen!

Blacksmith:
;P. Ich habe am Ardulino nur den ESP8266 dran. Der Ardulino ist über USB mit dem PC verbunden.

Die Serielle Schnittstelle ist eine "Point to Point" Schnittstelle.
Nicht "Point to Point to Point" usw.
Und du hast 3 "Geräte" daran angeschlossen!

  • ATMega2560 (der Prozessor auf dem Arduino Mega2560)
  • ESP8266(das Funkmodul)
  • Seriel->USB Wandler( auch auf dem Arduino Mega2560)

Das gibt Scherben!
Oder Fehlfunktionen, Rauch, was auch immer ....
Das willst du nicht!
Das wollen wir alle nicht.

Darum mein Tipp:
Ab mit dem Funkmodul, SOFORT!
Klemme das Modul an eine andere Serielle Schnittstelle(der Mega hat 4 Stück).
Klemm die Funke an Serial1, Serial2 oder Serial3.
Und wenn dir das immer noch nicht reicht, dann nimm SoftSerial.

Ahja, ok das hab ich jetzt soweit geblickt, vermutlich ;).
Also sollte ich den ESP8266 lieber an Pin 18+19 anklemmen und nicht an 0+1?
Hab mal den Plan als anhang wie der "Entwicker" es sich vorstellt.

Also sollte ich den ESP8266 lieber an Pin 18+19 anklemmen und nicht an 0+1?

Yes!

Du hast einen Mega ADK?

Warnung:
Die 3,3V Quelle des Megas reicht nicht um den ESP8266 zu treiben.

Arduino Mega 2560 heist der also kein ADK ;), die 3,3 V kommen im moment von der Stromversorgung vom Steckbrett, nachdem ich jetzt umgesteckt habe und festgestellt habe das mein Steckbrett ne macke hat, leuchtet nu rote Lampe und blaue Lampe. Aber weiterhin keine Reaktion auf AT im Manager.

Software angepasst?
Tx an Rx und Rx an Tx?

RX-TX TX-RX gecheckt ;), in dem Sketch wüsst ich jetzt nicht was ich da anspassen müsste, find da nirgends nen Hinweis auf nen TX Port oder so.

find da nirgends nen Hinweis auf nen TX Port oder so.

(ich aber)
"Serial" habe ich in deinem Code gesehen!
"Serial" ist für die Kommunikation zum PC zuständig.

Für die Funke musst du JETZT natürlich "Serial1" verwenden.

Hab nu Serial.printin usw. in Serial1.printin usw. geändert, aber tut sich nüschts ;), Ja ich bin nicht sehr bewandert in diesen Dingen ;P, is nett das du so geduldig bist :wink: ich bin seit Tagen am verzweifeln ;). Vielleicht war es auch Wahnsinn soein Projekt überhaupt anzufangen, aber ich dachte ich kann den Sketch einfach kopieren die Bauteile zusammenlöten und es funzt, nu hab ich ne Kiste mit Bauteilen hier rumstehen und nur nen halbfertiges teil, dazu ne Frau die meckert das des eh nüschts wird^^, ich muss das Ding zum funzen bringen egal wie ;).

Ok, ein problem scheint in der IP zuliegen die mit 192.168.0.100 nicht mit dem existierenden Netzwer übereinstimmt, sie sollte eigentlich 192.168.178.XXX sein. AT+CWDHCP und AT+CIPSTA="192.168.178.199" waren nicht erfolgreich. Die Firmware-Version ist 0018000902-AI03. Wie kann ich die IP in der Version ändern?

Hmm....

Standardmäßig läuft der ESP8266 als Accesspoint. Du solltest ihn also bei deinen Dratlosnetzwerken in der Liste finden.

Versuchs doch mal mit dieser Lib: GitHub - itead/ITEADLIB_Arduino_WeeESP8266: An easy-to-use Arduino ESP8266 library besed on AT firmware.

Insbesondere das Beispiel "ConnectWiFi" sollte dann Verbindung mit deinem Router aufnehmen können.

Die Anmeldung an deinem Router muss übrigens nur einmal gemacht werden, der ESP8266 merkt sich die Zugangsdaten.

Ok, die Lib hab ich nu mal Installiert ;). Der ESP8266 läuft als Station(CWMODE=1) also als client. aber eben mit der IP 192.168.0.100 und ich hät ihn gern im Netzwerk mit 192.168.178.XXX.

Die Lib installieren reicht nicht....
Du musst sie auch nutzen.

Hab unter Sketch/Include Library die Datei ausgewählt, nu steht #include <doxygen.h>
#include <ESP8266.h> über meinem restlichen Sketch, das ist schätzungsweise so beabsichtigt, oder?

combie:
Insbesondere das Beispiel "ConnectWiFi" sollte dann Verbindung mit deinem Router aufnehmen können.

Datei->Beispiele->ESP8266->ConnectWiFi

Deine Zugangsdaten und richtige Baudraten eintragen, dann sollte das klappen.....

Ok, das kann ich ausprobieren werde ihn aber nicht sehen. Das erste Problem ist ja dabei das er sich weigert eine IP anzunehmen, solange er nicht unter 192.168.178.XXX läuft kann ich ihn ja nicht sehen oder drauf zugreifen vom Netzwerk aus, er schafft sich ja ein eigenes Netzwerk mit 192.168.0.XXX Adressierung.

Getestet und im Manager folgende Info erhalten:
setup begin
FW Version: þüþøüø@þð øú@úBüú üô …@@Ð! und noch viel mehr davon
to station err
Join AP failure
setup end

Erst ausprobieren, dann mäckern.

Habs probiert und mecker kein bischen ;), bin für jeden Brotkrumen der mich dem Ziel näher bring dankbar ;).