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