Taugt das ding was oder ist es mist

Hallo,

es geht um ein Hailege Mega R3 ESP8266 WIFI-Modul mit 32M Speicher CH340G USB-TTL kompatibel Mega ESP8266 NodeMCU
hier der Link dazu

kann mir jemand sagen ob man den verwenden kann oder ob das ding nichts taugt?

mfg Kai

Ich würde mal sagen, es kommt drauf an, was du damit machen möchtest.
Das Teil wird wohl funktionieren.....

Hallo,
warum willst Du Dich mit zwei Prozessoren rumschlagen. Das Ding ist ein Exot kein Standard
Wenn Du was mit Wlan machen willst dann nimm einen ESP8266 oder ESP32. Wenn nicht dann meinetwegen einen Mega.

Einen Hinweis muss ich Dir allerdings noch geben alles was ESP ist hat 3,3V E/A . Da muss man bei zusätzlicher Hardware ein bisschen aufpassen. Vieles läuft aber inzwischen auch mit 3,3Volt. Für den Rest gibt es gibt Pegelwandler.

Wenn Du mehr E/A benötigst kannst Du auch zusätzliche E/A Expander über I2C anschließen.

ich würde es nicht nehmen. Die Kombination des MEGA mit dem ESP8266 über die Serielle Schnittstelle ist nicht anfängertauglich und für jene die etwas mehr Erfahrung haben immer eine Bremse.

Entscheide was du haben willst.
Wenn viele Ports, ist der Mega nett.
Wenn Wifi wichtig ist - nimm ein ESP8266 Bastlerboard wie z.B. einen NodeMCU.
Oder nimm ein Board mit einem ESP32.

Auch sollst du Abstand vom Arduino UNO R4 halten. Auch der hat einen ESP zu einen anderen Microcontroller dazugebastelt.

Bestimmt!

Habe keine Verwendung, finde das Board aber interessant.
u.A, wegen dem Schaltwandler darauf.

Gibts dazu auch ausführliche Informationen?
Schaltplan usw?

Die 32MB glaube ich übrigens nicht, dass sind sicher nur die üblichen 4MB Flash für den ESP

Wenn Du das als MegaBit liest, stimmt es :wink:

Mir sind diese µC-Kombis zu kompliziert.

Das werden wohl 32 Mbit sein, also 4 MB.
Zum Board selbst gibt es hier einige Infos.
In wieweit die Verbindung Mega - ESP über Pegelwandler geführt wird, kann ich nicht sehen.

Gruß Tommy

Gruß Tommy

Schon etwas älter. Reicht Dir das?

MEGA2560_ESP.pdf (49,6 KB)

Wollte damit ein System aufbauen um meinen Garten automatisch zu Bewässern .
Es wären 3 x 8 Relays Boards , 3x DHT22 in Gewächshäusern , 3x Capacitive Soil Moisture Sensor die in Chilis stecken und ein DS18B20 der mein Hauswasserwerk überwacht da es kein überhitzschutz hat . Der DS18B20 sollte eine E-Mail schicken wenn die Temperatur zu hoch ist und damit wahrscheinlich die Pumpe trockengelaufen ist . Die ganzen Sensorwerte und welches Relay gerade Aktiv ist wollte ich auf einer Webseite anzeigen lassen doch das alles geht nicht ohne Wlan.

Das ginge damit.
Es gibt so einige Hürden zu meistern.
Das Relaisboard ist eine davon.
Auch wenn da 220V auf den Relais stehen, sind die Boards zu einem sehr großen Teil nicht dafür geeignet.
Die Abstände auf der Platine sind da die größte Hürde.

Es wird immer wieder behauptet wird, dass die ja 5V sind und nicht mit 3,3V laufen, das schlichtweg falsch, da die Eingänge noch immer TTL-Pegel haben und unabhängig von der Betriebsspannung der Relais sind :slight_smile:

Alles andere ist erstmal nicht tragisch und machbar.
Ausser das:

:slight_smile:
Ja, ich weiß schon was Du meinst.
Dazu ist der ESP da drauf schon nicht schlecht.
Der baut Dir ein WIFI, einen Webserver bei Bedarf und kann zumindest Mails auch versenden.

