Ich möchte 2 Hühnerklappen steuern, das müsste eigentlich auch mit einem ESP32 gehen.
Ich bin mir nicht sicher ob die GPIO dafür reichen, ich benötige 19
Für eine Hühnerklappe benötige ich:
3 GPIO für die DRV8876 H-Brücke (EN, DIR, CS), auf den Faultausgang müsste ich verzichten können)
5 GPIO für 2 Reedkontakte, ein Mikroschalter und 2 Taster
Dies ergibt 8 GPIO pro Hühnerklappe.
Mit 3 GPIO für eine LED und I2C für den RTC DS3231 komme ich auf insgesammt auf 19 GPIO.
Ich möchte das DOIT ESP32 DEVKIT V1 verwenden.
Laut dieser Seite könnte es knapp reichen
Bei einigen GPIO bin ich mir nicht sicher ob ich diese ohne Einschränkung verwenden kann
Kann ich die GPIO 5, 14 und 15 als Eingang verwenden?
Kann ich den GPIO 12 als Ausgang verwenden?
Was ist mit strapping Pin gemeint?
Du kannst den ESP32 durch einen I2C-Portexpander um weitere Pins erweitern. Damit sollte es keinen Engpass was die Pins betrifft, ergeben.
Zitat:
Was sind Strapping-Pins in ESP32?
Der ESP32-C3 verfügt über drei Verbindungspins: GPIO2, GPIO8 und GPIO9 . Während des Systemresets des Chips erfassen die Verbindungspins ihre Spannungspegel und speichern sie im Latch, bis der Chip ausgeschaltet oder heruntergefahren wird. Abhängig von den gespeicherten Spannungspegeln wechselt der Chip nach dem Systemreset in verschiedene Boot-Modi.
Ok, hatte deinen Link auf meinem Handy vorhin übersehen.
Aber daraus kannst du ja schon einiges entnehmen. Aber wozu eine RTC ?
Mit WLan kannst do doch auch NTP verwenden.
Kann man generell nicht beantworten. Beispiel GPIO5 ist beim Booten ein Ausgang. Wenn Du den als Eingang verwenden möchtest und da hängt ein Ausgang dran, könnte es Rauch geben. Ist da ein Taster dran, der beim Booten offen ist, darfst Du ihn beim Booten nicht drücken.
Könntest Du direkt an den ESP32 anschließen.
RTC DS3231 parallel zu Portexpandern wie z. B. PCF8575 oder MCP23017 für Taster, Reedkontakte und LEDs. Portexpander können auch genügend Strom für LEDs liefern. Dann reichen die Pins vom ESP32 und Du umgehst die Strapping Pins
Den RTC verwende ich nur zur Sicherheit, es soll im Notfall auch ohne WLAN funktionieren.
Wenn ich den GPIO 5 für die LED verwende, komme ich auf 19 verwendbare GPIO, dann müsste es passen.
Wenn ich an GPIO 14 und 15 Taster anschließen wollte, und es absichern wollte, dann müsste ich demnach ein Widerstand in Reihe zum Taster schalten.
Sind da 100 Ohm ausreichend?
Ja, ok.
Das verstehe ich. Dann nutzt du doch auch I2C und kannst prima einen der genannten Portexpander einsetzen.
Dann hast du def. keine Probleme mit der Pinanzahl und vermutlich auch genug Reserve.
Die GPIOs 34, 35, 36 und 39 haben keine internen PullUp- oder PullDown-Widerstände, können sonst aber wie normale Eingänge verwendet werden. Damit sind es insgesamt 22 GPIOs plus I²C-Schnittstelle, TXD0 und RXD0.
Ein ESP32 GPIO kann max 40 mA, empfohlen werden max 20 mA.
Ich komme beim devkit V1 (mit GPIO 5, 14 und 15) auf 21 nutzbare GPIO und ich benötige 19 da habe ich noch Reserve.
Da ist kein I2C Portexpander notwendig, aber ich werde auf der Lochstreifenplatine den Platz dafür vorsehen.
Die GPIOs 34, 35, 36 und 39 passen für die Reedkontakte.
Ich habs inzwischen mal mit einer vorhandenen alten Hühnerklappe aus Holz getestet. Sie wiegt ca 1 kg.
Bei der Berrechnung vom Strom bin ich mir nicht ganz sicher.
Ich messe den Strom alle 25ms und bilde den Mittelwert von 20 Messungen.
Ich messe den Strom in mA nur aufwärts bei einem Tastverhältnis von 100%.
Bei 1,65V bekomme ich mit analogRead 1920
Beim pololu DRV8876 ist bei 1A am CS Pin 2,5 V -> bei 2,5 V ist analogRead dann 2909,1
wenn ich 20 mal aufsummiere muss ich durch 58,1818 teilen,
Ich bekomme dann die folgenden Werte in mA:
253
293
299
299
282
352
374
360
352
343
Ich werde auch noch eine Überstromabschaltung einbauen bei ca 600-700mA.
Ich habe den ESP32 als telnet Server konfiguriert.
Mir ist dabei aufgefallen, dass es bei Problemen beim Aufbau der Telnet Verbindung passieren kann, daß die Loop Routine einige Sekunden nicht aufgerufen wird.
Da in der Loop Routine die Tasten und Kontakte abgefragt werden, ist es bei mir beim Testen ein paar mal vorgekommen, dass ich den Motor nur durch auftrennen der Stromversorgung stoppen konnte.
Dies ist bei dem folgenden Test passiert:
Da meine Haupt Fritzbox zu weit vom Hühnerstall weg ist, habe ich zum testen eine weitere Fritzbox auf die Fensterbank gestellt. Dass Wlan Geräte untereinander kommunizieren dürfen war noch deaktiviert.
Ich habe das Tablet mit zum Hühnerstall genommen und wollte mich mit der ConnectBot App per Telnet verbinden.
Vermutlich hat sich beim Versuch die Telnet Verbindung aufzubauen das Tablet die Wlan Verbindung von der Haupt Fritzbox zur anderen Fritzbox gewechselt.
Defaultmässig wird da anscheinend kein Watchdog ausgelöst.
Gibts eine Möglichkeit, dass ein Watchdog ausgelöst wird, wenn die Loop Routine für ca 1 Sek nicht aufgerufen wird oder gibts noch eine andere Möglichkeit?
ja hast du denn einen Watchdog implementiert? Wenn ja - wie?
Zu der Frage von den Möglichkeiten:
ich würde statt einem Watchdog zunächst überprüfen, weswegen es zu einer (geglaubten) Blockade des Telnet Servers kommt und das behandeln.
Aber ohne Code (mit eindeutigen Referenzen auf eventuell verwendete Libraries) - ist das aber nur rumgerate.
Wie kann ich da eine neue Telnetverbindung verhindern, wenn der Motor läuft?
Ist es ausreichend, wenn ich in der WiFiEvent Routine
void WiFiEvent()
{
//check if there are any new clients
if (Server.hasClient()) {
if (!client || !client.connected()) {
if (client) client.stop();
client = Server.available();
client.flush();
Serial.print(F("New client: "));
Serial.println(client.remoteIP());
} else {
WiFiClient rejectClient = Server.available();
rejectClient.stop();
Serial.print(F("Reject new Client="));
Serial.println(rejectClient.remoteIP());
}
}