Arduino Nano mit VOC Sensor und ESP8266

Hallo,

Ich bin ein totaler Neuling in der Arduino Szene. Ich habe einen VOC Sensor mit Arduino Nano nachgebaut und würde gerne mit dem ESP8266 verbinden, um die udp Daten per Wifi zu senden. Der akuelle Code ist:

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include "Wire.h"
#include <I2Cdev.h>
#include <IAQ2000.h>

IAQ2000 iaq;

uint16_t iAQCO2;
uint8_t iAQSTATUS;
uint16_t iAQVOC;

// Netzwerk-Einstellungen
// MAC-Adresse darf nur einmal im Netz vohanden sein
// Fuer jedes Geraet aendern!!
byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };

// Port fur Daten-Empfang
unsigned int localPort = 7006;

// IP Adresse Loxone-MiniServer
IPAddress RecipientIP(192, XXX, XXX, XXX);
// Port Loxone-MiniServer... An diesen Port werden die Daten gesendet
unsigned int RecipientPort = 7006;

// Buffer fuer Daten-Empfang
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];

// Start der UDP-Instanz
EthernetUDP Udp;

void setup() {
  Wire.begin();
  Serial.begin(9600);

  if (!Ethernet.begin(mac)) Serial.println("dhcp failed");
  else {
    Serial.print("IP is ");
    Serial.println(Ethernet.localIP());
  }
  Udp.begin(localPort); // Start UDP
  SPI.begin();
  sendUDP("Raumluft - aktiv"); // send UDP Ready

  // initialize device
  Serial.println("Initialisierung des Sensor...");
  iaq.initialize();

  // verify connection
  Serial.println("Verbindung zum Sensor testen...");
  Serial.println(iaq.testConnection() ? "iAQ-2000 erfolgreich verbunden" : "iAQ-2000 Fehler bei der Verbindung");

  //Serial leeren
  clearAll();

  Serial.println("Warte auf UDP-Befehl");

}

void loop() {

  // schaut on ein UDP Befehl empfangen wurde
  checkUDP();

  if (!strcmp(packetBuffer, "000"))
  {
    getDataCO2();
    delay(100);
    getDataVOC();
    delay(100);
    getDataSTATUS();
  }
}


//// Module ////
// Serial-Speicher loeschen
void clearAll() {
  // Paket-Buffer leeren
  for (int i = 0; i < UDP_TX_PACKET_MAX_SIZE; i++) packetBuffer[i] = 0;
}

// empfangene UDP-Befehle auswerten
void checkUDP()
{
  // pruefen ob Daten vorhanden sind
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.print("Packet Content: ");
    Serial.println(packetBuffer);
  }
  delay(10);
}

// UDP-Befehl senden
void sendUDP(String text)
{
  Udp.beginPacket(RecipientIP, RecipientPort);
  Udp.print(text);
  Udp.endPacket();
  delay(10);
}

// CO2 Daten vom Sensor holen
void getDataCO2()
{
  iAQCO2 = iaq.getIaqpred();

  Serial.print("CO2 = ");
  Serial.print(iAQCO2);
  Serial.print(" ");
  Serial.println("[ppm]");

  String ac = String (iAQCO2);

  // Wert wird auf 3000ppm begrnezt
  if (iAQCO2 > 3000)
  {
    ac = "3000";
    sendUDP ("CO2: " + ac);
  } else {
    sendUDP ("CO2: " + ac);
  }
  clearAll();
}


// VOC Daten vom Sensor holen
void getDataVOC()
{
  iAQVOC = iaq.getIaqtvoc();

  Serial.print("VOC = ");
  Serial.print(iAQVOC);
  Serial.print(" ");
  Serial.println("[ppb]");

  String av = String (iAQVOC);

  // Wert wird auf 1000ppb begrnezt
  if (iAQVOC > 1000)
  {
    av = "1000";
    sendUDP ("VOC: " + av);
  } else {
    sendUDP ("VOC: " + av);
  }
  clearAll();
}

// Status vom Sensor holen
void getDataSTATUS()
{
  iAQSTATUS = iaq.getIaqstatus();

  Serial.print("Status = ");
  if (iAQSTATUS == 0)
  {
    Serial.print("OK");
  }
  if (iAQSTATUS == 1)
  {
    Serial.print("BUSY");
  }
  if (iAQSTATUS == 16)
  {
    Serial.println("WARUMUP");
  }
  if (iAQSTATUS == 128)
  {
    Serial.print("ERROR");
  }

  String as = String (iAQSTATUS);
  sendUDP ("STATUS: " + as);

  clearAll();
}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich tun.

