INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ESP8266 als Aktor
11.01.2020, 20:17
Beitrag #1
ESP8266 als Aktor
Hallo zusammen,

vor einigen Monaten habe ich die Vielseitigkeiten von Arduino Nano, Uno, ESP8266 und natürlich ESP32 entdeckt, beschäftige mich seitdem recht intensiv damit und konnte auch schon einige Projekte umsetzen.

Nun aber komme ich bei, zugegeben etwas größerem Projekt, einfach nicht weiter und daher meine Anmeldung hier im Forum.
Ich würde mein zu Hause gern mit einer SmartHome Zentrale (die läuft schon) und den zugehörigen Aktoren ausstatten.
Für die Zentrale nutze ich einen ESP32 mit Touchscreen und für die Aktoren ESP8266 mit den jeweiligen Sensoren, Relais etc.

Und schon beim ersten Aktor, einem ESP8266 mit WiFi, an den ich eine 4 Kanal Relaiskarte angeschlossen habe, hänge ich.

Ich habe diesen Sketch hier:

Code:
//library for WiFi
#include <ESP8266WiFi.h>

//library for the used message protocol
#include "AT_MessageBuffer.h"

//library for ESP Now
extern "C" {
  #include <espnow.h>
}

//SSID to search for
#define GW_SSID "xxxxxxxxxxxxx"
#define GW_PW "xxxxxxxxxxxx"

//flag to switch debug messages on
#define DEBUG true

#define SEND_TIMEOUT 2000  // 2 Sekunden timeout

#define INTERVALL 10000 //intervall = 10 seconds

//define channels for the relais
#define CHANNEL_RELAIS 0

//Pins to connect the sensors
#define RELAIS_PIN 2

//Data structure to save server MAC address
//and a checksum inRTC memory
struct MEMORYDATA {
  uint32_t crc32; //checksum for validation
  uint8_t mac[6];
};

//MAC address and WLAN channel
MEMORYDATA statinfo;
//time when last sent
uint32_t last_sent = 0; //Timestamp for last sent
uint8_t relais_status = 1; //current status of the relais
String mymac; //own mac address

//we have two message buffers for send and receive
AT_MessageBuffer sendmsg;
AT_MessageBuffer rcvmsg;

//write server MAC and checksum to RTC memory
void UpdateRtcMemory() {
    uint32_t crcOfData =AT_CalculateCRC32(((uint8_t*) &statinfo) + 4, sizeof(statinfo) - 4);
    statinfo.crc32 = crcOfData;
    ESP.rtcUserMemoryWrite(0,(uint32_t*) &statinfo, sizeof(statinfo));
}

//search for the access point
void ScanForSlave() {
  bool slaveFound = 0;
  
  int8_t scanResults = WiFi.scanNetworks();
  // reset on each scan

  if (DEBUG) Serial.println("Scan done");
  if (scanResults == 0) {
    if (DEBUG) Serial.println("No WiFi devices in AP Mode found");
  } else {
    if (DEBUG) Serial.print("Found ");
    if (DEBUG) Serial.print(scanResults);
    if (DEBUG) Serial.println(" devices ");
    for (int i = 0; i < scanResults; ++i) {
      // Print SSID and RSSI for each device found
      String SSID = WiFi.SSID(i);
      int32_t RSSI = WiFi.RSSI(i);
      int32_t chl = WiFi.channel(i);
      String BSSIDstr = WiFi.BSSIDstr(i);

      if (DEBUG) {
        Serial.print(i + 1);
        Serial.print(": ");
        Serial.print(SSID);
        Serial.print(" /");
        Serial.print(chl);
        Serial.print(" (");
        Serial.print(RSSI);
        Serial.print(")");
        Serial.println("");
      }
      delay(10);
      // Check if the current device starts with ATSmartHome`
      if (SSID == GW_SSID) {
        // SSID of interest
        if (DEBUG) {
          Serial.println("Found a Slave.");
          Serial.print(i + 1); Serial.print(": "); Serial.print(SSID); Serial.print(" ["); Serial.print(BSSIDstr); Serial.print("]"); Serial.print(" ("); Serial.print(RSSI); Serial.print(")"); Serial.println("");
        }
        int mac[6];
        // get the server MAC and save to RTC memory
        if ( 6 == sscanf(BSSIDstr.c_str(), "%x:%x:%x:%x:%x:%x%c",  &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5] ) ) {
          for (int ii = 0; ii < 6; ++ii ) {
            statinfo.mac[ii] = (uint8_t) mac[ii];
          }
          UpdateRtcMemory();
        }

        slaveFound = 1;
        //no more search after AP was found
        break;
      }
    }
  }
  
  
  if (DEBUG) {
    if (slaveFound) {
      Serial.println("Slave Found, processing..");
    } else {
      Serial.println("Slave Not Found, trying again.");
    }
  }

  // release RAM
  WiFi.scanDelete();
}

