From 48dbd0c5932d955e645b0d2ea72464a501a0d445 Mon Sep 17 00:00:00 2001 From: Pierrick C Date: Sun, 18 Nov 2018 10:28:07 +0100 Subject: [PATCH] Rotary encoder --- code/boot.py | 4 +- code/encoder.py | 4 +- code/main.py | 131 ++++++++++++++++++++++++++++++++++++------------ 3 files changed, 104 insertions(+), 35 deletions(-) diff --git a/code/boot.py b/code/boot.py index 6abce89..aed995d 100644 --- a/code/boot.py +++ b/code/boot.py @@ -2,6 +2,6 @@ #import esp #esp.osdebug(None) import gc -#import webrepl -#webrepl.start() +import webrepl +webrepl.start() gc.collect() diff --git a/code/encoder.py b/code/encoder.py index d42ca3c..88164cc 100644 --- a/code/encoder.py +++ b/code/encoder.py @@ -92,8 +92,8 @@ class Encoder(object): def value(self): return self._value // self.clicks - def reset(self): - self._value = 0 + def reset(self, val=0): + self._value = val def test(enc=None, **kwargs): diff --git a/code/main.py b/code/main.py index 462fecd..9cc82f9 100644 --- a/code/main.py +++ b/code/main.py @@ -13,51 +13,120 @@ """ Eclairage à LED Neopixel +avec contrôle (encodeur rotatif) """ __author__ = "arofarn" -__version__ = 0.1 +__version__ = 0.2 + +# Imports import time import machine import neopixel +from uos import uname +from encoder import Encoder -NB_PIX = 8 # Nombre de pixel -LUMINOSITE = 1.0 # Luminosité (0.0-1.0) -NEOPIX_PIN = 2 # N° de la broche de contrôle des néopixels +#Paramètres -pixel_strip = neopixel.NeoPixel(machine.Pin(NEOPIX_PIN), NB_PIX) +NB_PIX = 8 # Nombre de pixels +MAX_LUM = 100 # Luminosité max (100 max.) +COULEUR = [255, 255, 255] # Couleur de base (à luminosité max) + +#Déclaration des objets et initialisation des variables + +board_type = uname()[0] +print("Système :", board_type) + +# Neopixels + +if board_type == 'esp8266': + NEOPIX_PIN = 2 + # Les deux broches suivantes doivent être capable d'interruption !!! + # sur ESP8266 => : 4, 5, 12, 13 et 14 + ENC_PIN_A = 13 # N° de la 1ere broche de l'encodeur + ENC_PIN_B = 12 # N° de la 2e broche de l'encodeur + ENC_BOUTON = 14 # broche du clic central de l'encodeur + + # With ESP8266 (no timing parameter) + pixel_strip = neopixel.NeoPixel(machine.Pin(NEOPIX_PIN), NB_PIX) + +elif board_type == 'esp32': + NEOPIX_PIN = 14 + # Pins + ENC_PIN_A = 15 # N° de la 1ere broche de l'encodeur + ENC_PIN_B = 33 # N° de la 2e broche de l'encodeur + ENC_BOUTON = 27 # broche du clic central de l'encodeur + + # # Only with ESP32 : add timing param. + # # timing param =0 for "old" 400kHz neopixel (default) + # # =1 for "new" 800kHz neopixel + pixel_strip = neopixel.NeoPixel(machine.Pin(NEOPIX_PIN), NB_PIX, timing=1) + +else: + # ce code n'est pas prévu pour d'autre carte pour l'instant + print("Carte non-supportée") + quit() + +# # Only with ESP32 : add timing param. +# # timing param =0 for "old" 400kHz neopixel (default) +# # =1 for "new" 800kHz neopixel +# pixel_strip = neopixel.NeoPixel(machine.Pin(NEOPIX_PIN), NB_PIX, timing=1) +# coul_tmp = [0, 0, 0] #Eteint tout à l'initialisation -pixel_strip.fill((0, 0, 0)) +pixel_strip.fill([0, 0, 0]) pixel_strip.write() +# Encodeur rotatif +enc = Encoder(ENC_PIN_B, ENC_PIN_A, + min_val=0, max_val=MAX_LUM, + clicks=1) + +#Bouton +bout = machine.Pin(ENC_BOUTON, machine.Pin.IN) + +#Variable d'état +LUM = 0 # Luminosité (0 - 100) +PWR = False # Est-ce que l'éclairage est allumé ? +BOUT_PRESS_STATE = 1 + +def update_neopixel(np_strp, coul, lum=50): + """Update NeoPixel strip with one color + :param np_strp : NeoPixel object + :param coul : color [R, G, B] + :param lum : brightness 0-100 (default: 50) + """ + col_tmp = [0, 0, 0] + + for i in range(3): + col_tmp[i] = int(coul[i] * lum / 100) + + pixel_strip.fill(col_tmp) + pixel_strip.write() + while True: - for i in range(NB_PIX): - print("blanc") - pixel_strip[i] = (255, 255, 255) - pixel_strip.write() - time.sleep(0.5) - for i in range(NB_PIX): - print("éteint") - pixel_strip[i] = (0, 0, 0) - pixel_strip.write() - time.sleep(0.5) + # Si on a un changement de valeur, on met à jour la luminisité et l'éclairage + # des NeoPixel + if PWR and LUM != enc.value: + print(enc.value) + LUM = enc.value + update_neopixel(pixel_strip, COULEUR, LUM) - for i in range(NB_PIX): - print("rouge") - pixel_strip[i] = (255, 0, 0) - pixel_strip.write() - time.sleep(0.5) + # Quand le bouton central est appuyé puis relâché, on allume ou on éteint + if bout.value() == 0 and BOUT_PRESS_STATE == 1: + PWR = not PWR + print("Power :", PWR) + if not PWR: + # Extinction des LED + pixel_strip.fill((0, 0, 0)) + pixel_strip.write() + else: + # On remet l'encodeur à la dernière luminosité connue + # pour ignorer les mouvements pendant l'extinction + enc.reset(LUM) + update_neopixel(pixel_strip, COULEUR, LUM) - for i in range(NB_PIX): - print("vert") - pixel_strip[i] = (0, 255, 0) - pixel_strip.write() - time.sleep(0.5) + BOUT_PRESS_STATE = bout.value() - for i in range(NB_PIX): - print("bleu") - pixel_strip[i] = (0, 0, 255) - pixel_strip.write() - time.sleep(0.5) + time.sleep_ms(20)