Hallo Zusammen,
Ich habe ein Projekt von der Uni aus mit einem ESP32 Board und habe hierfür folgendes Skript entwickelt:
// Einbinden der benötigten Bibliotheken
#include <SPI.h>
#include <ESP32Servo.h>
#include <MFRC522.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <HCSR04.h>
#include <DS18B20_INT.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <UniversalTelegramBot.h>
#include <WiFiClientSecure.h>
const char* ssid = "OnePlus 7T Plus";
const char* password = "passwort";
// Definition der Pins für das Relais und den Feuchtesensor
const int RELAY_PIN = 33; // Pin, an dem das Relais angeschlossen ist
const int SENSOR_PIN = 34; // Pin, an dem der Feuchtesensor angeschlossen ist
// Mindestwert, bei dem das Relais ausgelöst wird (Wert kann je nach Sensor unterschiedlich sein)
const int MIN_VALUE = 500;
// Definition der Pins für den MFRC522 RFID-Reader
#define RST_PIN 35
#define SS_PIN 21
// Definition der Pins für die LED-Anzeigen
#define ledRot 13
#define ledGruen 12
// Definition des Pins für den Temperatursensor DS18B20
#define sensorPin 14
OneWire oneWire(sensorPin);
DS18B20_INT sensor(&oneWire);
// Telegram-Zugangsdaten
#define BOT_TOKEN "5880563335:AAHyudoAXIIWdlK1R_MmGA2ppQfXRBrAWTM"
#define CHAT_ID "6208854057"
//Servo Pin festlegen
#define Servo_Pin 27
// Telegram Bot Objekt
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
// Initialisierung des MLX90614 Infrarot-Temperatursensors
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
// Variable, um festzustellen, ob eine Tasse erkannt wurde
bool cupDetected = false;
// Definition der Anzahl der zulässigen RFID-IDs und der Array-Variable, die die zulässigen IDs enthält
const int NUM_RFIDS = 5;
String rfids[NUM_RFIDS] = {" C7 91 10 04"," DE 20 10 04"," B9 A4 0F 04"," FE F0 10 04"," 83 B9 4C 90"};
String newRfidId = "";
// Erstellung einer Objektinstanz für den MFRC522-Reader
MFRC522 mfrc522(SS_PIN, RST_PIN);
// Speichern der zuletzt gelesenen RFID-ID
String lastRfid = "";
// Initialisierung des HCSR04 Ultraschallsensors
HCSR04 hc(2, new int[5]{ 5, 25, 26, 16, 4}, 5); // (TRIG-Pin für alle gleich, Array der ECHO-Pins, Anzahl der Sensoren)
// Initialisierung des Servomotors
Servo myservo;
// Zeitintervall in Millisekunden für das Polling des Seriellen Monitors
const unsigned long POLL_INTERVAL_MS = 1000;
// Zeitintervall in Millisekunden für den Timer
const unsigned long TIMER_INTERVAL_MS = 1000;
// Zeichenkette, die den Timer startet
const char* START_STRING = "DE 20 10 04";
// Zeitintervall in Millisekunden für das Zurücksetzen des Timers
const unsigned long RESET_INTERVAL_MS = 7 * 24 * 60 * 60 * 1000;
// Zeitstempel, an dem der Timer zuletzt zurückgesetzt wurde
unsigned long lastResetTime = 0;
// Zeitstempel, an dem der Timer zuletzt gestartet wurde
unsigned long lastStartTime = 0;
// Flag, das angibt, ob der Timer läuft oder nicht
bool timerRunning = false;
void setup() {
delay(100);
// Initialisierung der seriellen Schnittstelle
Serial.begin(115200);
delay(2000);
myservo.attach(Servo_Pin); // Pin 27 als Servo-Pin festlegen
// Festlegen des Ausgangs-Pins für das Relais und des Eingangs-Pins für den Feuchtesensor
pinMode(RELAY_PIN, OUTPUT);
pinMode(SENSOR_PIN, INPUT);
WiFi.begin(ssid, password);
delay(500);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Verbindung zum WLAN herstellen...");
}
Serial.println("Erfolgreich mit dem WLAN verbunden!");
Serial.print("IP-Adresse: ");
Serial.println(WiFi.localIP());
mlx.begin(); // Initialisiert den MLX90614 Sensor
pinMode(ledRot, OUTPUT);
pinMode(ledGruen, OUTPUT);
// Timer-Intervall setzen
timerAlarmWrite(0, TIMER_INTERVAL_MS * 1000, true);
// Timer starten
timerAlarmEnable(0);
Serial.println("Setup abgeschlossen.");
delay(200);
//begin der SPI Kommunikation
SPI.begin();
delay(100);
//initialisieren der Kommunikation mit dem RFID Modul
mfrc522.PCD_Init();
}
void loop() {
TempSens();
myservo.write(0);
DistanceInfrarot();
RFID();
TelegramMessage();
printDistances();
Pumpe();
}
void RFID() {
//Wenn keine neue Karte vorgehalten wurde oder die serielle Kommunikation
//nicht gegeben ist, dann...
if ( !mfrc522.PICC_IsNewCardPresent()) {
//Serial.println("!PICC_IsNewCardPresent");
return;
}
if (!mfrc522.PICC_ReadCardSerial()) {
//Serial.println("!PICC_ReadCardSerial");
return;
}
for (byte i = 0; i < mfrc522.uid.size; i++) {
newRfidId.concat(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
newRfidId.concat(String(mfrc522.uid.uidByte[i], HEX));
}
//alle Buchstaben in Großbuchstaben umwandeln
newRfidId.toUpperCase();
//Wenn die neue gelesene RFID-ID ungleich der bereits zuvor gelesenen ist,
//dann soll diese auf der seriellen Schnittstelle ausgegeben werden.
if (!newRfidId.equals(lastRfid)) {
//überschreiben der alten ID mit der neuen
lastRfid = newRfidId;
}
bool verified = false;
//prüfen ob die gelesene RFID-ID im Array mit bereits gespeicherten IDs vorhanden ist
for (int i = 0; i < NUM_RFIDS; i++) {
//wenn die ID an der Stelle "i" im Array "rfids" mit dem gelesenen übereinstimmt, dann
if (rfids[i].equals(newRfidId)) {
verified = true;
//Schleife verlassen
break;
}
}
//Wenn die Variable "verified" auf True ist, dann...
if (verified && hc.dist(5) < 4) {
TempInfraRot();
digitalWrite(ledGruen, HIGH);
delay(1000);
digitalWrite(ledGruen, LOW);
Serial.println("RFID-ID [" + newRfidId + "] verifiziert");
myservo.write(45); // Drehe Servomotor um 45 Grad
delay(2000);
verified = false;
RfidDB();
}
else {
//Wenn nicht dann...
//LED aktivieren
digitalWrite(ledRot, HIGH);
//eine Pause von 125 ms.
delay(700);
digitalWrite(ledRot, LOW);
Serial.println("RFID-ID [" + newRfidId + "] fehlgeschlagen");
}
Serial.println();
}
void DistanceInfrarot() {
Serial.println( hc.dist(1) );
if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
HTTPClient http; //Declare object of class HTTPClient
http.begin("http://202.61.207.122:8000/Sensordaten"); //Specify request destination
http.addHeader("Content-Type", "application/json"); //Specify content-type header
String Anwesenheitsdetektion = "{\"Wert\":\"" + String(hc.dist(5)) + "\",\"SensorID\":\"5\",\"EinheitenID\":\"3\",\"SessionID\":\"0\"}";//Get the response payload
int httpCode = http.POST(Anwesenheitsdetektion);//Send the request
Serial.println(httpCode);//Print HTTP return code
//Serial.println(payload); //Print request response payload
http.end(); //Close connection
}
delay(60);
}
void TempInfraRot(){
if (hc.dist(1) < 10 && (WiFi.status() == WL_CONNECTED)) { // Wenn ein Objekt (z.B. eine Tasse) in der Nähe ist //Check WiFi connection status
float temp = mlx.readObjectTempC(); // Liest die Temperatur des Objekts
Serial.print("Tasse erkannt!");
Serial.print("Temperatur der Tasse: "); // Gibt einen Text aus
Serial.print(temp); // Gibt die gemessene Temperatur aus
Serial.println("°C"); // Gibt ein Gradzeichen aus
HTTPClient http; //Declare object of class HTTPClient
http.begin("http://202.61.207.122:8000/Sensordaten"); //Specify request destination
http.addHeader("Content-Type", "application/json"); //Specify content-type header
String TempTasse = "{\"Wert\":\"" + String(temp) + "\",\"SensorID\":\"9\",\"EinheitenID\":\"3\",\"SessionID\":\"0\"}"; //Get the response payload
int httpCode = http.POST(TempTasse); //Send the request
Serial.println(httpCode); //Print HTTP return code
//Serial.println(payload); //Print request response payload
http.end(); //Close connection
}
}
void printDistances() {
Serial.println( hc.dist(1) );
Serial.println( hc.dist(2) );
Serial.println( hc.dist(3) );
Serial.println( hc.dist(4) );
if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
HTTPClient http; //Declare object of class HTTPClient
http.begin("http://202.61.207.122:8000/Sensordaten"); //Specify request destination
http.addHeader("Content-Type", "application/json"); //Specify content-type header
String Cappuccino = "{\"Wert\":\"" + String(hc.dist(1)) + "\",\"SensorID\":\"1\",\"EinheitenID\":\"3\",\"SessionID\":\"0\"}";//Get the response payload
int httpCode1 = http.POST(Cappuccino);//Send the request
Serial.println(httpCode1);//Print HTTP return code
String CafeCrema = "{\"Wert\":\"" + String(hc.dist(2)) + "\",\"SensorID\":\"2\",\"EinheitenID\":\"3\",\"SessionID\":\"0\"}";//Get the response payload
int httpCode2 = http.POST(CafeCrema);//Send the request
Serial.println(httpCode2);//Print HTTP return code
String Espresso = "{\"Wert\":\"" + String(hc.dist(3)) + "\",\"SensorID\":\"3\",\"EinheitenID\":\"3\",\"SessionID\":\"0\"}";//Get the response payload
int httpCode3 = http.POST(Espresso);//Send the request
Serial.println(httpCode3);//Print HTTP return code
String Cafe2 = "{\"Wert\":\"" + String(hc.dist(4)) + "\",\"SensorID\":\"4\",\"EinheitenID\":\"3\",\"SessionID\":\"0\"}";//Get the response payload
int httpCode4 = http.POST(Cafe2);//Send the request
Serial.println(httpCode4);//Print HTTP return code
//Serial.println(payload); //Print request response payload
http.end(); //Close connection
}
delay(60);
}
void TempSens() {
sensor.requestTemperatures();
int tempC = sensor.getTempC();
Serial.print("Temperatur ");
Serial.print(String(tempC));
Serial.print("°C");
Serial.println();
delay(2500);
if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
HTTPClient http; //Declare object of class HTTPClient
http.begin("http://202.61.207.122:8000/Sensordaten"); //Specify request destination
http.addHeader("Content-Type", "application/json"); //Specify content-type header
String payload = "{\"Wert\":\"" + String(tempC) + "\",\"SensorID\":\"4\",\"EinheitenID\":\"3\",\"SessionID\":\"2\"}";//Get the response payload
int httpCode = http.POST(payload); //Send the request
Serial.println(httpCode); //Print HTTP return code
//Serial.println(payload); //Print request response payload
http.end(); //Close connection
}
}
void Pumpe() {
int sensorFeuchte = analogRead(SENSOR_PIN); // Liest den Feuchtesensor-Wert
if (sensorFeuchte < MIN_VALUE) { // Wenn der Feuchtesensor-Wert unter dem Mindestwert liegt
Serial.println("Feuchtigkeit: ");
Serial.println(sensorFeuchte);
digitalWrite(RELAY_PIN, HIGH); // Schaltet das Relais ein
delay(2000); // Wartet 5 Sekunden
digitalWrite(RELAY_PIN, LOW); // Schaltet das Relais aus
}
else{
digitalWrite(RELAY_PIN, LOW);
Serial.println("Feuchtigkeit: ");
Serial.println(sensorFeuchte);
}
if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
HTTPClient http; //Declare object of class HTTPClient
http.begin("http://202.61.207.122:8000/Sensordaten"); //Specify request destination
http.addHeader("Content-Type", "application/json"); //Specify content-type header
String Feuchtigkeit = "{\"Wert\":\"" + String(sensorFeuchte) + "\",\"SensorID\":\"7\",\"EinheitenID\":\"4\",\"SessionID\":\"0\"}";//Get the response payload
int httpCode = http.POST(Feuchtigkeit); //Send the request
Serial.println(httpCode); //Print HTTP return code
//Serial.println(payload); //Print request response payload
http.end(); //Close connection
}
delay(500); //Verzögerung, um die Messfrequenz zu reduzieren
}
void RfidDB(){
HTTPClient http; //Declare object of class HTTPClient
http.begin("http://202.61.207.122:8000/Sensordaten"); //Specify request destination
http.addHeader("Content-Type", "application/json"); //Specify content-type header
if (newRfidId.equals("C7 91 10 04")) {
// Code für Option 1
String verified = "{\"Wert\":\"" + String(newRfidId) + "\",\"SensorID\":\"6\",\"EinheitenID\":\"3\",\"SessionID\":\"1\"}";//Get the response payload //Einheiten? // Wie in der Datenbank ablegen?
int httpCodev1 = http.POST(verified); //Send the request
Serial.println(httpCodev1); //Print HTTP return code
//Serial.println(payload); //Print request response payload
http.end(); //Close connection
} else if (newRfidId.equals("DE 20 10 04")) {
String verified1 = "{\"Wert\":\"" + String(newRfidId) + "\",\"SensorID\":\"6\",\"EinheitenID\":\"3\",\"SessionID\":\"2\"}";//Get the response payload //Einheiten? // Wie in der Datenbank ablegen?
int httpCodev2 = http.POST(verified1); //Send the request
Serial.println(httpCodev2); //Print HTTP return code
//Serial.println(payload); //Print request response payload
http.end(); //Close connection
Serial.println("Option 2 ausgewählt");
} else if (newRfidId.equals("B9 A4 0F 04")) {
String verified2 = "{\"Wert\":\"" + String(newRfidId) + "\",\"SensorID\":\"6\",\"EinheitenID\":\"3\",\"SessionID\":\"3\"}";//Get the response payload //Einheiten? // Wie in der Datenbank ablegen?
int httpCodev3 = http.POST(verified2); //Send the request
Serial.println(httpCodev3); //Print HTTP return code
//Serial.println(payload); //Print request response payload
http.end(); //Close connection
} else if (newRfidId.equals("FE F0 10 04")) {
String verified3 = "{\"Wert\":\"" + String(newRfidId) + "\",\"SensorID\":\"6\",\"EinheitenID\":\"3\",\"SessionID\":\"4\"}";//Get the response payload //Einheiten? // Wie in der Datenbank ablegen?
int httpCodev4 = http.POST(verified3); //Send the request
Serial.println(httpCodev4); //Print HTTP return code
//Serial.println(payload); //Print request response payload
http.end(); //Close connection
} else if (newRfidId.equals("83 B9 4C 90")) {
String verified4 = "{\"Wert\":\"" + String(newRfidId) + "\",\"SensorID\":\"6\",\"EinheitenID\":\"3\",\"SessionID\":\"5\"}";//Get the response payload //Einheiten? // Wie in der Datenbank ablegen?
int httpCodev5 = http.POST(verified4); //Send the request
Serial.println(httpCodev5); //Print HTTP return code
http.end(); //Close connection
}
}
void TelegramMessage() {
//RFID auslesen
String input = newRfidId;
// Timer zurücksetzen, wenn die ID 'DE 20 10 04' erkannt wird
if (input == START_STRING) {
//Reset Timer
lastResetTime = millis();
timerRunning = false;
//Start Timer
lastStartTime = millis();
timerRunning = true;
}
// Timer auslösen, wenn er abgelaufen ist
if (timerRunning && timerAlarmEnabled(0)) {
if (millis() - lastStartTime >= RESET_INTERVAL_MS) {
Serial.println("Timer abgelaufen!");
//Reset Timer
lastResetTime = millis();
timerRunning = false;
Serial.println("7 Tage sind vergangen!");
// Telegram Nachricht senden
String message = "Hol' dir einen Kaffe, bevor du einschläfst Peppe!";
bot.sendMessage(CHAT_ID, message, "");
}
}
// Polling-Intervall warten
delay(POLL_INTERVAL_MS);
}
Er lässt sich kompilieren aber nicht auf den ESP32 hochladen.
Die Sensoren und Aktoren werden extern mit Spannung Versorgt.
Die Spannung wird von einem 24V DC 3A Netzteil auf jeweils 12V/5V/3,3V mit 3xLM2596S geregelt.
Folgender Error erscheint und das Projekt muss morgen Abend (16.05.2023) abgegeben werden.
Leider kenne ich mich gut genug aus, um mögliche Fehler zu lösen.
Vielen Dank im Voraus.