import machine
import utime
import time
from machine import Pin, I2C
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
#initialisation des pins
value1 = machine.ADC(28)
value2 = machine.ADC(27)
BP1 = Pin(0,Pin.IN)
BP2 = Pin(4,Pin.IN)
#initialisation des variables
E = 0 #energie totale
Emin0 = 0 #energie de minute en cours de calcule
Emin = 0 #energie de la minute precedente
Eheure0 = 0 #energie de l'heure en cours de calcule
Eheure = 0 #energie de l'heure precedente
Ejour0 = 0 #energie du jour en cours de calcule
Ejour = 0 #energie du jour precedent
s = 0 #pour compter les seconds
m = 0 #pour compter les minutes
h = 0 #pour compter les heures
aff1 = 0 #s'incremente si BP1 est poussé
aff2 = 0 #s'incremente si BP2 est poussé
#initialisation de l'afficheur LCD
I2C_ADDR = 0x27
I2C_NUM_ROWS = 2
I2C_NUM_COLS = 16
i2c = I2C(0, sda=machine.Pin(20), scl=machine.Pin(17), freq=400000)
lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)
#declaration des fonctions
def inc_aff1(aff) :
#sert a incrementer aff1 si BP1 est poussé
if BP1.value() == 1 :
if aff == 2 :
aff = 0
else :
aff += 1
return aff
def inc_aff2(aff) :
#sert a incrementer aff2 si BP2 est poussé
if BP2.value() == 1 :
if aff == 3 :
aff = 0
else :
aff += 1
return aff
def afficher1(info,grandeur,unite) :
#sert a afficher la puissance, le voltage ou le courant
grandeur_formate = "{:.2f}".format(grandeur)
lcd.move_to(0,0)
lcd.putstr(info + grandeur_formate + unite)
#les lignes suivantes sont pour effacer le rest de la ligne de LCD
while lcd.cursor_x != 0 :
lcd.putchar (" ")
def afficher2(info,energie) :
#sert a afficher E, Emin, Eheure ou Ejour
if energie < 1000 :
unite = "mWh"
elif energie < 1000000 :
energie = energie/1000
unite = "Wh"
else :
energie = energie/1000000
unite = "kWh"
energie_formatee = "{:.2f}".format(energie)
lcd.move_to(0,1)
lcd.putstr(info + energie_formatee + unite)
#les lignes suivantes sont pour effacer le rest de la ligne de LCD
while lcd.cursor_x != 0 :
lcd.putchar (" ")
while True:
#lecture de tension et courant
V = (value1.read_u16() * 25) / 65535
I = (value2.read_u16() * 16) / 65535
#calcul de puissance
P = V * I
utime.sleep(0)
E += P/3.6
Emin0 += P/3.6
s = s + 1
if s == 60 :
Emin = Emin0
Eheure0 += Emin
Emin0 = 0
m = m + 1
s = 0
if m == 60 :
Eheure = Eheure0
Ejour0 += Eheure
Eheure0 = 0
m = 0
h = h + 1
if h == 24 :
Ejour = Ejour0
Ejour0 = 0
h = 0
aff1 = inc_aff1(aff1) #incrementer aff1 si BP1 est poussé
aff2 = inc_aff2(aff2) #incrementer aff2 si BP2 est poussé
#afficher la puissance, le voltage ou le courant selon la valeur de aff1
if aff1 == 1 :
afficher1("V : ",V,"V")
elif aff1 == 2 :
afficher1("I : ",I,"A")
else :
afficher1("P : ",P,"W")
#afficher E, Emin, Eheure ou Ejour selon la valeur de aff2
if aff2 == 1 :
afficher2("Emin: ",Emin)
elif aff2 == 2 :
afficher2("Eh : ",Eheure)
elif aff2 == 3 :
afficher2("Ej : ",Ejour)
else :
afficher2("E : ",E)