Home / Electronique / Et pourquoi pas un thermostat numérique ? ( Deuxième partie , test de la carte électronique )

Et pourquoi pas un thermostat numérique ? ( Deuxième partie , test de la carte électronique )

La carte électronique de notre thermostat numérique

Voici donc la carte électronique de notre thermostat numérique fabriquée par notre fournisseur de PCB :

 

Thermostat numérique pcb
Thermostat numérique pcb

Le travail du fournisseur est de bonne qualité même sur les plus petites pistes .La finition de ce circuit est étamé ce qui va nous faciliter la soudure des composants .

Il va maintenant faloir l’assembler et la tester pour s’assurer que le fonctionnement est correct et que tous les composants se monte bien en lieu et place .

Logiquement en aillant utilisé les empreintes automatique de Kicad et en aillant vérifié les dimensions de celle ci avant des les utiliser le risque d’erreur concernant les dimensions et les emplacement sont assez limités. Mais on est pas a l’abrit d’une petite erreur de schematisation et surtout d’un oubli !

Les betises concernant le PCB en lui meme chez le fournisseur sont assez rare .Ca ne m’est arrivé qu’une seule fois sur des percages suite a une erreur de convertion des tailles de trous .

Creer la nomenclature

Une nomenclature est un fichier (Excel par exemple ) , regroupant les dénomination de vos composants ( R1,R2 ,… ) et leur valeurs réél (10 k , 47 k, … ) .Vous pouvez y inclure les reférences fournisseur chez qui vous les achetez ainsi que le prix . Ca permet d’évaluer le cout de notre produit , de se rapeller l’emplacement de chaque composants . Si vous avez besoin de faire implanter votre carte chez un fournisseur vous devrez fournir ce fichier .

L’assemblage:

Voici une petite video sur l’assemblage de la carte , vous y verrez notamment la technique pour monter le QFN simplement . Le reste des composants étant à la portée d’un bon bricoleur en ce qui concerne le montage .

 

Voici notre thermostat numérique une fois assemblé :

Thermostat numérique
Thermostat numérique

La bonne nouvelle c’est qu’il fonctionne parfaitement ! Sur le coté vous reconnaissez le capteur de température LM35 . L’ATMEGA en QFN qui malgré ses apparences est plutôt facile a souder . L’encombrement reste quand même assez important a cause de l’alimentation TRACO qui est un peu haute. Mais aucun problème avec ça il nous faudra seulement rehausser l’écran et les allonges pour les boutons poussoirs .

La programmation :

Je vais utiliser code vision pour programmer ce thermostat numérique . Je pourrais utiliser un autre logiciel mais dans un souci de gain de temps je vais utiliser ce logiciel . L’intérêt est que je peux faire le programme en 30 minutes étant donnée qu’il contient les bibliothèques pour l’afficheur LCD et les périphériques comme le convertisseur analogique numérique .

Le programme est chargé de récupérer la valeur du capteur de la convertir et de l’afficher . Il est également chargé de traiter les données utilisateur comme la consigne et de les sauvegarder dans la mémoire afin qu’elle ne se perde pas en cas de perte d’alimentation .

Le programme :

/*******************************************************
This program was created by the CodeWizardAVR V3.27
Automatic Program Generator
� Copyright 1998-2016 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 21/09/2017
Author :
Company :
Comments:

 

Chip type : ATmega324
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*******************************************************/

#include <io.h>

#include <delay.h>

// Bit-Banged I2C Bus functions
#include <i2c.h>

// Alphanumeric LCD functions
#include <alcd.h>

// Declare your global variables here

La déclaration des variables.

int unit=0;
int dis=0;
int cent=0;
int mill=0;

int menu=0;
int val=0;
long time=0;
int temp=0;
int reb_time=0;
int consigne=0;
int set_consigne=0;
long sleep_time=20;
int delta_plus=0;
int delta_moins=0;
int timer=30000;
int timer2=0;
// Pin change 24-31 interrupt service routine

