Un clavier de commandes pour MYS
Publié : 23 juil. 2018, 09:59
Bonjour à vous, j’étais à la recherche d’un clavier de commandes permettant d’envoyer des ordres à DZ sans être obligé de se connecter sur la page http de DZ (Par exemple on tape ‘23’ et le volet de la chambre se ferme) et de recevoir des notifications (Il répond à la commande précédente). J’ai trouvé le TM1638, c’est un clavier de commandes avec écran tout simple.
Avantages :
-Peu cher (2€ chez Al****) https://fr.aliexpress.com/item/TM1638-L ... autifyAB=0
-Il possède un affichage 8 digits en 7 segments et en même temps un clavier de 16 touches.
-Il ne prend que 3 entrées sur l’arduino.
-L’affichage est lumineux.
Inconvénients
-Il possède un affichage 8 digits en 7 segments
-Il n’est pas très moderne…
Quelques photos : Note : Le fichier 3D du boitier TM1638 se trouve sur thingiverse.
Concernant la mise en place je l’ai intégré à mon node d’arrosage automatique MYS car il est bien placé dans la maison.
Pour le montage rien de plus simple :
Alim 5 ou 3.3V et gnd
Pin strobe sur 19, Pin clock sur 18, Pin data sur 8 (up2u)
Le sketch sur un arduino nano (il marchera sur pro)
Note : J’utilise Atom+platform io pour programmer les arduinos c’est bien mieux que l’ide original (pour la librairie du TM1638, il faut rechercher et installer ‘TM1638’ par Ricardo Batista)
Coté DZ :
Quand DZ reçoit une commande, voici une partie du code (evenement device en LUA)
La fonction TMDisplay affiche une notification vers le TM1638 (‘InfoRecu’ est le nom du device)
Voila, ça marche très bien pour le moment.
Avantages :
-Peu cher (2€ chez Al****) https://fr.aliexpress.com/item/TM1638-L ... autifyAB=0
-Il possède un affichage 8 digits en 7 segments et en même temps un clavier de 16 touches.
-Il ne prend que 3 entrées sur l’arduino.
-L’affichage est lumineux.
Inconvénients
-Il possède un affichage 8 digits en 7 segments
-Il n’est pas très moderne…
Quelques photos : Note : Le fichier 3D du boitier TM1638 se trouve sur thingiverse.
Concernant la mise en place je l’ai intégré à mon node d’arrosage automatique MYS car il est bien placé dans la maison.
Pour le montage rien de plus simple :
Alim 5 ou 3.3V et gnd
Pin strobe sur 19, Pin clock sur 18, Pin data sur 8 (up2u)
Le sketch sur un arduino nano (il marchera sur pro)
Note : J’utilise Atom+platform io pour programmer les arduinos c’est bien mieux que l’ide original (pour la librairie du TM1638, il faut rechercher et installer ‘TM1638’ par Ricardo Batista)
Code : Tout sélectionner
#include <Arduino.h>
// Enable debug prints to serial monitor
#define MY_DEBUG
// Enable and select radio type attached
#define MY_RADIO_NRF24
#include <SPI.h>
#include <MySensors.h>
#include <TM1638.h>
#include <TM1638QYF.h>
#define PIN_ANALOG_PLANT_0 0
#define PIN_ANALOG_PLANT_1 1
#define PIN_ANALOG_PLANT_2 2
#define PIN_ANALOG_PLANT_3 3
#define PIN_IRRIGATION_0 3 // relay plante 0
#define PIN_IRRIGATION_1 4 // relay plante 0
#define PIN_IRRIGATION_2 5 // relay plante 0
#define PIN_IRRIGATION_3 6 // relay plante 0
#define PINTMstr 19
#define PINTMclk 18
#define PINTMdata 8 //analogpin A4 devient DIO14
#define RELAY_ON LOW // GPIO value to write to turn on attached relay
#define RELAY_OFF HIGH // GPIO value to write to turn off attached relay
#define PIN_MESURE 2 // pin qui alimente les capteurs d'humidité
#define SLEEP_TIME 14400000 // 4h entre 2 mesures d'humidité
#define WATERING_DELAY 10000 // duree de l'arrosage en ms
#define EXITDELAY 60000 //durée d'arret de l'affichage
#define CHILD_ID_HUM0 0
#define CHILD_ID_HUM1 1
#define CHILD_ID_HUM2 2
#define CHILD_ID_HUM3 3
#define CHILD_ID_SWITCH_IRRIGATE0 4
#define CHILD_ID_SWITCH_IRRIGATE1 5
#define CHILD_ID_SWITCH_IRRIGATE2 6
#define CHILD_ID_SWITCH_IRRIGATE3 7
#define CHILD_ID_ASK_HUM 8
#define CHILD_ID_TXT 9
#define CHILD_ID_TXT_RECEIVE 10
//tableau correspndance child id et pin numérotation commence par zero
int corresp[8]={3,3,3,3,PIN_IRRIGATION_0,PIN_IRRIGATION_1,PIN_IRRIGATION_2,PIN_IRRIGATION_3};
float Hum0, Old_Hum0;
float Hum1, Old_Hum1;
float Hum2, Old_Hum2;
float Hum3, Old_Hum3;
boolean first_time=HIGH;
double lastSend=millis();
char message[8];
//instance TM1638
// define a module on data pin 8, clock pin 9 and strobe pin 7
TM1638QYF module(PINTMdata, PINTMclk, PINTMstr);
char keyMap[16]={'1','2','3','A','4','5','6','B','7','8','9','C','*','0','#','D'};
word keyValue[16]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
String keyMsg="0123456789*#";
String messageRecu;
//MyMsg
MyMessage msgHum0(CHILD_ID_HUM0, V_HUM);
MyMessage msgHum1(CHILD_ID_HUM1, V_HUM);
MyMessage msgHum2(CHILD_ID_HUM2, V_HUM);
MyMessage msgHum3(CHILD_ID_HUM3, V_HUM);
MyMessage msgTXT(CHILD_ID_TXT,V_TEXT);
char getcharOfk(word x) {
char resultat='Z';
for(int i=0;i<16;i++) {
if(x==keyValue[i]) {
resultat=keyMap[i];
break;
}
}
return resultat;
}
void infoDisplay(String text,boolean mode) {
module.setDisplayToString(text);
delay(1000);
if(mode) module.clearDisplay();
}
void waitZero() {
word k;
while(true) {
k=module.getButtons();
if(k==0) break;
}
delay(250);
}
String getMsg(char firstKey) {
unsigned long startTime=millis();
String currentTxt=String(firstKey);
String lastCurrentTxt;
module.clearDisplay();
module.setDisplayToString(currentTxt);
waitZero();
char key='Z';
while(true) {
word k=module.getButtons();
key=getcharOfk(k);
if(k!=0) {
//Serial.println("current="+currentTxt);
if(keyMsg.indexOf(key)!=-1 && currentTxt.length()<8) {
currentTxt+=key;
module.clearDisplay();
module.setDisplayToString(currentTxt);
waitZero();
}
if(key=='D' && currentTxt.length()>0) {
//oldKey=key;
int l=currentTxt.length();
lastCurrentTxt = currentTxt.substring(0,l-1);
currentTxt=lastCurrentTxt;
waitZero();
module.clearDisplay();
module.setDisplayToString(currentTxt);
}
if(key=='B') {
infoDisplay("cancel",true);
currentTxt="";
break;
}
if(key=='C') {
if(currentTxt.equals("")) {
infoDisplay("no send",true);
infoDisplay(currentTxt,false);
} else {
infoDisplay("send...",true);
break;
}
}
if(millis()-startTime>EXITDELAY) {
currentTxt="";
infoDisplay("cancel",true);
break;
}
}
}
return currentTxt;
}
void before() {
// on coupe les relays et la mesure de l'hum
module.setDisplayToString("before");
pinMode(PIN_IRRIGATION_0, OUTPUT);
digitalWrite(PIN_IRRIGATION_0,RELAY_OFF);
pinMode(PIN_IRRIGATION_1, OUTPUT);
digitalWrite(PIN_IRRIGATION_1,RELAY_OFF);
pinMode(PIN_IRRIGATION_2, OUTPUT);
digitalWrite(PIN_IRRIGATION_2,RELAY_OFF);
pinMode(PIN_IRRIGATION_3, OUTPUT);
digitalWrite(PIN_IRRIGATION_3,RELAY_OFF);
pinMode(PIN_MESURE,OUTPUT);
digitalWrite(PIN_MESURE,RELAY_OFF);
}
void presentation()
{
// Send the sketch version information to the gateway and Controller
module.setDisplayToString("present");
sendSketchInfo("Plante", "3.0");
present(CHILD_ID_HUM0, S_HUM);
present(CHILD_ID_HUM1, S_HUM);
present(CHILD_ID_HUM2, S_HUM);
present(CHILD_ID_HUM3, S_HUM);
present(CHILD_ID_SWITCH_IRRIGATE0, S_LIGHT);
present(CHILD_ID_SWITCH_IRRIGATE1, S_LIGHT);
present(CHILD_ID_SWITCH_IRRIGATE2, S_LIGHT);
present(CHILD_ID_SWITCH_IRRIGATE3, S_LIGHT);
present(CHILD_ID_ASK_HUM, S_LIGHT);
present(CHILD_ID_TXT,S_INFO,"telecommande plante");
present(CHILD_ID_TXT_RECEIVE,S_INFO,"info recu");
}
void check_hum(void)
{
module.clearDisplay();
module.setDisplayToString("emission");
digitalWrite(PIN_MESURE,HIGH);
delay(5000);
Hum0 = analogRead(PIN_ANALOG_PLANT_0);
Hum0 = map(Hum0,0,1023,0,100);
Hum1 = analogRead(PIN_ANALOG_PLANT_1);
Hum1 = map(Hum1,0,1023,0,100);
Hum2 = analogRead(PIN_ANALOG_PLANT_2);
Hum2 = map(Hum2,0,1023,0,100);
Hum3 = analogRead(PIN_ANALOG_PLANT_3);
Hum3 = map(Hum3,0,1023,0,100);
delay(1000);
Serial.println("Mesures de HUM .... ok");
digitalWrite(PIN_MESURE,LOW);
//Serial.println(Hum);
if ((Hum0 != Old_Hum0) || first_time)
{send(msgHum0.set(Hum0, 1));Old_Hum0 = Hum0; delay(150);}
if ((Hum1 != Old_Hum1) || first_time)
{send(msgHum1.set(Hum1, 1)); Old_Hum1 = Hum1;delay(150); }
if ((Hum2 != Old_Hum2) || first_time)
{send(msgHum2.set(Hum2, 1));Old_Hum2 = Hum2; delay(150); }
if ((Hum3 != Old_Hum3)|| first_time)
{send(msgHum3.set(Hum3, 1));Old_Hum3 = Hum3;delay(150); }
module.clearDisplay();
}
void Arrosage(int k, int child_plante)
{
infoDisplay("Arrosage",false);
Serial.print("chil appelé "+child_plante);
Serial.print("command appelé "+k);
if (k==int(RELAY_ON))
{
digitalWrite(corresp[child_plante], RELAY_ON);
delay(WATERING_DELAY);
digitalWrite(corresp[child_plante],RELAY_OFF);
Serial.println("commande effectuee");
}
else
{
digitalWrite(corresp[child_plante], RELAY_OFF);
}
infoDisplay("fin",true);
}
void receive(const MyMessage &message)
{
// We only expect one type of message from controller. But we better check anyway.
if (message.type==V_LIGHT) {
Serial.println("recu="+message.sensor);
if (message.sensor<8) Arrosage(message.getBool()?RELAY_ON:RELAY_OFF, message.sensor);
if (message.sensor==8 && message.getBool()) check_hum();
}
if(message.type==V_TEXT && message.sensor==10) {
messageRecu=message.getString();
Serial.println("msg recu="+messageRecu);
infoDisplay(messageRecu, true);
}
}
void setup() {
module.setDisplayToString("start");
delay(1000);
module.clearDisplay();
}
void loop() {
unsigned long now = millis();
bool sendTime = now - lastSend > SLEEP_TIME;
if (sendTime || first_time) {
check_hum(); //mesure les humidités
first_time=LOW;
lastSend=now;
}
word k=module.getButtons();
char key=(k!=0)?getcharOfk(k):'Z';
//Serial.println(key);
if(keyMsg.indexOf(key)!=-1) {
String msg=getMsg(key);
msg.toCharArray(message, 8);
if (!msg.equals("")) {
send(msgTXT.set(message));
}
}
}
Coté DZ :
Quand DZ reçoit une commande, voici une partie du code (evenement device en LUA)
Code : Tout sélectionner
--Gestion telecommande IR Bureau1 et TM1638 plante
local getMsg=(devicechanged['Bureau1_Telecommande'] or devicechanged['Plante_Telecommande'])
if getMsg then
local codeIR=devicechanged['Bureau1_Telecommande'] and otherdevices_svalues['Bureau1_Telecommande'] or otherdevices_svalues['Plante_Telecommande']
print('Code IR='..codeIR)
if(codeIR=='00') then
execOnChange('Imprimante_Brother','Off',5)
TMDisplay("Bro.Off")
end
if (codeIR=='01') then
execOnChange('Imprimante_Brother','On',5)
TMDisplay("Bro.On")
end
if (codeIR=='10') then
execOnChange('Wifi_bureau','Off',5)
TMDisplay("Wifi.Off")
End
Code : Tout sélectionner
function TMDisplay(TMMessage)
commandArray[1] = { ['UpdateDevice'] = otherdevices_idx['InfoRecu']..'|0|'..TMMessage}
end