MQTT ESP-LINK + Arduino Sensoren

Begonnen von MasterVigori, 11 April 2019, 18:41:58

Vorheriges Thema - Nächstes Thema

MasterVigori

Hallo zusammen,

ich versuche seit mehreren Wochen mir eine Gewächshaus Steuerung zusammen zu basteln.

Ich komme nicht mehr weiter, weil ich einfach keine Ahnung haben :-)

evtl. kann mir hier jemand etwas helfen......


Der Esp-Link, ist mit der MQTT CLOUD verbunden und der Arduino sendet die Daten zur MQTT CLOUD.
Nur leider verstehe nicht wie ich es hinbekomme, das in der MQTT CLOUD meine Daten vom ARDUINO (Lichtsensor, Feuchtigkeitssensor,  Feuchtigkeitsensor / Temperatur Sensor (DHT22) , Relais1 & Relais2) richtig der MQTT CLOUD zu überbringen, so das ich mit den Daten etwas anfangen.

hier mein Arduino Sketch ich hoffe jemand hat kurz Zeit sich das anzusehen......

Der Sketch verwendet 16192 Bytes (50%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 1237 Bytes (60%) des dynamischen Speichers, 811 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.


/**
* Simple example to demo the esp-link MQTT client
*/

#include <ELClient.h>
#include <ELClientCmd.h>
#include <ELClientMqtt.h>
int Lichtsensor = A0;                                       //Das Wort ,,eingang" steht jetzt für den Wert ,,A0" (Bezeichnung vom Analogport 0)
int Feuchtigkeitssensor = A1;                               //Das Wort ,,eingang" Sensor fühler  steht jetzt für den Wert ,,A1" (Bezeichnung vom Analogport 1)
int Lichtsensorwert = 0;                                    //Variable für den Sensorwert mit 0 als Startwert
int Feuchtigkeit = 0;                                       //Unter der Variablen "Feuchtigkei" wird später der Messwert des Sensors gespeichert.
int Relais1 = 9;                                            //Das Wort ,,Relais1" steht jetzt für den Pin 9
int Relais2 = 10;                                           //Mit dem Namen "Relais2" wird jetzt der Pin10 bezeichnet.
//int Relais3 = 8;                                            //Das Wort ,,Relais1" steht jetzt für den Pin 8
//int Relais4 = 11;                                           //Mit dem Namen "Relais2" wird jetzt der Pin11 bezeichnet.

#include <Time.h>                                           //Bibliotheken laden
#include <Wire.h>
#include <DS1307RTC.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"                                            //DHT Bibliothek laden
#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif
#define DHTPIN 8                                            //Der Sensor wird an PIN 8 angeschlossen   
#define DHTTYPE DHT22                                       // Es handelt sich um den DHT22 Sensor

// For 8 Channel Relay
#define Relais1_PIN 9
#define Relais2_PIN 10
//Relais3_PIN 8
//Relais4_PIN 11

uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};
byte termometru[8]= {B00100, B01010, B01010, B01110, B01110, B11111, B11111, B01110};              //icon for termometer
byte picatura[8] = {B00100, B00100, B01010, B01010, B10001, B10001, B10001, B01110};              //icon for water droplet
byte celsius[8] = {8,20,8,0,3,4,4,3};                                                              // °C
byte sonne[8] = {0x15,0x0E,0x0A,0x1B,0x0A,0x0E,0x15,0x00};                                     // Sonne
byte herz[8] = {0x00,0x00,0x0A,0x15,0x11,0x0A,0x04,0x00};                                      // herz
byte relai_on[8] = {0b11111, 0b10001, 0b10001, 0b10001, 0b10001, 0b10001, 0b10001, 0b11111};        // Relai an Zeichen
byte relai_off[8] = { 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b00000};        // Relai aus Zeichen

DHT dht(DHTPIN, DHTTYPE);                                   //Der Sensor wird ab jetzt mit ,,dth" angesprochen
LiquidCrystal_I2C lcd(0x3F,20,4);                            //In dieser Zeile wird festgelegt, welche Pins des Mikrocontrollerboards für das LCD verwendet wird

// Initialize a connection to esp-link using the normal hardware serial port both for
// SLIP and for debug messages.
ELClient esp(&Serial, &Serial);

// Initialize CMD client (for GetTime)
ELClientCmd cmd(&esp);

// Initialize the MQTT client
ELClientMqtt mqtt(&esp);

// Callback made from esp-link to notify of wifi status changes
// Here we just print something out for grins
void wifiCb(void* response) {
  ELClientResponse *res = (ELClientResponse*)response;
  if (res->argc() == 1) {
    uint8_t status;
    res->popArg(&status, 1);

    if(status == STATION_GOT_IP) {
      Serial.println("WIFI CONNECTED");
    } else {
      Serial.print("WIFI NOT READY: ");
      Serial.println(status);
    }
  }
}

bool connected;

// Callback when MQTT is connected
void mqttConnected(void* response) {
  Serial.println("MQTT connected!");
  mqtt.subscribe("/esp-link/1");
  mqtt.subscribe("/hello/world/#");
  //mqtt.subscribe("/esp-link/2", 1);
  //mqtt.publish("/esp-link/0", "test1");
  connected = true;
}