void sendData() {
  uint8_t buf[100]; //buffer for esp
  uint8_t sz = 100;
  //clear message buffer
  sendmsg.clear();
  if (DEBUG) {
    Serial.println("Sende "+mymac);
  }
  sendmsg.setId(mymac);
  //add current relais status as a boolean message to the buffer
  sendmsg.addSwitchOut(relais_status != 0,CHANNEL_RELAIS);
  //fill the buffer and send the content to the control center
  if (sendmsg.fillBuffer(buf,&sz)) esp_now_send(NULL, buf, sz);
  //remember the time to calculate interval
  last_sent=millis();
}

//callback on receive messages from ESP-Now
void readESPNow(uint8_t *mac_addr, uint8_t *r_data, uint8_t data_len) {
  ATDATAPACKET data;
  uint32_t newstatus;
  //copy received data into receive message buffer
  rcvmsg.readBuffer(r_data);
  if (mymac.equalsIgnoreCase(rcvmsg.getId())) {
    //accept only messages for this device
    if (rcvmsg.getPackets() > 0) {
      //did we get a data packet
      data = rcvmsg.getData(0);
      if (DEBUG) {
        Serial.printf("Got data for channel %i  value %i \n",data.channel, data.value[0]);
      }  
      if (data.channel == CHANNEL_RELAIS) {
        //if the data were for the right channel set the new status
        newstatus = data.value[0];
        if (newstatus != relais_status) {
          //if the status has changed we export it to the relais
          relais_status = newstatus;
          digitalWrite(RELAIS_PIN,relais_status);
          if (DEBUG){
            Serial.printf("Relais status = %i\n",relais_status);
          }
        }
      }
    }
  }
}

void setup() {

  if (DEBUG) {
    Serial.begin(115200);
    Serial.println("Start");
  }
  pinMode(RELAIS_PIN,OUTPUT);
  digitalWrite(RELAIS_PIN,relais_status);
  //get local MAC address to use it as device id
  mymac = WiFi.macAddress();
  if (DEBUG) {
    Serial.print("My MAC address = ");
    Serial.println(mymac);
  }
  ESP.rtcUserMemoryRead(0, (uint32_t*) &statinfo, sizeof(statinfo));
  if (DEBUG) Serial.println("RTC Done");
  uint32_t crcOfData = AT_CalculateCRC32(((uint8_t*) &statinfo) + 4, sizeof(statinfo) - 4);
  WiFi.mode(WIFI_STA); // Station mode for esp-now aktor node
  if (DEBUG) Serial.println("WifiMode");

  if (statinfo.crc32 != crcOfData) { //if checksum different we do not have a valid server MAC
    if (DEBUG) Serial.println("Scan for slave");
    ScanForSlave();
    //for (uint8_t i = 0; i<6;i++) statinfo.mac[i] = gwmac[i];
    if (DEBUG) {
      Serial.printf("This mac: %s, ", WiFi.macAddress().c_str());
      Serial.printf("target mac: %02x%02x%02x%02x%02x%02x", statinfo.mac[0], statinfo.mac[1], statinfo.mac[2], statinfo.mac[3], statinfo.mac[4], statinfo.mac[5]);
    }
  }
  if (esp_now_init() != 0) {
    if (DEBUG) Serial.println("*** ESP_Now init failed");
    ESP.restart();
  }
  //ESP Now Controller
  WiFi.setAutoConnect(false);
  esp_now_set_self_role(3); //(ESP_NOW_ROLE_CONTROLLER);
  uint8_t ch = esp_now_get_peer_channel(statinfo.mac);
  if (DEBUG) Serial.printf("Channel = %i\r\n",ch);
  //initialize Peer data
  int res = esp_now_add_peer(statinfo.mac, ESP_NOW_ROLE_CONTROLLER, 1, NULL, 0);
  if (res==0) Serial.println("Successful paired");
  //register callback
  esp_now_register_recv_cb(readESPNow);
}

