Hallo Zusammen,
Ich benötige eure Hilfe, bei der Umsetzung der Schaltung oder des Codes. Ich bin mir hier leider nicht sicher auf weclher Grundlage der Fehler zustande kommt.
ich habe für meine Bewässerungssteuerung einen ESP32 in Benutzung, welcher über ein Relaisboard die jeweiligen HUNTER Ventile steuert. Dies geschieht in Abhängigkeit eines Bodenfeuchtigkeitssensors, welcher über die I2C Schnittstelle die entsprechenden Daten liefert. Da im Livebetrieb die Leitung des Bodensensors ca. 10m ist, habe ich für die beiden Datenleitungen einen Pullup Widerstand der Schaltung hinzugefügt. Die Werte werden so ohne Fehler geliefert.
Situation:
Beim Starten des ESP32 werden alle Pins (3 Pins für 3 Ventile) auf LOW gesetzt. --> Damit die Magnetventile nicht geschaltet werden. Dies funkioniert ohne die Pullupwiderstände für den Sensor einwandfrei!. Nun benötige ich aber für die Daten des Sensors die Widerstände da dieser sonst nicht liefert. Wenn diese beim booten an VDD liegen, werden die Relais aber nicht auf LOW gezogen. Das Programm bleibt gefühlt stehen. Erst beim entfernen der Widerstände läuft das Programm wie gewünscht weiter. Danach kann ich die Widerstände wieder setzen und trotzdem alle Relais wie gewünscht steuern.
Das Problem was sich dadurch ergibt:
Sollte es zu einem Stromausfall kommen, würden alle Bewässerungsventile angehen und ich würde dies nicht mitbekommen, da der ESP nicht wie gewünscht bootet und die Relais -Pins entsprechend schaltet!
Was habe ich getetstet:
Den Code mit einem "Delay" ergänzt, da ich dachte das durch die Widerstände die Spannung für das Relaisboard nicht ausreicht und ich die Pins, nicht gleichzeitig sondern nacheinader schalte. --> Hat nicht funktioniert
Das Relay mit einer extra 5V Spannung versorgt --> Hat nicht funktioniert!
Leider weiß ich hier nicht weiter und würde mich freuen, wenn ihr mir einen Tipp geben könnt, wie dies Zustande kommt.
Dies ist meiner erster Post und ich hoffe das ich den nachfolgenden Code richtig hier einfüge...
#include <WiFi.h>
#include <Wire.h>
#define relay1 27 // Grau
#define relay2 26 // Lila
#define relay3 25 // Orange
#define relay4 33 // Gelb
#define relay5 32 // Blau
#define relay6 13 // Grün
//define SDA_0 27
//#define SCL_0 26
//#define I2C_Freq 100000
//TwoWire I2C_0 = TwoWire(0);
//const char* wifi_name = "wifi"; // Your Wifi network name here
//const char* wifi_pass = "12345678"; // Your Wifi network password here
const char* wifi_name = "wifi2"; // Your Wifi network name here
const char* wifi_pass = "12345678"; // Your Wifi network password here
int val1 = 0;
int val2 = 0;
int val3 = 0;
//int val4 = 0;
//int val5 = 0;
//int val6 = 0;
WiFiServer server(80); // Server will be at port 80
//int relay_pin = 2;
void setupI2C() //call once
{
Wire.begin(12,14); // join i2c bus as master
}
int SoMoSe_getAveragedSensorValue(int Adr)
{
int value;
int dump;
//Wire.beginTransmission(byte(Adr)); // transmit to device
Wire.beginTransmission(byte(Adr)); // transmit to device
Wire.write(byte(0x76)); // command read value
Wire.endTransmission(); // stop transmitting
delay(1); // maybe some delay is required
Wire.requestFrom(byte(Adr), (byte)2); // request 2 bytes from slave device
if (2 <= Wire.available()) // if two bytes were received
{
value = Wire.read();
dump = Wire.read();
}
return value;
}
char SoMoSe_getTemperatureValue(int Addr)
{
signed char value;
Wire.beginTransmission(byte(Addr));
Wire.write(byte(0x74));
Wire.endTransmission();
delay(1);
Wire.requestFrom(byte(Addr), (byte)1); // request 1 byte from slave device
if (1 <= Wire.available())
{
value = Wire.read();
}
return value;
}
void setup() {
Serial.begin (115200);
pinMode(relay1, OUTPUT);
digitalWrite(relay1, LOW); // HIGH makes open circuit at relay // Attempt WIFI Connect
delay (500);
pinMode(relay2, OUTPUT);
digitalWrite(relay2, LOW);
delay (500);
pinMode(relay3, OUTPUT);
digitalWrite(relay3, LOW);
delay (500);
//pinMode(relay4, OUTPUT);
//digitalWrite(relay4, LOW);
//delay (500);
//pinMode(relay5, OUTPUT);
//digitalWrite(relay5, LOW);
//delay (500);
//pinMode(relay6, OUTPUT);
//digitalWrite(relay6, LOW);
Serial.println("Feuchtigkeitssensor");
setupI2C();
Serial.print ("Connecting to ");
Serial.print (wifi_name);
WiFi.begin (wifi_name, wifi_pass); // Connecting to the wifi network
while (WiFi.status() != WL_CONNECTED) // Waiting for the response of wifi network
{
delay (1000);
Serial.print (".");
}
Serial.println("");
Serial.println("WLAN Verbindung hersgestellt");
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); // Getting the IP address
Serial.println("Type the above IP address into browser search bar");
server.begin(); // Starting the server
}
void loop() {
WiFiClient client = server.available(); // listen for incoming clients
if (client) {
String currRequestLine = ""; // buffer for the incoming request
int lineCount = 0;
String firstLine;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n') {
lineCount++;
// read request header (first line)
if (lineCount == 1) {
firstLine = currRequestLine;
Serial.println(firstLine);
}
if (currRequestLine.length() == 0) {
// request end
sendResponse(firstLine, client);
break;
} else {
currRequestLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currRequestLine += c; // add it to the end of the currentLine
}
}
}
// close the connection:
client.stop();
}
}
void sendResponse(String reqFirstLine, WiFiClient client) {
if (reqFirstLine == "GET / HTTP/1.1") {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
// send minified index.html file
//client.print("<!DOCTYPE html><html><head><title>ESP32 Sensor</title><style type=\"text/css\">.box {width: 100px;height: 100px;margin: 0 auto;padding: 2.5px;position: relative;box-shadow: 0 1px 3px rgba(0,0,0,.12), 0 1px 2px rgba(0,0,0,.24);}.point {width: 5px;height: 5px;margin-left: -2.5px;margin-top: -2.5px;background: red;border-radius: 50%;position: relative;}</style></head><body><main><div class=\"box\"><div class=\"point\"></div></div><div class=\"time\"></div></main><script src=\"https://code.jquery.com/jquery-3.2.1.min.js\" integritysha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=\" crossorigin=\"anonymous\"></script><script type=\"text/javascript\">(function(jQuery) {let box = jQuery('.box'), time = jQuery('.time'), point = jQuery('.point');function updatePoint() {jQuery.ajax({url: 'http://"+host+"/sensor',type: 'GET',success: (res) => {point.css({ 'left': res.x * box.width(), 'top': res.y * box.height() });time.html(res.time);setTimeout(updatePoint, 10);},error: () => {setTimeout(updatePoint, 1000);}})}updatePoint();})(jQuery);</script></body></html>");
}
//Humidity Request
else if (reqFirstLine == "GET /humidity HTTP/1.1") {
// response header
int hum = SoMoSe_getAveragedSensorValue(0x01);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
// send sensor data in JSON format
// client.print("{\"Bodenfeuchtigkeit\":" + String(hum) + "},");
Serial.println(hum);
}
//Temperature Request
else if (reqFirstLine == "GET /temperature HTTP/1.1") {
// response header
int temp = SoMoSe_getTemperatureValue(0x01);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
// send sensor data in JSON format
// client.print("{\"Bodentemperatur\":" + String(temp) + "},");
Serial.println(temp);
}
// Relay Steuerung
else if (reqFirstLine == "GET /relay1=1 HTTP/1.1") {
// response header
digitalWrite(relay1, LOW);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
//client.println("{\"status\":\"r1 On\"}"); delay(1);
}
else if (reqFirstLine == "GET /relay1=0 HTTP/1.1") {
// response header
digitalWrite(relay1, HIGH);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
//client.println("{\"status\":\"r1 Off\"}"); delay(1);
}
else if (reqFirstLine == "GET /relay2=1 HTTP/1.1") {
// response header
digitalWrite(relay2, LOW);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
//client.println("{\"status\":\"r2 On\"}"); delay(1);
}
else if (reqFirstLine == "GET /relay2=0 HTTP/1.1") {
// response header
digitalWrite(relay2, HIGH);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
//client.println("{\"status\":\"r2 Off\"}"); delay(1);
}
else if (reqFirstLine == "GET /relay3=1 HTTP/1.1") {
// response header
digitalWrite(relay3, LOW);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
//client.println("{\"status\":\"r3 On\"}"); delay(1);
}
else if (reqFirstLine == "GET /relay3=0 HTTP/1.1") {
// response header
digitalWrite(relay3, HIGH);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
//client.println("{\"status\":\"r3 Off\"}"); delay(1);
}
else if (reqFirstLine == "GET /relay4=1 HTTP/1.1") {
// response header
digitalWrite(relay4, LOW);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
//client.println("{\"status\":\"r4 On\"}"); delay(1);
}
else if (reqFirstLine == "GET /relay4=0 HTTP/1.1") {
// response header
digitalWrite(relay4, HIGH);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
//client.println("{\"status\":\"r4 Off\"}"); delay(1);
}
else if (reqFirstLine == "GET /relay5=1 HTTP/1.1") {
// response header
digitalWrite(relay5, LOW);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
//client.println("{\"status\":\"r5 On\"}"); delay(1);
}
else if (reqFirstLine == "GET /relay5=0 HTTP/1.1") {
// response header
digitalWrite(relay5, HIGH);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
//client.println("{\"status\":\"r5 Off\"}"); delay(1);
}
else if (reqFirstLine == "GET /relay6=1 HTTP/1.1") {
// response header
digitalWrite(relay6, LOW);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
//client.println("{\"status\":\"r6 On\"}"); delay(1);
}
else if (reqFirstLine == "GET /relay6=0 HTTP/1.1") {
// response header
digitalWrite(relay6, HIGH);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
//client.println("{\"status\":\"r6 Off\"}"); delay(1);
}
else if (reqFirstLine == "GET /relayall=1 HTTP/1.1") {
// response header
digitalWrite(relay1, LOW);
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
digitalWrite(relay5, LOW);
digitalWrite(relay6, LOW);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
}
else if (reqFirstLine == "GET /relayall=0 HTTP/1.1") {
// response header
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);
digitalWrite(relay3, HIGH);
digitalWrite(relay4, HIGH);
digitalWrite(relay5, HIGH);
digitalWrite(relay6, HIGH);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
}
else {
// 404 not found
client.println("HTTP/1.1 404 Not Found");
client.println("Content-Type: text/html");
client.println();
client.print("This page is not available.");
}
val1 = digitalRead(relay1);
val2 = digitalRead(relay2);
val3 = digitalRead(relay3);
val4 = digitalRead(relay4);
val5 = digitalRead(relay5);
val6 = digitalRead(relay6);
int hum = SoMoSe_getAveragedSensorValue(0x01);
int temp = SoMoSe_getTemperatureValue(0x01);
float humwert =((float)hum/256)*100;
client.println("{\"Bodenfeuchtigkeit\":" + String(hum) + ",\"BodenfeuchtigkeitProzent\":" + String(humwert) + ",\"Bodentemperatur\":" + String(temp) + ",\"statusR1\":" + String(val1) + ",\"statusR2\":" + String(val2) + ",\"statusR3\":" + String(val3) + ",\"statusR4\":" + String(val4) + ",\"statusR5\":" + String(val5) + ",\"statusR6\":" + String(val6) + "}"); delay(1);
client.println();
}