// Callback when MQTT is disconnected
void mqttDisconnected(void* response) {
  Serial.println("MQTT disconnected");
  connected = false;
}

// Callback when an MQTT message arrives for one of our subscriptions
void mqttData(void* response) {
  ELClientResponse *res = (ELClientResponse *)response;

  Serial.print("Received: topic=");
  String topic = res->popString();
  Serial.println(topic);

  Serial.print("data=");
  String data = res->popString();
  Serial.println(data);
}

void mqttPublished(void* response) {
  Serial.println("MQTT published");
}

void setup() {
  Serial.begin(9600);
  Serial.println("+*# GARDUINO #*+");
  Serial.println("is loading......... Power ON!");
  Serial.println("EL-Client starting!");

  // Sync-up with esp-link, this is required at the start of any sketch and initializes the
  // callbacks to the wifi status change callback. The callback gets called with the initial
  // status right after Sync() below completes.
  esp.wifiCb.attach(wifiCb); // wifi status change callback, optional (delete if not desired)
  bool ok;
  do {
    ok = esp.Sync();      // sync up with esp-link, blocks for up to 2 seconds
    if (!ok) Serial.println("EL-Client sync failed!");
  } while(!ok);
  Serial.println("EL-Client synced!");

  // Set-up callbacks for events and initialize with es-link.
  mqtt.connectedCb.attach(mqttConnected);
  mqtt.disconnectedCb.attach(mqttDisconnected);
  mqtt.publishedCb.attach(mqttPublished);
  mqtt.dataCb.attach(mqttData);
  mqtt.setup();

  static int count;
static uint32_t last;

digitalWrite(9, HIGH);                                     // damit das Realis unten bleibt.
digitalWrite(10, HIGH);                                     // damit das Realis unten bleibt.
//digitalWrite(11, HIGH);                                     // damit das Realis unten bleibt.
//digitalWrite(12, HIGH);                                     // damit das Realis unten bleibt.


lcd.begin(20, 4);                                             //Das Display starten, festlegen dass es sich um ein Display mit 20 Zeichen in 4 Zeilen //handelt
lcd.backlight();                                              //Beleuchtung des Displays einschalten
  lcd.createChar(3,heart);
  lcd.createChar(9,termometru);
  lcd.createChar(8,picatura);
  lcd.createChar(10,celsius);
  lcd.createChar(11,sonne);
  lcd.createChar(12,herz);
  lcd.createChar(13,relai_on); 
  lcd.createChar(14,relai_off);
  lcd.setCursor(1,0);
  lcd.write(12);
  lcd.print("+*# GARDUINO #*+");
  lcd.write(12);
  lcd.setCursor(1,1);
  lcd.print("is loading...");
   lcd.setCursor(9,2);
  lcd.print("Power ");
    lcd.setCursor(6,3);
  lcd.print("By Vigori!");
 
  delay (1000);
 
lcd.clear();

setSyncProvider(RTC.get);                                     //Dies ist die Funktion um die Zeit- und Datumsangabe von der RTC zu bekommen
pinMode (Relais2, OUTPUT);                                    //Im Setup wird der Pin 10 als Ausgang festgelegt.
pinMode (Relais1, OUTPUT);                                     //Der Pin mit der Relais1 (Pin 9) ist jetzt ein Ausgang
dht.begin();                                                  //DHT22 Sensor starten
}

static int count;
static uint32_t last;