Welchen ESP8266 hast Du?

Gruß Tommy

Habe ich gemacht.

Ich habe den esp8266 esp-01s

Der ESP8266 ist selbst ein Microcontroller, Du kannst da nicht alles in einen Sketch direkt packen. Dein Sketch ist für ein Ethernetshield/-modul.

Du hast jetzt 4 Varianten, wie Du weiter vorgehen kannst.

  1. Du bedienst den ESP8266 über SoftwareSeriell mit 9600 Baud und AT-Befehlen
  2. Du kauft Dir einen USB zu TTL-Seriell-Adapter und programmierst den ESP8266 in der Arduino-IDE, so dass der UDP kann und Du mit dem Du dann per SoftwareSeriell mit 9600 Baud kommunizierst.
  3. Du kaufst Dir einen WEMOS D1 mini pro oder NodeMCU 1.0 (das sind ESP8266 mit Micro-USB-Anschluss und mehr herausgeführten Pins, die Du direkt in der IDE programmieren kannst) und koppelst die beiden MC per I2C. Ein Beispiel dazu habe ich hier veröffentlicht.
  4. Du kaufst Dir einen WEMOS D1 mini pro oder NodeMCU 1.0 und versuchst Deinen Sensor direkt mit diesem zu betreiben. Dazu wäre aber ein Link zu diesem sinnvoll. Wenn der mit 5V arbeitet, brauchst Du einen Pegelwandler.

Meine Favoriten wären 4 und 3.

Gruß Tommy

das ist der Sensor:

https://www.digikey.com/product-detail/en/IAQ-CORE%20C/IAQ-CORE%20C-ND/5117221

Der arbeitet laut Datenblatt mit 3,3V, kann also direkt am ESP8266 betrieben werden, wenn nicht noch ein 5V-Modul drum herum ist oder benutzt Du den nackten Schaltkreis? Dann die Pullup an SDA und SCL nicht vergessen.

Gruß Tommy

Edit: Das favorisiert Variante 4.

Ich habe es bisher nach dieser Anleitung aufgebaut, also ohne Widerstände.

https://www.loxwiki.eu/pages/viewpage.action?pageId=917927

Dann schau mal in die I2C-Spezifikation.
Nicht alles, was im Netz steht ist auch richtig. Es kann so unter bestimmten Bedingungen funktioniert haben - mehr nicht.

Gruß Tommy

Ich habe es nachgeschaut. Widerstände werde ich noch verbauen dann, wie muss ich dann den Code anpassen?

Gruß Tobi

Das kommt darauf an, was Du machen willst. Manches Mal ist es besser, etwas ausführlicher zu antworten, damit wir wissen, was Du überhaupt konkret machen willst.

Gruß Tommy

Edit: Ob Deine Libs auf dem ESP8266 laufen, kann ich nicht einschätzen.

Also, ich möchte die Luftqualität in meinen Wohnzimmer messen und an Loxone per UDP senden. Ich habe 24V für den Loxone Tree liegen und wollte diesen für die Spannungsversorgung nutzen, um Kabel zu sparen wollte ich jetzt in Arduino per Wifi verbinden. Ich hoffe damit ist erst mal mein Vorhaben erklärt.

Gruß Tobi

Ich bezog mich eher darauf, welche Variante der 4 vorgeschlagenenen Du angehen willst?

Gruß Tommy

Ich würde Variante 4 nehmen, wie du mir auch vorgeschlagen hast.

Ich habe aber auch geschrieben, dass ich nicht weiß, ob Deine Lib mit dem ESP8266 läuft. Sie verwendet eine eigene I2C-Implementierung.

Das musst Du selbst eruieren oder auf Basis der Standard-I2C-Lib des ESP8266 und dem Datenblatt des Sensor Dir die Lib selbst basteln.

Gruß Tommy

Edit: Wenn Dir das zu kritisch ist, dann wäre Variante 3 die einfachere, wenn Deine Lib auf dem UNO/NANO läuft.

Die Lib ist hier von dem Sensor.

Bin halt auch totaler Neuling bei Arduino. Vielleicht kannst du mir auch ein Tutorial empfehlen.

Versuche doch mal Kontakt mit dem Autor aufzunehmen, ob seine Lib für den ESP8266 geeignet ist.
Hier ist seine Website.

Bezüglich Tutorials kann ich nur empfehlen: lerne die Grundlagen, nutze die Beispiele der IDE.

Gruß Tommy