Traitement du clavier par interruption et sauvegarde sur le bus I2C des paramètres utilisateurs lors du changement de menu. 

interrupt [PC_INT3] void pin_change_isr3(void)
{
// Place your code here
if(PORTB.3==0){PORTB.3=1;}
time=0;
if(PORTB.3==1){
if(reb_time==0&&PIND.7==1){menu++;reb_time=150;timer=0;
if(menu==1){
i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x01);
delay_ms(1);
i2c_write(consigne);
i2c_stop();
}
if(menu==2){
i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x02);
delay_ms(1);
i2c_write(delta_plus);
i2c_stop();
}
if(menu==3){
i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x03);
delay_ms(1);
i2c_write(delta_moins);
i2c_stop();
}
if(menu==4){
i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x04);
delay_ms(1);
i2c_write(sleep_time);
i2c_stop();
}
}

if(reb_time==0&&PIND.5==1&&menu==0){consigne++;reb_time=150;set_consigne=consigne;if(consigne>99){consigne=99;}}
if(reb_time==0&&PIND.6==1&&menu==0){consigne–;reb_time=150;set_consigne=consigne;if(consigne<0){consigne=0;}}
if(reb_time==0&&PIND.4==1&&menu==1){consigne=set_consigne;reb_time=150;}

if(reb_time==0&&PIND.5==1&&menu==1){set_consigne++;reb_time=150;consigne=set_consigne;if(set_consigne>99){set_consigne=99;}}
if(reb_time==0&&PIND.6==1&&menu==1){set_consigne–;reb_time=150;consigne=set_consigne;if(set_consigne<1){set_consigne=1;}}

if(reb_time==0&&PIND.5==1&&menu==2){delta_plus++;reb_time=150;if(delta_plus>99){delta_plus=99;}}
if(reb_time==0&&PIND.6==1&&menu==2){delta_plus–;reb_time=150;if(delta_plus<0){delta_plus=0;}}

if(reb_time==0&&PIND.5==1&&menu==3){delta_moins++;reb_time=150;if(delta_moins>99){delta_moins=99;}}
if(reb_time==0&&PIND.6==1&&menu==3){delta_moins–;reb_time=150;if(delta_moins<0){delta_moins=0;}}

if(reb_time==0&&PIND.5==1&&menu==4){sleep_time++;reb_time=150;if(sleep_time>99){sleep_time=99;}}
if(reb_time==0&&PIND.6==1&&menu==4){sleep_time–;reb_time=150;if(sleep_time<0){sleep_time=0;}}

}

}

Gestion de la base de temps pour l’extinction de l’écran .

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x83;//1ms
//TCNT0=0x10; //245us
// Place your code here
if(PIND.4==1&&menu==4){timer2++;}
if(PIND.4==0){timer2=0;}

if(timer2>10000&&menu==4&&PIND.4==1){
//PORTA.6=1;
i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x00);
delay_ms(1);
i2c_write(0x00);
i2c_stop();
delay_ms(10);
i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x01);
delay_ms(1);
i2c_write(0x18);
i2c_stop();
delay_ms(10);
i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x02);
delay_ms(1);
i2c_write(0x01);
i2c_stop();
delay_ms(10);
i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x03);
delay_ms(1);
i2c_write(0x01);
i2c_stop();
delay_ms(10);
i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x04);
delay_ms(1);
i2c_write(0x14);
i2c_stop();
delay_ms(10);
i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x01);
i2c_start();
i2c_write(0xa1);
delay_ms(1);
consigne=i2c_read(0);
i2c_stop();
delay_ms(10);
i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x02);
i2c_start();
i2c_write(0xa1);
delay_ms(1);
delta_plus=i2c_read(0);
i2c_stop();
delay_ms(10);
i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x03);
i2c_start();
i2c_write(0xa1);
delay_ms(1);
delta_moins=i2c_read(0);
i2c_stop();
delay_ms(10);
i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x04);
i2c_start();
i2c_write(0xa1);
delay_ms(1);
sleep_time=i2c_read(0);
i2c_stop();
timer2=0;
menu=0;
}

 