Ob der MEGA dafür nicht etwas überdimensioniert ist?
ICH würde Dir zu einem ESP32 raten.
Nichts großartiges.

Lieber noch einen kleinen Display dazu, damit Du wenigstens ohne Web auch was siehst und solltest Du doch irgendwas mit 5V machen wollen, gibts für ein paar Cent Pegelwandler.

Ich sehe da lange Kabelverbindungen zu den einzelnen Sensoren.
Gib da mal etwas mehr Informationen dazu. Evtl. kommen da Probleme hinzu, die nicht einfach zu lösen sind.
Allerdings ist das erst mal eine Vermutung, die ich in meinem eigenen Projekt durch einzelne Controller umgangen habe.

Naja "behauptet", ist nur die halbe Wahrheit. Wir haben hier oft genug das Problem gehabt, das die 3,3 Volt bei einigen Relais-Modulen als LOW erkannt werden und damit schon schalten. Das muss nicht bei allen Modulen der Fall sein.

1 ESP32 = 1 Problem Programm für einen ESP32

1 Arduino Mega + 1 ESP8266 = 3 Probleme

Problem 1: Programm für den Arduino Mega
Problem 2: Programm für den ESP8266
Problem 3: Kommunikation zwischen Mega und ESP8266

Besser SHT30, SHT31 oder SHT40 nehmen. Die sind genauer.
Es sei denn du hast lange Kabelwege. I2C-Sensoren funktionieren nur auf 0,2 bis 1,5 m Kabellänge

Für die Überwachung der Pumpe gegen Trockenlauf würde ich eine möglichst simple direkt wirkende Einrichtung nehmen die auch ohne Microcontroller abschaltet.

Was man da am besten nimmt hängt von deiner Pumpe ab.
Schwimmerschalter mit Schliesserkontakt solange Wasserstand hoch genug in Reihe zum Relaiskontakt der öffnet sobald Wasserstand zu niedrig.

Dein Programm oder der Sensor könnten rumspinnen und dann brennt die Bude doch
Dazu solltest du mal Bilder von der Pumpe und der Einbausituation der Pumpe posten

Pruust!
Das eine Problem mit dem nächsten erschlagen.

off topic kurz halten

Na das übliche schnell kritisieren ohne zu begründen warum?
Und nachdenken darüber warum ein Youtube-Video Sinn machen würde auch Fehlanzeige.
Bei anderen forderst du immer nachdenken, nachlesen usw. ein - und selbst?

Habe nachgedacht und stelle mir die Frage, warum Du nicht in der Lage bist selber mal Einsatz zu zeigen?

Das Projekt wird wohl Sterben den ich finde nicht raus was ich falsch mache.

Ein fehler ist immer wieder dieser
-E (9122) gpio: gpio_set_level(227): GPIO output gpio_num error
ich kann machen was ich will das geht nicht weg.

Zweiter fehler und Dritter fehler die Relays schalten nicht zur angegeben Zeit und das Relay auf gpio14 ist permanent an obwohl keine Zeit gestellt ist.

Vierter Fehler Wachtdog und Temperaturüberwachung (DS18B20) senden keine Email bei Alarm obwohl alles stimmt .

Hier ist der gesamte Code villeicht können ja ein paar Profis mal ein Blick drauf werfen was für einen Mist ich gemacht habe.

#include <Wire.h>
#include <RTClib.h>
#include <WiFi.h>
#include <EEPROM.h>
#include <ESPAsyncWebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DHT.h>
#include <ESP32_MailClient.h>
#include <AsyncTCP.h>

#define EIN LOW
#define AUS HIGH

// 📡 WLAN-Zugangsdaten
const char* ssid = "";
const char* password = "";

// 🌍 Webserver
AsyncWebServer server(80);

// 🕒 DS3231 Echtzeituhr (RTC)
RTC_DS3231 rtc;

// 🌡️ DS18B20 - Temperatur-Sensor
#define ONE_WIRE_BUS 4  
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// 🌡️ DHT22 - Temperatur & Luftfeuchte-Sensor
#define DHTPIN 5  
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

