Hühnerklappensteuerung mit ESP32?

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?

Gruß Ralf

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.

Und weieres zu Pins Hier.

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 :slightly_smiling_face:

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?

Das hängt vom maximalen Strom ab, den der Ausgang liefern kann.

3,3 V / 0,02 A = 165 Ω

Die 6 mA lassen LEDs nur glimmen

EDIT: von 6 auf 20 mA geändert.

Nicht wirklich. Die leuchten schon. Und dann gibt es ja noch low current LEDs

Mich stört, daß ein Projekt ohne Not auf Kante genäht wird. Aber entscheiden muß das der TO, ich möchte nur Hinweise geben.

Vermutlich um Geld zu sparen. :wink:
Dabei kann das so einfach sein.

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.

EDIT: Pinout V4 gegen V1 getauscht.

Der TO hat ein V1, nicht den alten V4, was hat aber nichts zu sagen.

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.

Hey, du hast doch hier reingeworfen, dass es knapp werden könnte.

Habe das Pinout getauscht.

Steht tatsächlich so im Datenblatt, habe ich wohl mit einem anderen µC verwechselt :flushed_face:

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?

Gruß Ralf

Kann gesagt werden, wenn wir den aktuellen Code sehen.

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.

frage vor dem Telnet-Aufruf den Status des Antrieb ab. Antrieb läuft -> kein telnet

Der ESP32 ist als Telnet Server konfiguriert, im Setup steht u.a.:

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  WiFi.config(ip, gateway, subnet);
  initEEPROM();  // Reading values from eeprom
  Server.begin();
  Server.setNoDelay(true);

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());
    }
  }

auf Motorläuft teste?

if (!Motorlaeuft && Server.hasClient()) {

Wenn Du eine MotorLaeuft-Variable hast, die true zurück gibt, wenn aktiv, nutz die als Einzeiler:
if (Motorlaeuft) return;
als erste Zeile - fertig.

Das könnte funktionieren.