void loop() {

Feuchtigkeit=analogRead(Feuchtigkeitssensor);             //Die Spannung an dem Sensor wird ausgelesen und unter der Variable ,,messwert" gespeichert.
float Luftfeuchtigkeit = dht.readHumidity();                       //die Luftfeuchtigkeit auslesen und unter ,,Luftfeutchtigkeit" speichern
float Temperatur = dht.readTemperature();                         //die Temperatur auslesen und unter ,,Temperatur" speichern
Lichtsensorwert=analogRead(Lichtsensor);                   //Die Spannung an dem Fotowiderstand auslesen und unter der Variable ,,sensorWert" abspeichern.
  esp.Process();

  if (connected && (millis()-last) > 4000) {
    Serial.println("publishing");
    char buf[12];

    itoa(count++, buf, 10);
    mqtt.publish("Temperatur:", buf);
    mqtt.publish(" °C", buf);

    itoa(count+99, buf, 10);
    mqtt.publish("Feuchtigkeits-Messwert:", buf);                  //Ausgabe am Serial-Monitor: Das Wort ,,Feuchtigkeits-Messwert:"
    uint32_t t = cmd.GetTime();
    Serial.print("Time: "); Serial.println(t);

    last = millis();
  }
Serial.print(hour());                                     //Serial.print ist der Befehl etwas im seriellen Monitor anzuzeigen (Stunde, Minute, Sekunde, Leerzeichen, Tag, Leerzeichen, usw.)
printDigits(minute());                                     //bei den Minuten und Sekunden wird der Befehl
printDigits(second());                                      //printDigits angegeben welcher am Ende des Codes noch festgelegt wird.
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println("");
Serial.print("Feuchtigkeits-Messwert:");                  //Ausgabe am Serial-Monitor: Das Wort ,,Feuchtigkeits-Messwert:"
Serial.print(Feuchtigkeit);                             //und im Anschluss der eigentliche Messwert.
Serial.println("");
Serial.print("Lichtsensorwert: " );                       //Ausgabe am Serial-Monitor: Das Wort ,,Sensorwert: ,,
Serial.print(Lichtsensorwert);                          //Ausgabe am Serial-Monitor. Mit dem Befehl Serial.print wird der Sensorwert des Fotowiderstandes in Form einer Zahl zwischen 0 und 1023 an den serial monitor gesendet.
Serial.println("");
Serial.print("Luftfeuchtigkeit: ");                                //Im seriellen Monitor den Text und
Serial.print(Luftfeuchtigkeit);                                     //die Dazugehörigen Werte anzeigen
Serial.print(" %");
Serial.println("");
Serial.print("Temperatur: ");
Serial.print(Temperatur);
Serial.print(" °C");
Serial.println("");
delay(500);

for ( int i = 0; i < 1; i++ )
if(Feuchtigkeit > 860)
 
  {
     digitalWrite(Relais1, LOW);
     lcd.setCursor(15, 3);           
         lcd.print("R");
     lcd.write(14);( i + 1 );
         pinMode( Relais1_PIN + i, 1 );
         delay(100);
  }
 
  else
 
  {
     digitalWrite(Relais1, HIGH);
     lcd.setCursor(15, 3);
         lcd.print("R");
         lcd.write(13);( i - 0 );
         pinMode( Relais1_PIN + i, 0 );
         delay(10);
     
  }
for ( int i = 0; i < 1; i++ )
if(Lichtsensorwert > 500)
{
     digitalWrite(Relais2, LOW);
     lcd.setCursor(17, 3);           
         lcd.write(14);( i + 1 );
         pinMode( Relais2_PIN + i, 1 );
         delay(10);
  }
 
  else
 
  {
     digitalWrite(Relais2, HIGH);
     lcd.setCursor(17, 3);
         lcd.write(13);( i - 0 );
         pinMode( Relais2_PIN + i, 0 );
         delay(10);
  }
 
lcd.setCursor(0,0);
lcd.print(day());                                                  // Das Datum soll nun als
lcd.print(".");                                                     // ,,Tag", ,,." ,,Monat" usw. angegeben werden.
lcd.print(month());
lcd.print(".");
lcd.print(year());                                            // Der nächste ,,Text" soll nun beim zweiten Zeichen in der zweiten Reihe beginnen.//setCursor gibt an wo der Text beginnen soll. In diesem Fall beim dritten Zeichen in der ersten Reihe.
lcd.print("  ");                                                 //Hier soll nach der Uhrzeit noch das Wort ,,Uhr" angezeigt werden, dazu müssen noch3 Leerzeichen folgen, sonst würde bei Zahlen <10 immer ein weiteres ,,r" hinter Uhr angezeigt werden. Das liegt daran, dass in der LCD Library der Befehl eine 0 vor Zahlen <10 anzuzeigen nicht vorhanden ist.
  //lcd.write(2);
lcd.print(hour());                                                //Hier soll jetzt die Uhrzeit angezeigt werden, also ,,hour" ,,:" ,,minute" usw..
lcd.print(":");
lcd.print (minute());
lcd.print(":");
lcd.print(second());

lcd.setCursor(0,1);
lcd.print("Luft:");
lcd.print(Luftfeuchtigkeit,0);                                     //die Dazugehörigen Werte anzeigen
lcd.print("%");

lcd.setCursor(10,1);
  lcd.write(9);
lcd.print(Temperatur,1);
lcd.print((char)223);
lcd.print("C");

lcd.setCursor(0,2);
  lcd.write(11);
lcd.print(Lichtsensorwert);
lcd.print("");

lcd.setCursor(8,2);
  lcd.print("Boden: ");
lcd.print(Feuchtigkeit);
    lcd.write(8);

delay(10);
}

void printDigits(int digits)                                            //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im seriellen Monitor automatisch eine 0 vor den Ziffern angezeigt wird. Das gilt nur für den seriellen Monitor und nicht für LCD Display.
{
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}

void printDay()                                                       // Hier wird wird für den vorher im Code schon verwendeten Befehl printDay eine Bedeutung festgelegt
{
int day;
day = weekday();                                                       // Die Wochentage sollen abhängig vom Datum angezeigt werden.
if(day == 1){lcd.print("So, ");}                                          // Wenn es sich um Tag 1 handelt soll ,,So" usw. angezeigt werden.
if(day == 2){lcd.print("Mo, ");}
if(day == 3){lcd.print("Di, ");}
if(day == 4){lcd.print("Mi, ");}
if(day == 5){lcd.print("Do, ");}
if(day == 6){lcd.print("Fr, ");}
if(day == 7){lcd.print("Sa, ");}
}