// 📩 E-Mail-Client
SMTPData smtp;
#define EMAIL_SENDER ""
#define EMAIL_PASSWORD ""
#define EMAIL_RECIPIENT ""

// ⏳ Timer-Variablen für millis()
unsigned long lastSensorUpdate = 0;
unsigned long lastRelaisCheck = 0;
const long sensorInterval = 5000;  // Alle 5 Sekunden
const long relaisInterval = 1000;  // Alle 1 Sekunde

// 🌡️ Temperaturgrenze
const float TEMPERATUR_GRENZE = 30.0;

// 🔌 Relais-Schaltzeiten speichern
struct schaltZeit_t {
  int einZeit;  
  int ausZeit;
};

struct schaltRelais_t {
  byte gpio;
  schaltZeit_t schaltzeiten[6];
  bool status;
};

// 16 Relais mit Schaltzeiten
schaltRelais_t relais[16] = { 
  {12, {{700, 800}, {1800, 1900}} },   
  {14, {{1055, 1056}, {1810, 1910}} },   
  {27, {{1100, 1101}, {1820, 1920}} },   
  {26, {{730, 830}, {1830, 1930}} },   
  {25, {{740, 840}, {1840, 1940}} },   
  {33, {{750, 850}, {1850, 1950}} },   
  {32, {{760, 860}, {1860, 1960}} },   
  {19, {{770, 870}, {1870, 1970}} },   
  {18, {{780, 880}, {1880, 1980}} },   
  {5,  {{790, 890}, {1890, 1990}} },   
  {17, {{800, 900}, {1900, 2000}} },   
  {16, {{810, 910}, {1910, 2010}} },   
  {4,  {{820, 920}, {1920, 2020}} },   
  {0,  {{830, 930}, {1930, 2030}} },   
  {2,  {{840, 940}, {1940, 2040}} },   
  {15, {{850, 950}, {1950, 2050}} }    

};

// EEPROM Speicherplatz
#define EEPROM_SIZE 256

// 📩 E-Mail senden (nur für Temperaturalarm oder Watchdog)
void sendeMail(String betreff, String nachricht) {
    SMTPData smtp;
    
    smtp.setLogin("smtp.example.com", 465, "deine_email@example.com", "dein_passwort");
    smtp.setSender("ESP32 Alarm", "deine_email@example.com");
    smtp.setPriority("High");
    smtp.setSubject(betreff);
    smtp.setMessage(nachricht, false);
    smtp.addRecipient("empfaenger@example.com");

    if (!MailClient.sendMail(smtp)) {
        Serial.println("❌ E-Mail konnte nicht gesendet werden: " + MailClient.smtpErrorReason());
    } else {
        Serial.println("✅ E-Mail erfolgreich gesendet!");
    }

    smtp.empty(); // Speicher freigeben
}


// 🏁 Setup
void setup() {
  Serial.begin(115200);
  Wire.begin();
  EEPROM.begin(EEPROM_SIZE);

  // ⏳ RTC starten
  if (!rtc.begin()) {
    Serial.println("RTC nicht gefunden!");
    while (1);
  }

  // 📡 WLAN verbinden
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Verbunden!");

  // 🌍 Webserver starten
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
    request->send(200, "text/html", webPage());
  });

  server.begin();

  // 🔌 Relais-Pins als Ausgang setzen
  for (int i = 0; i < 2; i++) {
    pinMode(relais[i].gpio, OUTPUT);
    digitalWrite(relais[i].gpio, LOW);
  }

  // EEPROM Daten laden
  for (int i = 0; i < 2; i++) {
    EEPROM.get(i * sizeof(schaltRelais_t), relais[i]);
  }
}

