Hallo,
dies ist meine erste Frage in diesem Forum und ich hoffe, dass ich alles richtig mache.
ich habe für meinen Arduino ESP32 den folgenden Sketch gefunden und angepasst:
#include <Streaming.h>
#include <LiquidCrystal_I2C.h>
#include <String.h>
LiquidCrystal_I2C lcd(0x27,16,2);
const uint16_t MINBEWAESSERUNGSZEIT = 5000;
int Menue_Schalter = 3;
String Menue_Text1;
String Menue_Text2;
char* names[] = {"Vent.1 ", "Vent.2 "};
uint32_t tw[2] = {320, 30};
uint8_t cpos;
class Bewaesserung
{
const byte ventilPin;
const byte sensorPin;
char* Name;
const byte zeile;
const uint32_t trockenwert;
const uint32_t bewaesserungszeit;
public:
Bewaesserung(const byte ventilPin, const byte sensorPin, char Name[], const byte zeile, uint32_t trockenwert, uint32_t bewaesserungszeit)
: ventilPin(ventilPin), sensorPin(sensorPin), Name(Name), zeile(zeile), trockenwert(trockenwert), bewaesserungszeit(bewaesserungszeit)
{
}
void Menue()
{
}
void init()
{
pinMode(ventilPin, OUTPUT);
digitalWrite(ventilPin, HIGH);
lcd.init(); // Display initialisieren
lcd.backlight(); // Hintergrundbeleuchtung
lcd.clear();
// pinMode (Menue_Schalter, INPUT_PULLUP);
}
void bewaessern()
{
uint16_t sensorWert = analogRead(sensorPin); // Wert von Sensor wird gelesen
Serial << "vor dem giesen " << " Name: " << Name << " \tSensor Wert : " << sensorWert << " \tTrockenwert: " << trockenwert << " \tBewässerungszeit: " << bewaesserungszeit/1000 << " sec." << endl;
drucklcd(zeile,Name,sensorWert);
if (sensorWert > trockenwert)
{
digitalWrite(ventilPin, LOW); // Ventil öffnen
Serial.print(Name);
Serial.println("ist auf");
druckMenue(11,zeile, "giest");
if (digitalRead(Menue_Schalter) == HIGH) {
Serial.println("Schalter gedrückt");
Menue();
}
delay(bewaesserungszeit);
digitalWrite(ventilPin, HIGH);
Serial.print(Name);
Serial.println("ist zu");
sensorWert = analogRead(sensorPin);
drucklcd(zeile, Name, sensorWert);
Serial << "nach dem giesen " << " Name: " << Name << " \tSensor Wert : " << sensorWert << " \tTrockenwert: " << trockenwert << " \tBewässerungszeit: " << bewaesserungszeit/1000 << " sec." << endl;
} else {
Serial.print(Name);
Serial.println("muss nicht geöffnet werden!");
if (digitalRead(Menue_Schalter) == HIGH) {
Serial.println("Schalter gedrückt");
Menue();
}
delay( 12 * MINBEWAESSERUNGSZEIT );
}
sensorWert = analogRead(sensorPin);
drucklcd(zeile, Name, sensorWert);
Serial << " Name: " << Name << " \tSensor Wert : " << sensorWert << " \tTrockenwert: " << trockenwert << endl;
}
void drucklcd(byte zeile, String Name, uint16_t sensorWert)
{
// Zahlen des Sensors rechtsbündig ausgeben
if (sensorWert < 10 && sensorWert > 0)
cpos = Name.length() + 3;
if(sensorWert > 9 && sensorWert < 100)
cpos = Name.length() + 2;
if(sensorWert > 99 && sensorWert < 1000)
cpos = Name.length() + 1;
if(sensorWert > 999)
cpos = Name.length();
lcd.setCursor(0, zeile);
lcd.print(" "); //kpl. Zeile löschen
// Zeile neu beschreiben
lcd.setCursor(0, zeile);
lcd.print(Name);
lcd.setCursor(cpos, zeile);
lcd.print(sensorWert);
lcd.setCursor(12,zeile);
lcd.print(trockenwert);
}
void druckMenue(byte pos, byte zeile, String wert)
{
lcd.setCursor(pos,zeile);
lcd.print(wert);
}
};
Bewaesserung bewaesserung[] =
{ // ventilPin, sensorPin, Name, zeile, trockenwert, bewässerungszeit
{2, A7, names[0], 0, tw[0], 30000},
{6, A6, names[1], 1, tw[1], 120000},
};
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
for (auto &b : bewaesserung) b.init();
}
void loop()
{
for (auto &b : bewaesserung) b.bewaessern();
}
Dies funktioniert sehr gut.
Ich möchte jetzt die Werte Name, trockenwert und bewässerungszeit aus einer MySQL-Datenbank holen und einsetzen. Das holen aus der Datenbank habe ich bereits erfolgreich installiert. Aber ich bekomme es nicht hin diese Werte ins Programm zu integrieren. Folgendes habe ich dafür geändert:
char* names[] = {"Vent.1 ", "Vent.2 "};
uint32_t tw[2] = {320, 30};
in das geändert:
char* names[2];
int arrTrockenwert;
uint bewZeit[2] ;
und das:
Bewaesserung bewaesserung[] =
{ // ventilPin, sensorPin, Name, zeile, trockenwert, bewässerungszeit
{2, A7, names[0], 0, tw[0], 30000},
{6, A6, names[1], 1, tw[1], 120000},
};
in das geändert:
Bewaesserung bewaesserung[] =
{ // ventilPin, sensorPin, Name, zeile, trockenwert, bewässerungszeit
{2, A7, names[0], 0, arrTrockenwert[0], bewZeit[0]},
{6, A6, names[1], 1, arrTrockenwert[1], bewZeit[1]},
};
im setup() werden die Daten aus der Datenbank zugefügt:
idWerte = atoi(strtok(buffer, ","));
MINBEWAESSERUNGSZEIT = atoi(strtok(NULL, ","));
interval = atol(strtok(NULL, ","));
arrTrockenwert[0] = atoi(strtok(NULL, ","));
arrTrockenwert[1] = atoi(strtok(NULL, ","));
bewZeit[0] = atoi(strtok(NULL, ","));
bewZeit[1] = atoi(strtok(NULL, ","));
names[0] = (strtok(NULL, ","));
names[1] = (strtok(NULL, ","));
Auch das funktioniert gut.
Was muss ich jetzt tun damit die Variablen names[0] und names[1] jeweils in die Variable Name,
die Variablen arrTrockenwert[0] und arrTrockenwert[1] jeweils in die Variable trockenwert,
und die Variablen bewZeit[0] und bewZeit[1] jeweils in die Variable bewaesserungszeit übernommen werden?
Ich habe in meiner aktiven Zeit einiges in C programmiert aber mit C++ stehe ich noch auf dem Kriegsfuss und bitte deshalb um Nachsicht. Danke schön.
Viele Grüße
Dieter