timer++;
if(timer>30000){menu=0;}
if(timer>32000){timer=32000;menu=0;}
time++;
reb_time–;
if(reb_time<0){reb_time=0;}
if(time>(sleep_time*1000)){PORTB.3=0;}
//if(time>5){PORTB.3=0;}

//if(time<5){PORTB.3=1;}
//if(time>10){time=0;}
}

Configuration de l’ADC

// Voltage Reference: AREF pin
#define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR))

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | ADC_VREF_TYPE;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
// Wait for the AD conversion to complete
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
return ADCW;
}

void main(void)
{
// Declare your local variables here

Configuration de l’horloge principale.

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

Configuration des PORTS en entrée ou en sortie.

// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

// Port B initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 1 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x83;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=(0<<EXCLK) | (0<<AS2);
TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20);
TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);

// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1);

// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2);

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-15: Off
// Interrupt on any change on pins PCINT16-23: Off
// Interrupt on any change on pins PCINT24-31: On
EICRA=(0<<ISC21) | (0<<ISC20) | (0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
EIMSK=(0<<INT2) | (0<<INT1) | (0<<INT0);
PCMSK3=(1<<PCINT31) | (1<<PCINT30) | (1<<PCINT29) | (1<<PCINT28) | (0<<PCINT27) | (0<<PCINT26) | (0<<PCINT25) | (0<<PCINT24);
PCICR=(1<<PCIE3) | (0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
PCIFR=(1<<PCIF3) | (0<<PCIF2) | (0<<PCIF1) | (0<<PCIF0);

// USART0 initialization
// USART0 disabled
UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);

// USART1 initialization
// USART1 disabled
UCSR1B=(0<<RXCIE1) | (0<<TXCIE1) | (0<<UDRIE1) | (0<<RXEN1) | (0<<TXEN1) | (0<<UCSZ12) | (0<<RXB81) | (0<<TXB81);

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator’s positive input is
// connected to the AIN0 pin
// The Analog Comparator’s negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR1=(0<<AIN0D) | (0<<AIN1D);

// ADC initialization
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: ADC Stopped
// Digital input buffers on ADC0: Off, ADC1: On, ADC2: On, ADC3: On
// ADC4: On, ADC5: On, ADC6: On, ADC7: On
DIDR0=(0<<ADC7D) | (0<<ADC6D) | (0<<ADC5D) | (0<<ADC4D) | (0<<ADC3D) | (0<<ADC2D) | (0<<ADC1D) | (1<<ADC0D);
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);

// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

Configuration du BUS I2C.

// Bit-Banged I2C Bus initialization
// I2C Port: PORTC
// I2C SDA bit: 1
// I2C SCL bit: 0
// Bit Rate: 100 kHz
// Note: I2C settings are specified in the
// Project|Configure|C Compiler|Libraries|I2C menu.
i2c_init();

Configuration de l’écran.

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS – PORTB Bit 0
// RD – PORTB Bit 1
// EN – PORTB Bit 2
// D4 – PORTB Bit 4
// D5 – PORTB Bit 5
// D6 – PORTB Bit 6
// D7 – PORTB Bit 7
// Characters/line: 8
lcd_init(8);

Ecriture de la page de présentation et chargement des données sur le bus I2C.

// Globally enable interrupts
#asm(“sei”)
lcd_gotoxy(0,0);
lcd_putsf(“Tempi V1”);

i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x01);
i2c_start();
i2c_write(0xa1);
delay_ms(1);
consigne=i2c_read(0);
i2c_stop();

