Serrure RFID avec écran de type PCF8574

Bonjour à tous,

J’ai réussi à me débrouiller et à réaliser à 80% mon idée, cependant il me reste 2 détails à régler.

Je réalise donc une serrure avec lecteur RFID (RC522) ainsi qu’un écran LCD 16x2 (PCF8574), un relais 5v (Ali) et un buzzer, le tout sur un ESP32 (WROOM-32D)
En suivant toute la doc d’ESPHOME.IO j’ai pratiquement réussi à tout faire.
J’ai un soucis de commande du relais, la sortie (GPIO13 dans mon cas) est toujours activée, je n’arrive pas à la mettre en pulldown.

Mon deuxième soucis est dans la commande de l’écran, j’arrive à le faire fonctionner mais de manière fixe. Il affiche l’heure et la date du jour, puis « j’attends un tag ».
Je souhaite afficher autre chose lorsqu’un tag particulier est lu.
Par exemple « bienvenue » si un tag est connu et « mauvais tag » dans le cas contraire.

Voici mon code :

esphome:
  name: esp-wroom
  friendly_name: Serrure RFID

esp32:
  board: denky32
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxxxxxxxxxx"

ota:
  - platform: esphome
    password: "xxxxxxxxxxxxxxxxxxxxxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip: 
    static_ip: 192.168.1.86
    gateway: 192.168.1.1
    subnet: 255.255.255.0

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp-Wroom Fallback Hotspot"
    password: "xxxxxxxxxxxxxxxxxx"

captive_portal:
  
web_server:
  port: 80
    
spi:
  clk_pin: GPIO18
  mosi_pin: GPIO23
  miso_pin: GPIO19
  id: "rfid"

rc522_spi:
  cs_pin: GPIO4
  reset_pin: GPIO5
  spi_id: "rfid"
  update_interval: 0.1s
  on_tag:
    then:
      - homeassistant.tag_scanned: !lambda 'return x;'
      - rtttl.play: 'long:d=1,o=5,b=100:e6'
      - text_sensor.template.publish:
          id: rfid_tag
          state: !lambda 'return x;'

text_sensor:
  - platform: template
    name: "RFID Tag"
    id: rfid_tag   
      
binary_sensor:
  - platform: rc522
    uid: XX-XX-XX-XX
    name: "Carte David"
    on_state:
      then:
        - rtttl.play: 'scale_up:d=32,o=5,b=100:c,c#,d#,e,f#,g#,a#,b'
        
  - platform: rc522
    uid: XX-XX-XX-XX
    name: "KeyFob David"
    on_state:
      then:
        - rtttl.play: 'scale_up:d=32,o=5,b=100:c,c#,d#,e,f#,g#,a#,b'
   
i2c:
  sda: GPIO21
  scl: GPIO22
  frequency: 400kHz
  timeout: 30ms

display:
  - platform: lcd_pcf8574
    dimensions: 16X2
    address: 0x27
    lambda: |-
      it.strftime("%H:%M %d.%m.%Y", id(my_time).now());
      it.print(0, 1, "j'attends un tag");
time:
- platform: homeassistant
  id: my_time
        
output:
  - platform: ledc
    pin: GPIO12
    id: rtttl_out

rtttl:
  output: rtttl_out

switch:
  - platform: gpio
    pin: GPIO13
    id: relay
    name: "Porte du sous-sol"
    icon: "mdi:door-closed-lock"
    on_turn_on:
    - delay: 2000ms
    - switch.turn_off: relay

Merci d’avance à ceux qui vont décortiquer le code. ^^

Je me réponds à moi-même pour le coup,
Je me suis inspiré de ce que j’ai vu ici et j’ai changé de PIN. J’ai pris le 25 et ça réagissait, mais à l’envers. J’ai donc ajouté « inverted: true » dans mon yaml et c’est tout bon.
C’est OK pour le relais donc.
Reste l’écran maintenant.

Récap de la fin de mon yaml:

switch:
  - platform: gpio
    pin: GPIO25
    inverted: True
    id: relay
    name: "Porte du sous-sol"
    icon: "mdi:door-closed-lock"
    on_turn_on:
    - delay: 2000ms
    - switch.turn_off: relay
1 « J'aime »

Salut

Pense a mettre ton sujet a résolu STP

J’ai toujours un problème avec mon écran
Je mettrais résolu si une âme charitable a une astuce :wink:
je cherche toujours en même temps

