Parasolid
21.04.2020, 20:20
Hallo zusammen,
ich habe mit Arduino schon Erfahrung, aber noch nie in Richtung Netzwerk, sprich WLAN.
Ich möchte mir einen Bienenstockwaage bauen. Als Vorlage dient ein tolles Projekt auf beelogger.de.
Hier kommt ein Arduino Nano mit ESP 8266-01 zum Einsatz. Ich würde jetzt stattdessen gerne ein NodeMCU einsetzen. Könnt ihr mir sagen, wie ich den Programmtext abändern muss? An welchen Stellen muss ich hier überall ansetzen? Reicht es die ganzen Pins richtig zuzuordnen oder wäre hier deutlich mehr zu tun. Dann würde ich vielleicht doch erst mal auf Nano+ESP zurückgreifen um mich in die Materie erst mal richtig einzuarbeiten.
Hier ist das Originalprogramm des Sketches mit dem ich einsteigen möchte zum downloaden: https://beelogger.de/?download=195458
Oder direkt als Code hier:
/*
(C) 2020 R.Schick
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// beelogger.de - Arduino Datenlogger für Imker
// Erläuterungen dieses Programmcodes unter http://beelogger.de
// Version 20.01.2020
// Name des WLAN-Zugangspunkts
const char Access_Point[] PROGMEM = "WLan_Name_SSID";
// Passwort des Zugangspunktes
const char AP_Passwort[] PROGMEM = "WLan_Passwort";
// Domainname zum Webserver mit beelogger-Skript, Bsp:"meineDomain.de";
const char serverName[] PROGMEM = "community.beelogger.de";
// GET mit Verzeichnis Webserver-Skript und das PHP Skript für den jeweiligen beelogger
// Bsp: "GET /mein_ordner/beelogger6/beelogger_log.php?"
// Achtung: Stringlänge muss zur Variable "parameter" in send_data_via_wlan() passen
// Anzahl Byte: 10 20 30 40 50
const char pfad[] PROGMEM = "GET /meinordner/beeloggerx/beelogger_log.php?";
// Passwort vom Webserver-Skript
const char Passwort[] PROGMEM = "Log"; // Log = Default
//----------------------------------------------------------------
// Konfiguration beelogger
//----------------------------------------------------------------
#define HX711_SCK A0 // HX711 S-Clock
#define Modul_CS 10 // Ethernet abschalten
#define Power_Pin 4 // Power On
//----------------------------------------------------------------
#define Seriell_Baudrate 9600
//----------------------------------------------------------------
// Konfiguration ESP-8266-01 WLAN Modul
//----------------------------------------------------------------
byte ESP_RX = 8;
byte ESP_TX = 9;
#define ESP_Baudrate 9600
#define ESP_RESET A2
#include <ESP_beelogger.h>
C_WLAN_ESP01 my_esp;
const char Str_Http[] PROGMEM = " HTTP/1.1\r\n";
const char Str_Con[] PROGMEM = "Connection: close\r\n\r\n";
//----------------------------------------------------------------
// Test-Messdaten (regulär kommen die Messdaten von den Sensoren)
float TempIn = 25.00;
float TempOut = 35.00;
float FeuchteIn = 40.00;
float FeuchteOut = 60.00;
float Licht = 50000.00;
long Gewicht = 25000;
float Batteriespannung = 3.70;
float Solarspannung = 1.70;
bool OK = true;
void setup() {
char parameter[80], data[64];
int Service = 0;
digitalWrite (HX711_SCK, HIGH); //HX711 aus
pinMode(HX711_SCK, OUTPUT);
digitalWrite(Modul_CS, HIGH); // Modul Ethernet usw. aus
pinMode(Modul_CS, OUTPUT);
digitalWrite(Power_Pin, HIGH); // Power an
pinMode(Power_Pin, OUTPUT);
digitalWrite(ESP_RESET, HIGH); // ESP8266 an
pinMode(ESP_RESET, OUTPUT);
Serial.begin(Seriell_Baudrate);
Serial.println(F("ESP 8266-01 Test Sketch 08.04.2020"));
Serial.flush();
delay(1000);
Serial.println(F("Abfrage Modul ... "));
if (my_esp.init(ESP_Baudrate)) {
Serial.println("i.O.");
my_esp.mode(); // Station Mode permanent
Serial.println();
Serial.println(F("ESP Firmware:"));
my_esp.firmware(); // firmware abfragen
Serial.println(my_esp.buffer);
Serial.println();
Serial.println(F("WLAN Information:"));
my_esp.signal(0);
strcpy_P(parameter, Access_Point);
my_esp.signal(parameter); // hole Signalstärke
strcpy(parameter, my_esp.buffer);
char cc = ',';
char *pos = strchr(parameter, cc); // suche ','
if (pos) {
Service = atoi(pos + 1);
}
if ((Service > -10)) {
Serial.print(F("Signalstärke unklar: "));
}
if ((Service < -90)) {
Serial.print(F("Signal schwach: "));
}
if (Service) {
Serial.print(F("Signalstaerke: "));
}
Serial.print(Service);
Serial.println(F(" dB"));
Serial.println();
Serial.flush();
delay(500);
my_esp.send("AT+CWMODE_DEF=1");
delay(1000);
}
else {
OK = false;
Serial.println(F("Modul konnte nicht abgefragt werden"));
Serial.println(my_esp.buffer);
Serial.println();
ESP_Abschaltung();
}
if (OK) {
strcpy_P(parameter, Access_Point);
Serial.print(F("Verbinde zum WLAN: "));
Serial.print(parameter);
Serial.println(" ... ");
strcpy_P(data, AP_Passwort);
if (my_esp.join(parameter, data)) {
Serial.println(F("WLAN Verbindung OK"));
Serial.println();
Serial.println();
}
else {
OK = false;
Serial.println(F("Verbindungsfehler!"));
Serial.println();
ESP_Abschaltung();
}
}
if (OK) {
Serial.println(F("Verbinde mit Server ... "));
strcpy_P(parameter, serverName);
Serial.print(parameter);
if (my_esp.Connect(parameter)) {
Serial.println(F(" ... connect: OK"));
Serial.println();
}
else {
OK = false;
Serial.println(F(" connect fehlgeschlagen"));
Serial.println();
Serial.println(my_esp.buffer);
Serial.println();
ESP_Abschaltung();
}
}
#if 0
if (OK) {
unsigned long t;
char c = 'x';
Serial.println(F("Test beginnen j/n ?"));
Serial.println(F("Eingabe von 'j' und bestätigen mit 'Enter' startet den"));
Serial.println(F("Transfer der Testdaten"));
Serial.println();
t = millis();
do {
if (Serial.available() > 0) {
c = Serial.read();
Serial.print(c);
Serial.println();
break;
}
} while ((millis() - t) < 10000); // 10 sec Zeit
if (c == 'j') {
OK = true;
}
else {
ESP_Abschaltung();
OK = false;
}
}
#endif
}
void loop() {
char KonvertChar[15];
char data[80];
char parameter[64];
if (OK) {
long Check = round(TempIn + TempOut + FeuchteIn + FeuchteOut + Licht + Gewicht + Solarspannung + Batteriespannung);
if (my_esp.prep_send(300)) { // fiktive Länge, senden wird mit 0x00 gestartet
Serial.println(F("Uebertrage Daten zum Webserver ..."));
Serial.flush();
//"GET " + url + php + "?" + Daten + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
// Wichtig: der String darf von der url bis Ende der Daten keine Leerzeichen enthalten
strcpy_P(parameter, pfad);
Serial.println(parameter);
Serial.flush();
my_esp.send(parameter);
// erstelle Daten
my_esp.send("Passwort=");
strcpy_P(parameter, Passwort);
my_esp.send(parameter);
my_esp.send("&TempIn=");
dtostrf(TempIn, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&TempOut=");
dtostrf(TempOut, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&FeuchteIn=");
dtostrf(FeuchteIn, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&FeuchteOut=");
dtostrf(FeuchteOut, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&Licht=");
dtostrf(Licht, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&Gewicht=");
dtostrf(Gewicht, 1, 0, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&VBatt=");
dtostrf(Batteriespannung, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&VSolar=");
dtostrf(Solarspannung, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&Check=");
dtostrf(Check, 6, 2, KonvertChar);
my_esp.send(KonvertChar);
// ende Daten
//
strcpy_P(parameter, Str_Http);
my_esp.send( parameter);
my_esp.send("Host: ");
strcpy_P(parameter, serverName);
my_esp.send( parameter);
my_esp.send("\r\n");
strcpy_P(parameter, Str_Con);
my_esp.send( parameter);
my_esp.send(0x00); // Startkommando senden
OK = false;
if (my_esp.sendCommand(0, 500, "SEND OK")) {
//Serial.println(F("SEND OK"));
}
if (my_esp.sendCommand(0, 2000, "200 OK")) {
//Serial.println(F("HTTP OK"));
if (my_esp.sendCommand(0, 5000, "ok *")) {
Serial.println(F("Quittung OK"));
OK = true;
// Empfangsbuffer auswerten
// Format Quittung aus beelogger-log.php
// echo "5ok*" = 5 Minuten
// echo "25ok*" = 25 Minuten
// echo "150ok*" = 150 Minuten -> 2,5 Stunden
int n = atoi(my_esp.buffer); // Konvertiere str in int
Serial.println();
if (n > 0) {
Serial.print("Intervallvorgabe vom Server: ");
Serial.print(n);
Serial.println(" Minuten ");
}
else {
Serial.print("Kein Intervall vom Server vorgegeben. ");
Serial.println(my_esp.buffer);
Serial.println();
Serial.println(n);
}
}
else {
Serial.println(F("Quittung Fehler!"));
Serial.println(my_esp.buffer);
OK = false;
}
}
if (my_esp.quit()) {
Serial.println(F("Restart OK"));
}
else {
OK = false;
}
Serial.flush();
delay(2000);
if (my_esp.init(ESP_Baudrate)) { // baud rate
Serial.println("...");
strcpy_P(parameter, Access_Point);
strcpy_P(data, AP_Passwort);
if (my_esp.join(parameter, data)) {
Serial.println("..");
strcpy_P(parameter, serverName);
if (my_esp.Connect(parameter))
Serial.println(".");
OK = true;
}
}
} // prep_send
if (OK) {
// Test-Messdaten um 1 erhöhen
TempIn++;
TempOut++;
TempOut++;
FeuchteIn++;
FeuchteOut++;
FeuchteOut++;
Licht++;
Gewicht++;
Batteriespannung++;
Solarspannung++;
if ((int)TempIn % 3) {
TempOut = TempOut - 3;
FeuchteIn = FeuchteIn - 2;
}
// Abschaltung nach 5 Datenübertragungen
Serial.println(TempIn);
if (TempIn >= 30.0) {
Serial.println(F("Test erfolgreich beendet"));
OK = false;
ESP_Abschaltung();
}
}
else {
Serial.println(F("Fehler im Test!"));
ESP_Abschaltung();
}
} // if OK
}
void ESP_Abschaltung() {
Serial.println(F("Verbindungen werden getrennt"));
Serial.println();
my_esp.disConnect();
my_esp.quit();
delay(100);
my_esp.end();
Serial.end();
}
ich habe mit Arduino schon Erfahrung, aber noch nie in Richtung Netzwerk, sprich WLAN.
Ich möchte mir einen Bienenstockwaage bauen. Als Vorlage dient ein tolles Projekt auf beelogger.de.
Hier kommt ein Arduino Nano mit ESP 8266-01 zum Einsatz. Ich würde jetzt stattdessen gerne ein NodeMCU einsetzen. Könnt ihr mir sagen, wie ich den Programmtext abändern muss? An welchen Stellen muss ich hier überall ansetzen? Reicht es die ganzen Pins richtig zuzuordnen oder wäre hier deutlich mehr zu tun. Dann würde ich vielleicht doch erst mal auf Nano+ESP zurückgreifen um mich in die Materie erst mal richtig einzuarbeiten.
Hier ist das Originalprogramm des Sketches mit dem ich einsteigen möchte zum downloaden: https://beelogger.de/?download=195458
Oder direkt als Code hier:
/*
(C) 2020 R.Schick
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// beelogger.de - Arduino Datenlogger für Imker
// Erläuterungen dieses Programmcodes unter http://beelogger.de
// Version 20.01.2020
// Name des WLAN-Zugangspunkts
const char Access_Point[] PROGMEM = "WLan_Name_SSID";
// Passwort des Zugangspunktes
const char AP_Passwort[] PROGMEM = "WLan_Passwort";
// Domainname zum Webserver mit beelogger-Skript, Bsp:"meineDomain.de";
const char serverName[] PROGMEM = "community.beelogger.de";
// GET mit Verzeichnis Webserver-Skript und das PHP Skript für den jeweiligen beelogger
// Bsp: "GET /mein_ordner/beelogger6/beelogger_log.php?"
// Achtung: Stringlänge muss zur Variable "parameter" in send_data_via_wlan() passen
// Anzahl Byte: 10 20 30 40 50
const char pfad[] PROGMEM = "GET /meinordner/beeloggerx/beelogger_log.php?";
// Passwort vom Webserver-Skript
const char Passwort[] PROGMEM = "Log"; // Log = Default
//----------------------------------------------------------------
// Konfiguration beelogger
//----------------------------------------------------------------
#define HX711_SCK A0 // HX711 S-Clock
#define Modul_CS 10 // Ethernet abschalten
#define Power_Pin 4 // Power On
//----------------------------------------------------------------
#define Seriell_Baudrate 9600
//----------------------------------------------------------------
// Konfiguration ESP-8266-01 WLAN Modul
//----------------------------------------------------------------
byte ESP_RX = 8;
byte ESP_TX = 9;
#define ESP_Baudrate 9600
#define ESP_RESET A2
#include <ESP_beelogger.h>
C_WLAN_ESP01 my_esp;
const char Str_Http[] PROGMEM = " HTTP/1.1\r\n";
const char Str_Con[] PROGMEM = "Connection: close\r\n\r\n";
//----------------------------------------------------------------
// Test-Messdaten (regulär kommen die Messdaten von den Sensoren)
float TempIn = 25.00;
float TempOut = 35.00;
float FeuchteIn = 40.00;
float FeuchteOut = 60.00;
float Licht = 50000.00;
long Gewicht = 25000;
float Batteriespannung = 3.70;
float Solarspannung = 1.70;
bool OK = true;
void setup() {
char parameter[80], data[64];
int Service = 0;
digitalWrite (HX711_SCK, HIGH); //HX711 aus
pinMode(HX711_SCK, OUTPUT);
digitalWrite(Modul_CS, HIGH); // Modul Ethernet usw. aus
pinMode(Modul_CS, OUTPUT);
digitalWrite(Power_Pin, HIGH); // Power an
pinMode(Power_Pin, OUTPUT);
digitalWrite(ESP_RESET, HIGH); // ESP8266 an
pinMode(ESP_RESET, OUTPUT);
Serial.begin(Seriell_Baudrate);
Serial.println(F("ESP 8266-01 Test Sketch 08.04.2020"));
Serial.flush();
delay(1000);
Serial.println(F("Abfrage Modul ... "));
if (my_esp.init(ESP_Baudrate)) {
Serial.println("i.O.");
my_esp.mode(); // Station Mode permanent
Serial.println();
Serial.println(F("ESP Firmware:"));
my_esp.firmware(); // firmware abfragen
Serial.println(my_esp.buffer);
Serial.println();
Serial.println(F("WLAN Information:"));
my_esp.signal(0);
strcpy_P(parameter, Access_Point);
my_esp.signal(parameter); // hole Signalstärke
strcpy(parameter, my_esp.buffer);
char cc = ',';
char *pos = strchr(parameter, cc); // suche ','
if (pos) {
Service = atoi(pos + 1);
}
if ((Service > -10)) {
Serial.print(F("Signalstärke unklar: "));
}
if ((Service < -90)) {
Serial.print(F("Signal schwach: "));
}
if (Service) {
Serial.print(F("Signalstaerke: "));
}
Serial.print(Service);
Serial.println(F(" dB"));
Serial.println();
Serial.flush();
delay(500);
my_esp.send("AT+CWMODE_DEF=1");
delay(1000);
}
else {
OK = false;
Serial.println(F("Modul konnte nicht abgefragt werden"));
Serial.println(my_esp.buffer);
Serial.println();
ESP_Abschaltung();
}
if (OK) {
strcpy_P(parameter, Access_Point);
Serial.print(F("Verbinde zum WLAN: "));
Serial.print(parameter);
Serial.println(" ... ");
strcpy_P(data, AP_Passwort);
if (my_esp.join(parameter, data)) {
Serial.println(F("WLAN Verbindung OK"));
Serial.println();
Serial.println();
}
else {
OK = false;
Serial.println(F("Verbindungsfehler!"));
Serial.println();
ESP_Abschaltung();
}
}
if (OK) {
Serial.println(F("Verbinde mit Server ... "));
strcpy_P(parameter, serverName);
Serial.print(parameter);
if (my_esp.Connect(parameter)) {
Serial.println(F(" ... connect: OK"));
Serial.println();
}
else {
OK = false;
Serial.println(F(" connect fehlgeschlagen"));
Serial.println();
Serial.println(my_esp.buffer);
Serial.println();
ESP_Abschaltung();
}
}
#if 0
if (OK) {
unsigned long t;
char c = 'x';
Serial.println(F("Test beginnen j/n ?"));
Serial.println(F("Eingabe von 'j' und bestätigen mit 'Enter' startet den"));
Serial.println(F("Transfer der Testdaten"));
Serial.println();
t = millis();
do {
if (Serial.available() > 0) {
c = Serial.read();
Serial.print(c);
Serial.println();
break;
}
} while ((millis() - t) < 10000); // 10 sec Zeit
if (c == 'j') {
OK = true;
}
else {
ESP_Abschaltung();
OK = false;
}
}
#endif
}
void loop() {
char KonvertChar[15];
char data[80];
char parameter[64];
if (OK) {
long Check = round(TempIn + TempOut + FeuchteIn + FeuchteOut + Licht + Gewicht + Solarspannung + Batteriespannung);
if (my_esp.prep_send(300)) { // fiktive Länge, senden wird mit 0x00 gestartet
Serial.println(F("Uebertrage Daten zum Webserver ..."));
Serial.flush();
//"GET " + url + php + "?" + Daten + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
// Wichtig: der String darf von der url bis Ende der Daten keine Leerzeichen enthalten
strcpy_P(parameter, pfad);
Serial.println(parameter);
Serial.flush();
my_esp.send(parameter);
// erstelle Daten
my_esp.send("Passwort=");
strcpy_P(parameter, Passwort);
my_esp.send(parameter);
my_esp.send("&TempIn=");
dtostrf(TempIn, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&TempOut=");
dtostrf(TempOut, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&FeuchteIn=");
dtostrf(FeuchteIn, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&FeuchteOut=");
dtostrf(FeuchteOut, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&Licht=");
dtostrf(Licht, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&Gewicht=");
dtostrf(Gewicht, 1, 0, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&VBatt=");
dtostrf(Batteriespannung, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&VSolar=");
dtostrf(Solarspannung, 4, 2, KonvertChar);
my_esp.send(KonvertChar);
my_esp.send("&Check=");
dtostrf(Check, 6, 2, KonvertChar);
my_esp.send(KonvertChar);
// ende Daten
//
strcpy_P(parameter, Str_Http);
my_esp.send( parameter);
my_esp.send("Host: ");
strcpy_P(parameter, serverName);
my_esp.send( parameter);
my_esp.send("\r\n");
strcpy_P(parameter, Str_Con);
my_esp.send( parameter);
my_esp.send(0x00); // Startkommando senden
OK = false;
if (my_esp.sendCommand(0, 500, "SEND OK")) {
//Serial.println(F("SEND OK"));
}
if (my_esp.sendCommand(0, 2000, "200 OK")) {
//Serial.println(F("HTTP OK"));
if (my_esp.sendCommand(0, 5000, "ok *")) {
Serial.println(F("Quittung OK"));
OK = true;
// Empfangsbuffer auswerten
// Format Quittung aus beelogger-log.php
// echo "5ok*" = 5 Minuten
// echo "25ok*" = 25 Minuten
// echo "150ok*" = 150 Minuten -> 2,5 Stunden
int n = atoi(my_esp.buffer); // Konvertiere str in int
Serial.println();
if (n > 0) {
Serial.print("Intervallvorgabe vom Server: ");
Serial.print(n);
Serial.println(" Minuten ");
}
else {
Serial.print("Kein Intervall vom Server vorgegeben. ");
Serial.println(my_esp.buffer);
Serial.println();
Serial.println(n);
}
}
else {
Serial.println(F("Quittung Fehler!"));
Serial.println(my_esp.buffer);
OK = false;
}
}
if (my_esp.quit()) {
Serial.println(F("Restart OK"));
}
else {
OK = false;
}
Serial.flush();
delay(2000);
if (my_esp.init(ESP_Baudrate)) { // baud rate
Serial.println("...");
strcpy_P(parameter, Access_Point);
strcpy_P(data, AP_Passwort);
if (my_esp.join(parameter, data)) {
Serial.println("..");
strcpy_P(parameter, serverName);
if (my_esp.Connect(parameter))
Serial.println(".");
OK = true;
}
}
} // prep_send
if (OK) {
// Test-Messdaten um 1 erhöhen
TempIn++;
TempOut++;
TempOut++;
FeuchteIn++;
FeuchteOut++;
FeuchteOut++;
Licht++;
Gewicht++;
Batteriespannung++;
Solarspannung++;
if ((int)TempIn % 3) {
TempOut = TempOut - 3;
FeuchteIn = FeuchteIn - 2;
}
// Abschaltung nach 5 Datenübertragungen
Serial.println(TempIn);
if (TempIn >= 30.0) {
Serial.println(F("Test erfolgreich beendet"));
OK = false;
ESP_Abschaltung();
}
}
else {
Serial.println(F("Fehler im Test!"));
ESP_Abschaltung();
}
} // if OK
}
void ESP_Abschaltung() {
Serial.println(F("Verbindungen werden getrennt"));
Serial.println();
my_esp.disConnect();
my_esp.quit();
delay(100);
my_esp.end();
Serial.end();
}