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.
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.
Du bedienst den ESP8266 über SoftwareSeriell mit 9600 Baud und AT-Befehlen
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.
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.
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.
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.
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.
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.