// 🔄 Loop mit millis()
void loop() {
  unsigned long currentMillis = millis();

  // 🕒 RTC-Zeit auslesen und im Serial Monitor anzeigen
  DateTime now = rtc.now();
  Serial.print("⏰ Aktuelle Zeit: ");
  Serial.print(now.hour());
  Serial.print(":");
  Serial.print(now.minute());
  Serial.print(":");
  Serial.println(now.second());

  // 🌡️ Temperatur messen (alle 5 Sekunden)
  if (currentMillis - lastSensorUpdate >= sensorInterval) {
    lastSensorUpdate = currentMillis;
    sensors.requestTemperatures();
    float tempDS18B20 = sensors.getTempCByIndex(0);

    Serial.print("🌡️ DS18B20: "); Serial.print(tempDS18B20); Serial.println("°C");

    if (tempDS18B20 > TEMPERATUR_GRENZE) {
      sendeMail("🔥 Temperatur-Alarm!", "Die Temperatur ist auf " + String(tempDS18B20) + "°C gestiegen!");
    }
  }

  // 🔌 Relaissteuerung basierend auf RTC-Zeit
  if (currentMillis - lastRelaisCheck >= relaisInterval) {
    lastRelaisCheck = currentMillis;
    int currentTime = (now.hour() * 100) + now.minute();

    for (int i = 0; i < 16; i++) {
      bool state = false;
      for (int j = 0; j < 6; j++) {
        if (currentTime >= relais[i].schaltzeiten[j].einZeit && currentTime < relais[i].schaltzeiten[j].ausZeit) {
          state = true;
          break;
        }
      }
      relais[i].status = state;
      digitalWrite(relais[i].gpio, state ? HIGH : LOW);
    }
  }

  delay(1000);  // ⏳ 1 Sekunde warten, damit die Zeit nicht zu oft ausgegeben wird
}

// 🌍 HTML-Webseite für Relaissteuerung
String webPage() {
  String page = "<html><head>";
  page += "<meta name='viewport' content='width=device-width, initial-scale=1'>";
  page += "<style>body { font-family: Arial; }</style>";
  page += "</head><body>";
  page += "<h1>ESP32 Relais Steuerung</h1>";

  // Status anzeigen
  page += "<h2>Relais Status</h2><ul>";
  for (int i = 0; i < 2; i++) {
    page += "<li>Relais " + String(i + 1) + ": ";
    page += relais[i].status ? "<b style='color:green;'>EIN</b>" : "<b style='color:red;'>AUS</b>";
    page += "</li>";
  }
  page += "</ul>";

  page += "</body></html>";

  return page;
}

// 🐶 Watchdog-Funktion
void IRAM_ATTR watchdogISR() {
  sendeMail("⚠️ Watchdog-Alarm!", "Der ESP32 hat einen Watchdog-Fehler erkannt!");
  ESP.restart();  // ESP neu starten
}

hw_timer_t *watchdogTimer = NULL;

void setupWatchdog() {
  watchdogTimer = timerBegin(0, 80, true);
  timerAttachInterrupt(watchdogTimer, &watchdogISR, true);
  timerAlarmWrite(watchdogTimer, 5000000, false);
  timerAlarmEnable(watchdogTimer);
}

Vielen Dank

Zum Mail Problem...
In einer ISR komplexe Dinge aufzurufen ist schon mal bedenklich.

Unter Anderem, weil:
Da nicht garantiert ist, dass der komplexe Kram ins Ram geladen wurde.

Genau....das fängt schon damit an, dass du keine aussagekräftigen Kommentare im Sketch schreibst. Wie sollen wir da etwas erkennen ?
Du verwendest Treiber und Angaben zum ESP32, setzt aber einen ESP8266 ein.
Es gibt sicher noch mehr Mist, wie du selber schreibst, aber das sehe ich mir nicht weiter an.

Nachtrag.
Lösche deine Angaben zum Passwort und Namen!

Und wozu eine RTC wenn du die Zeit per NTP nehmen kannst.
Alles recht konfus, da keine Beschreibung vorhanden ist.

welches Board verwendest du nun?

Wenn du mehrere Fehler hast, die du nicht verstehst oder in den Griff kriegst, brauchst du mehrere Sketche, um die Fehler einzeln analysieren zu können.

Sollte ein Problem erst dadurch entstehen, dass du zwei Teil-Sketche zusammenfügst, wäre das was anderes als die vier beschriebenen Einzel-Probleme.

Ich würde auch einzelne Threads aufmachen.
Die Frage "Taugt das ding was oder ist es mist" hat ja damit auch nichts zu tun und ist eigentlich beantwortet.