/ tech

MultiSensor - entre impression 3D et NodeMCU

Idée de départ

IMG_20200322_090637

Photos du projet terminé :

IMG_20200322_091531

IMG_20200322_091444

IMG_20200322_091450

IMG_20200322_091457

IMG_20200322_091458

IMG_20200322_091538

Le matos

Az Delivery NodeMCU Lua Lolin V3 (60mmx31mm)

LED RGB (4 broches)

DHT22 (capteur température / humudité)

AM312 (détécteur de mouvement)

Ecran OLED 0.96" I2C 128x64

Cable Dupont

Modelisation 3D

J'ai créé un prisme en haut de la piece pour y insérer la LED de manière à diriger la lumière émise.

J'ai créé un emplacement sur le coté pour la sonde de temperature de manière à ce qu'elle soit en dehors du boitier pour plus de précision.

il y a également l'emplacement sur la face supérieure qui permet d'y mettre le capteur de luminosité (que je n'ai pas pu installé pour manque de pin d'alimentation sur nodemcu).

Enfin pour l'ecran j'ai reduit l'epaisseur du cube sur la dimension de l'ecran OLED.

cura_body01

cura_base01

Pour ma part il a fallu très légerement poncé les coins du socle pour permettre de fermer le boitier.

Le lien pour les STL réalisé

Code du NodeMCU

il faut utiliser les images suivantes et les copier dans le repertoire config d'ESPHome :

hum-1

temp-1

Désolé pour la mise en page :)

et recupérer la font suivante (que l'on mettra également dans le répertoire config d'esphome):
Montserrat

On passe au code ESPHome :

esphome:
  name: Nom du sensor
  platform: ESP8266
  board: nodemcuv2

wifi:
  ssid: "monreseauwifi"
  password: "monmotdepasse"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Nom du sensor Fallback Hotspot"
    password: "8452ATFzTwfwx"

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: "motdepasse"

ota:
  password: "motdepasse"

i2c:
  sda: D5
  scl: D3
  scan: True
   

font:
  - file: "monserrat.ttf"
    id: my_font
    size: 58


image:
  - file: "temp.png"
    id: temp_image
    resize: 64x64
  - file: "hum.png"
    id: hum_image
    resize: 64x64

sensor:
  - platform: dht
    pin: D7
    model: dht22
    temperature:
      id: temp
      name: "Temperature"
      filters:
        - calibrate_linear:      
            - 0.0 -> 0.0
            - 22.5 -> 19.8      
    humidity:
      id: hum
      name: "Humidity"
    update_interval: 30s
  - platform: wifi_signal
    name: "WiFi Signal Sensor"
    update_interval: 60s
  - platform: uptime
    name: Uptime Sensor

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    id: my_display
    address: 0x3C
    pages:
      - id: page1
        lambda: |-
          if (id(mvt).state) {
          it.image(32, 0, id(temp_image));
          }
      - id: page2
        lambda: |-
          if (id(mvt).state) {
          it.printf(0, 40, my_font,"%.1f", id(temp).state);
          }
      - id: page3
        lambda: |-
          if (id(mvt).state) {
          it.image(32, 0, id(hum_image));
          }
      - id: page4
        lambda: |-
          if (id(mvt).state) {
          it.printf(0, 40, my_font,"%.1f", id(hum).state);
          }

interval:
  - interval: 5s
    then:
      - display.page.show_next: my_display
      - component.update: my_display

text_sensor:    
  - platform: version
    name: "ESPHome Version"
  - platform: wifi_info
    ip_address:
      name: IP Address    

output:
  - platform: esp8266_pwm
    pin: D2
    id: redgpio
  - platform: esp8266_pwm
    pin: D4
    id: greengpio
  - platform: esp8266_pwm
    pin: D6
    id: bluegpio

binary_sensor:
  - platform: gpio
    pin: D1
    id: mvt
    name: "Motion"
    device_class: motion

light:
  - platform: rgb
    name: "status alarme"
    red: redgpio
    green: greengpio
    blue: bluegpio

Explication du code :

i2c:

sur le bus i2c

  sda: D5
  scl: D3
  scan: True

on branche la pin sda de l'ecran OLED sur la pin D5 du NodeMCU.
on branche la pin sck(scl) de l'ecran OLED sur la pin D5 du NodeMCU.
et on active le scan sur le bus.

font:
  - file: "monserrat.ttf"
    id: my_font
    size: 58

on declare la font utilisé sur l'ecran OLED pour les textes avec sa taille.

image:
  - file: "temp.png"
    id: temp_image
    resize: 64x64
  - file: "hum.png"
    id: hum_image
    resize: 64x64

on declare nos images que l'on affichera sur l'ecran OLED

sensor:
  - platform: dht
    pin: D7
    model: dht22
    temperature:
      id: temp
      name: "Temperature"
    humidity:
      id: hum
      name: "Humidity"
    update_interval: 30s
  - platform: wifi_signal
    name: "WiFi Signal Sensor"
    update_interval: 60s
  - platform: uptime
    name: Uptime Sensor

On ajoute le capteurd e temperature dont la PIN OUT (data) sera branché sur D7 sur le NodeMCU.
et tag la sonde temperature avec l'id temp, et celle de l'humidité en id hum, ces tags seront utilisés pour le texte afficher à l'ecran.
Les sensors wifi_signal et uptime parlent d'eux mêmes.

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    id: my_display
    address: 0x3C
    pages:
      - id: page1
        lambda: |-
          if (id(mvt).state) {
          it.image(32, 0, id(temp_image));
          }
      - id: page2
        lambda: |-
          if (id(mvt).state) {
          it.printf(0, 40, my_font,"%.1f", id(temp).state);
          }
      - id: page3
        lambda: |-
          if (id(mvt).state) {
          it.image(32, 0, id(hum_image));
          }
      - id: page4
        lambda: |-
          if (id(mvt).state) {
          it.printf(0, 40, my_font,"%.1f", id(hum).state);
          }