i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x02);
i2c_start();
i2c_write(0xa1);
delay_ms(1);
delta_plus=i2c_read(0);
i2c_stop();

i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x03);
i2c_start();
i2c_write(0xa1);
delay_ms(1);
delta_moins=i2c_read(0);
i2c_stop();

i2c_init();
i2c_start();
i2c_write(0xa0);
delay_ms(1);
i2c_write(0x04);
i2c_start();
i2c_write(0xa1);
delay_ms(1);
sleep_time=i2c_read(0);
i2c_stop();

 

lcd_gotoxy(0,1);
lcd_putsf(” C 2017 “);
PORTB.3=1;
delay_ms( 1000 );

Boucle principale.

while (1)
{
// Place your code here
//PORTA.6=1;
if(menu==0){
lcd_gotoxy(0,0);
lcd_putsf(” “);

val=read_adc(0);
temp=(val*10/17);
unit=(temp%10);
dis=(temp/10)%10;
cent=(temp/100)%10;
mill=(temp/1000)%10;

// lcd_putchar(mill+48);
lcd_putchar(cent+48);
lcd_putchar(dis+48);
lcd_putsf(“,”);
lcd_putchar(unit+48);
lcd_putsf(” C “);

unit=(consigne%10);
dis=(consigne/10)%10;

lcd_gotoxy(0,1);
lcd_putsf(” “);
lcd_putchar(dis+48);
lcd_putchar(unit+48);
lcd_putsf(” C “);
}

if(menu==1){
lcd_gotoxy(0,0);
lcd_putsf(“Consigne”);
unit=(consigne%10);
dis=(consigne/10)%10;

lcd_gotoxy(0,1);
lcd_putsf(” “);
lcd_putchar(dis+48);
lcd_putchar(unit+48);
lcd_putsf(” “);
}

if(menu==2){
lcd_gotoxy(0,0);
lcd_putsf(“delta + “);
unit=(delta_plus%10);
dis=(delta_plus/10)%10;

lcd_gotoxy(0,1);
lcd_putsf(” “);
lcd_putchar(dis+48);
lcd_putchar(unit+48);
lcd_putsf(” “);
}

if(menu==3){
lcd_gotoxy(0,0);
lcd_putsf(“delta – “);
unit=(delta_moins%10);
dis=(delta_moins/10)%10;

lcd_gotoxy(0,1);
lcd_putsf(” “);
lcd_putchar(dis+48);
lcd_putchar(unit+48);
lcd_putsf(” “);

}

if(menu==4){
lcd_gotoxy(0,0);
lcd_putsf(” sleep “);
unit=(sleep_time%10);
dis=(sleep_time/10)%10;

lcd_gotoxy(0,1);
lcd_putsf(” “);
lcd_putchar(dis+48);
lcd_putchar(unit+48);
lcd_putsf(” “);
}
if(menu>4){menu=0;}
if((temp/10)>consigne+delta_plus&&PORTA.6==0){PORTA.6=1;}
if((temp/10)<consigne-delta_moins&&PORTA.6==1){PORTA.6=0;}
}
}

Voici le résultat de notre petit programme sur l’affichage :

La page du menu 0 de notre thermostat numérique avec sa température de consigne et la température mesuré.

 

La consigne de température que vous pouvez également régler sur la page d’accueil.

Le delta plus et le delta moins qui permet de modifier la valeur a laquelle la sortie se coupe et se rallumer autour de la consigne .

Le temps que met l’écran a s’éteindre si il n’y a pas de mouvement sur le clavier .

Voila pour un premier petit  programme . A défaut d’être parfait il permet de tester le fonctionnement de notre thermostat numérique.On peut voir que notre électronique fonctionne parfaitement .Il nous restera a faire une boite et a améliorer le programme qui n’est qu’un prototype .

Merci pour votre lecture !

N’hesitez pas a commenter et a poser vos questions !

Sylvain

 

Laisser un commentaire

Top