PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Übersetzen von Nano+ESP8266 auf NodeMCU



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();
}

inka
22.04.2020, 17:37
ich weiss ja nicht wie viel erfahrung du mit arduino hast, scheint aber nicht sooo viiieeel zu sein. Kompiliere doch mal den code in der IDE für das nodeMCU - die fehlermeldungen müssten dir genügend antworten geben...
So würde ich zumindest versuchen die antwort auf deine frage rauszufinden...

Moppi
23.04.2020, 10:49
Hallo Parasolid,

ich würde mal bei R.Schick anfragen, ob das einfach umzuschreiben geht. Vielleicht erstellt er auch eine Version für nodeMCU. Ich kann mir aber vorstellen, dass er Gründe hatte, warum er einen NANO und ESP einsetzt. Ich habe kurz drüber geschaut und meine, dass das nicht so einfach ist. Also einfach im Sinn von ein paar Werte zu ändern und ein zwei Befehle und dann läufts auf einem nodeMCU. Das geht schon mit den Sensoren los, die man dort so anschließen kann, wenn man mal auf die Seite schaut. nodeMCU (ESP12-E) hat nicht so viele brauchbare Eingänge.
Ich würde das so machen, wie es auf der Seite steht. Ein NANO und das andere kosten nicht so viel Geld, dass man tagelang (womöglich Wochen nach Fehlern suchen) Programmcodes ändern müsste.


MfG