on declare notre modèle d'écran ici SSD1306 avec sa résolution pour moi 128x64.
on positionne son id à my_display
son adresse sur le bus i2C normallement 0x3C
et on declare nos pages :

  • page 1 on affiche l'image pour la temperature (la flamme), au milieu de l'écran.
  • page 2 on affiche la temperature à l'écran.
  • page 3 on affiche l'image pour l'humidité (la goutte), au milieu de l'écran.
  • page 4 on affiche l'humidité à l'écran.
interval:
  - interval: 5s
    then:
      - display.page.show_next: my_display
      - component.update: my_display

On lance un timer de 5s qui va switcher de page à chaque fois.

text_sensor:    
  - platform: version
    name: "ESPHome Version"
  - platform: wifi_info
    ip_address:
      name: IP Address  

On declare nos sensor version et adresse wifi

output:
  - platform: esp8266_pwm
    pin: D2
    id: redgpio
  - platform: esp8266_pwm
    pin: D4
    id: greengpio
  - platform: esp8266_pwm
    pin: D6
    id: bluegpio

On declare les pin sur lesquelles sont branchés la LED

binary_sensor:
  - platform: gpio
    pin: D1
    id: mvt
    name: "Motion"
    device_class: motion

On declare notre sensor de mouvement branché sur la pin D12 pour les datas

light:
  - platform: rgb
    name: "status alarme"
    red: redgpio
    green: greengpio
    blue: bluegpio

Enfin on declare notre led comme statue alarme que l'on utilisea tel quelle sous home assistant.

On compile le firmware sur ESPHome et upload.

Améliorations

Up du dernier code que j'ai mis en place.
il permet de laisser allumer l'ecran constamment sauf la nuit où il ne se declenche que sur detection de mouvement.

esphome:
  name: salon_gano
  platform: ESP8266
  board: nodemcuv2

wifi:
  ssid: "********"
  password: "********"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Salon Gano Fallback Hotspot"
    password: "**********"

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: "**********"

ota:
  password: "**********"

globals:
 - id: nuit
   type: int
   restore_value: no
   initial_value: '0'

i2c:
  sda: D5
  scl: D3
  scan: True
   
time:
  - platform: homeassistant
    id: esptime
    timezone: CET
    on_time:
      - seconds: 0
        minutes: 0
        hours: 20
        then:
          - globals.set:
              id: nuit
              value: '1'
      - seconds: 0
        minutes: 0
        hours: 7
        then:
          - globals.set:
              id: nuit
              value: '0'

font:
  - file: "monserrat.ttf"
    id: my_font
    size: 58
  - file: "varsity_regular.ttf"
    id: my_font2
    size: 10    

image:
  - file: "temp.png"
    id: temp_image
    resize: 64x64
  - file: "hum.png"
    id: hum_image
    resize: 64x64

sensor:
  - platform: dht
    pin: D7
    model: dht22
    temperature:
      id: temp
      name: "Salon Temperature"
    humidity:
      id: hum
      name: "Salon Humidity"
    update_interval: 30s
  - platform: wifi_signal
    name: "Salon WiFi Signal Sensor"
    update_interval: 60s
  - platform: uptime
    name: Salon Uptime Sensor

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    id: my_display
    address: 0x3C
    pages:
      - id: page1
        lambda: |-
         if (id(nuit) == 1) {
         if (id(mvt).state) {
         it.image(32, 0, id(temp_image));
         }
         }
         else {
         it.image(32, 0, id(temp_image));
         }
      - id: page2
        lambda: |-
         if (id(nuit) == 1) {
         if (id(mvt).state) {
         it.printf(0, 40, my_font,"%.1f", id(temp).state);
         }
         }
         else {
         it.printf(0, 40, my_font,"%.1f", id(temp).state);
         }
      - id: page3
        lambda: |-
         if (id(nuit) == 1) {
         if (id(mvt).state) {
          it.image(32, 0, id(hum_image));
         }
         }
         else {
          it.image(32, 0, id(hum_image));
         }
      - id: page4
        lambda: |-
         if (id(nuit) == 1) {
         if (id(mvt).state) {
          it.printf(0, 40, my_font,"%.1f", id(hum).state);
         }
         }
         else {
          it.printf(0, 40, my_font,"%.1f", id(hum).state);
         }

interval:
  - interval: 5s
    then:
      - display.page.show_next: my_display
      - component.update: my_display

text_sensor:    
  - platform: version
    name: "ESPHome Version"
  - platform: wifi_info
    ip_address:
      name: Salon IP Address    

output:
  - platform: esp8266_pwm
    pin: D2
    id: redgpio
  - platform: esp8266_pwm
    pin: D4
    id: greengpio
  - platform: esp8266_pwm
    pin: D6
    id: bluegpio

binary_sensor:
  - platform: gpio
    pin: D1
    id: mvt
    name: "Salon Motion"
    device_class: motion

light:
  - platform: rgb
    name: "Salon status alarme"
    red: redgpio
    green: greengpio
    blue: bluegpio

    

ainsi que la seconde version avec ecran visible ( trop visible :) ), a noter que cet ecran 2 couleur dispose du jaune sur la premiere bande (17 pixels en Y) et le restee de l'ecran en bleu.

IMG_20200322_152846-2

IMG_20200322_152850-2

IMG_20200322_152856-2

IMG_20200322_152901-2

MultiSensor - entre impression 3D et NodeMCU
Share this