Pour le moment j’ai ça qui fonctionne :

display:
  - platform: lcd_pcf8574
    dimensions: 16X2
    address: 0x27
    lambda: |-
      it.strftime("%H:%M %d.%m.%Y", id(my_time).now());
      it.print(0, 1, "j'attends un tag");

Maintenant il faut rajouter du « if » et du « else if » après lambda mais la syntaxe me manque…

tu veux bien dire ce que tu cherches a faire avec ton ecran ?

Hé bien lorsque je passe un tag devant le lecteur, si le tag est connu, que l’écran affiche pendant 5 secondes par exemple : « Bienvenue xxxx » ou « Bienvenue yyyy » en fonction du tag.
Si le tag est inconnu, un autre message du style « Tag inconnu » pendant 5 secondes également.

Salut

il y a plein d’exemple dans la doc esphome :


et peut-être même qu’un case est plus simple

Merci @Pulpy-Luke, je vais me calquer là-dessus ^^

tu as aussi un youtuber qui fait de tres bon tuto sur ESPHOME

https://www.youtube.com/@docteurcyprien
@Tedour sur le forum.

1 « J'aime »

J’ai sacrément avancé pour le coup.
(j’y ai passé la journée non stop en même temps… )
A un détail près j’ai réussi. Il faut juste que je fignole la temporisation que je n’ai pas encore trouvé mais c’est pleinement fonctionnel.
Comble du luxe, je me suis rajouté un bip horaire, comme sur les montre Casio :rofl: :joy:
La partie du code concernée donc:

binary_sensor:
  - platform: rc522
    uid: xx-xx-xx-xx
    id: david
    name: "David"
    on_state:
      then:
        - rtttl.play: 'scale_up:d=32,o=5,b=100:c,c#,d#,e,f#,g#,a#,b'
        - switch.turn_on: relay

  - platform: rc522
    uid: xx-xx-xx-xx
    id: cathy
    name: "Cathy"
    on_state:
      then:
        - rtttl.play: 'scale_up:d=32,o=5,b=100:c,c#,d#,e,f#,g#,a#,b'
        - switch.turn_on: relay
  
  - platform: rc522
    uid: xx-xx-xx-xx
    id: manon
    name: "Manon"
    on_state:
      then:
        - rtttl.play: 'scale_up:d=32,o=5,b=100:c,c#,d#,e,f#,g#,a#,b'
        - switch.turn_on: relay
  
  - platform: rc522
    uid: xx-xx-xx-xx
    id: noah
    name: "Noah"
    on_state:
      then:
        - rtttl.play: 'scale_up:d=32,o=5,b=100:c,c#,d#,e,f#,g#,a#,b'
        - switch.turn_on: relay
i2c:
  sda: GPIO21
  scl: GPIO22
  frequency: 400kHz
  timeout: 30ms

display:
  - platform: lcd_pcf8574
    dimensions: 16x2
    address: 0x27
    id: lcd
    lambda: |-
          switch (id(page)){
            case 1:
              it.print(3, 0, "GOD Access !");
              break;
            case 2:
              it.print(0, 0, "Bienvenue Cathy");
              break;
            case 3:
              it.print(0, 0, "Bienvenue Manon");
              break;
            case 4:
              it.print(0, 0, "Bienvenue Noah");
              break;
            case 5:
              it.strftime("%H:%M %d.%m.%Y", id(my_time).now());
              it.print(4, 1, "Bonjour");
              break;
          }

globals:
- id: page
  type: int
  initial_value: "5"

interval:
- interval: 2s
  then:
    - lambda: |-
        if (id(david).state) {
          (id(page) = 1);
        }
        else if (id(cathy).state) {
          (id(page) =2);
        }
        else if (id(manon).state) {
          (id(page) =3);
        }  
        else if (id(noah).state) {
          (id(page) =4);
        }
        else
          (id(page) = 5);
         
time:
- platform: homeassistant
  id: my_time
- platform: sntp
  on_time:
    - seconds: 0
      minutes: 0
      hours: /1
      then:
        - rtttl.play: "two_short:d=4,o=5,b=100:16e6,16e6"
          

la seule chose au final c’est que je dois mettre mon badge 2 secondes face au lecteur pour que l’écran affiche quel badge il a reconnu.
J’ai essayé plusieurs valeurs au réglage « interval » mais même si je mets 10ms il faut quand même rester environ 1 seconde le badge collé au lecteur… C’est du détail à fignoler.