void loop() {
  //send messages to the control center on a regular base
  if ((millis() - last_sent) > INTERVALL) {  //intervall to send data change this if required
    sendData();
  }
}

Dieser funktioniert auch so, wie er soll, aber eben nur mit einem Relais.
Ich habe hier schon so viele Möglichkeiten getestet, weitere GPIO´s und Channels hinzuzufügen, aber alles ohne Erfolg.
Also ich möchte hier keine Komplettlösung erbetteln, da ich es selber verstehen mag. Kann mir aber jemand vielleicht einen kleinen Denkanstoß geben, wie ich weitere Relais und die Kanäle dazu angeben muss, damit diese auch vom ESP32 erkannt werden.
Ein Link zu einer Webseite, wo man dies nachlesen kann, würde mir auch reichen. Leider habe ich dazu selber nichts gefunden, was mich weiter gebracht hätte.

Vielen Dank schon mal.

Sven
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2020, 21:17
Beitrag #2
RE: ESP8266 als Aktor
(11.01.2020 20:17)SHesse schrieb:  Also ich möchte hier keine Komplettlösung erbetteln........

Da drängt sich mir die Frage auf warum du nur einen komplett ab kopierten Sketch hast.

Warum fragst du nicht den Autor??

Der sollte seinen Sketch am besten kennen!



Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2020, 22:06
Beitrag #3
RE: ESP8266 als Aktor
Vielen Dank für die Hilfe.

Den guten Gerald Lechner, also den Autor, habe ich schon gefragt - nur leider überhaupt keine Reaktion bekommen.
Da muss ich mich ja schon glücklich schätzen, wenigstens hier eine Antwort zu erhalten, wenn diese auch nicht so ausgefallen ist, wie ich dachte.

Scheinbar bist du ja schon mit sämtlichen Arduino Codes im Kopf auf die Welt gekommen, anders kann ich mir die Arroganz nicht erklären.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2020, 22:11
Beitrag #4
RE: ESP8266 als Aktor
Wenn Du alle, die nicht das antworten, was Du gern hören willst als arrogant beschimpfst, wird es für Dich schwer werden, Hilfe für Dein Problem zu bekommen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2020, 23:06
Beitrag #5
RE: ESP8266 als Aktor
Wie ich schon in meinem ersten Beitrag schrieb, habe ich schon sehr viele Möglichkeiten durchprobiert.
Ja, und auch den Autor des Sketches gefragt.
Wenn ich auch nur ansatzweise eine Hilfestellung bekommen hätte, wäre ich jetzt nicht hier angemeldet.

Nein, ich will keine Komplettlösung - denn, das schrieb ich auch schon - ich will es verstehen. Und das kann ich am besten, wenn
ich anhand der (frei) verfügbaren Sketche praktisch damit arbeite.
Und daraus ableitend kann ich dann auch eigene Sketche schreiben - bisher habe ich noch keinen so verwendet, wie man ihn im Netz vorfindet.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2020, 23:40
Beitrag #6
RE: ESP8266 als Aktor
(11.01.2020 22:06)SHesse schrieb:  .....
Scheinbar bist du ja schon mit sämtlichen Arduino Codes im Kopf auf die Welt gekommen, anders kann ich mir die Arroganz nicht erklären.

Ich kann nicht verstehen, wieso man hier gleich so aggressiv reagieren muss, wenn einem die gegebene Antwort nicht gefällt.

Machst du das im echten Leben auch so ?

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.01.2020, 02:39
Beitrag #7
RE: ESP8266 als Aktor
(11.01.2020 22:06)SHesse schrieb:  Den guten Gerald Lechner....<- da beist sich die Katze in den Schwanz -> ....nur leider überhaupt keine Reaktion bekommen.

(11.01.2020 22:06)SHesse schrieb:  Da muss ich mich ja schon glücklich schätzen, wenigstens hier eine Antwort zu erhalten, wenn diese auch nicht so ausgefallen ist, wie ich dachte.
Antworten können unerwartet, für das eigene Ego, schmerzhaft ausfallen!

(11.01.2020 22:06)SHesse schrieb:  Scheinbar bist du ja schon mit sämtlichen Arduino Codes im Kopf auf die Welt gekommen....
Du meinst C++?

(11.01.2020 22:06)SHesse schrieb:  Seid nunmehr drei Jahren lernen ich unermüdlich, in meiner Freizeit, C++, HTML, JavaScript, CSS, Json, PHP und den ganzen anderen Kram wie Netzwerkkommunikation.

....anders kann ich mir die Arroganz nicht erklären.

Bestätigt mir das es sich gelohnt hat zu lernen, denn, "Niveau sieht nur von ganz weit unten wie Arroganz aus".


Bevor ich vergesse es zu erwähnen.
EspNow halte ich für flüssiger als Wasser!!
Es gibt ausreichend geeignete Protokolle die sich bewährt haben.
Nach meinem derzeitigen Kenntnisstand ist UDP Broadcast ein Totschlagsargument für den EspNowQuatsch.
Lieg ich mit meiner Annahme falsch, lass ich gerne belehren!

Zeig doch bitte, was du bis jetzt versucht hast, um die von dir gewünschte Funktionalität dem Sketch beizubringen.


Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.01.2020, 18:31
Beitrag #8
RE: ESP8266 als Aktor
"Niveau sieht nur von ganz weit unten wie Arroganz aus."
Man könnte meinen, den hast aus meinem WhatsApp Status kopiert....


Ich komm einfach nochmal rein:
Dank eurer Hilfe habe ich mein Problem lösen können.

Thema also erledigt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  float -> char Umwandlung Problem ESP8266 und BME 280 drstewa 2 115 24.02.2020 23:08
Letzter Beitrag: Bitklopfer
  ESP8266 mit externer Antenne ? Nicole 58 3.330 11.02.2020 22:34
Letzter Beitrag: Tommy56
  Esp8266 IPv6 Fips 6 696 26.01.2020 16:52
Letzter Beitrag: Fips
  SPIFFS auf dem ESP8266-01 uk1408 6 593 25.01.2020 12:02
Letzter Beitrag: Fips
  Anschluss CMOS Kamera an ESP8266 Stargazer 16 7.280 18.01.2020 17:33
Letzter Beitrag: Falke07
  ESP8266 AP Mode, Client-IP feststellen uk1408 14 1.275 17.01.2020 10:04
Letzter Beitrag: uk1408
  ESP8266+PubSubClient und MQTT/ioBroker Arduino4Fun 8 2.243 14.01.2020 14:34
Letzter Beitrag: biologist
  ESP8266-myClock Displayproblem icepick72 18 2.955 12.01.2020 22:28
Letzter Beitrag: icepick72
  Kann ein ESP8266 (ESP-12F) I2C Slave sein? ardu_arne 15 1.657 12.01.2020 15:32
Letzter Beitrag: ardu_arne
  Welche Firmware für ESP8266 (ESP-01)? hasch 28 2.662 09.01.2020 10:49
Letzter Beitrag: hasch

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste