from machine import ADC, I2C, Pin
from pico_i2c_lcd import I2cLcd
import carro
import time
import math
time.sleep(0.1)
carro1 = carro.Carro()
carro2 = carro.Carro()
carro3 = carro.Carro()
carrosConectados = 3
fotoresistor = ADC(28)
potenciometro = ADC(27)
ledVerde = machine.Pin(1, machine.Pin.OUT)
ledAmarela = machine.Pin(5, machine.Pin.OUT)
ledVermelha = machine.Pin(9, machine.Pin.OUT)
info = I2C(1, sda=Pin(26), scl=Pin(27), freq=400000)
status = I2C(0, sda=Pin(20), scl=Pin(21), freq=400000)
lcdInfo = I2cLcd(info, 0x27, 2, 16)
lcdSaidaRecarga = I2cLcd(info, 0x26, 2, 16)
lcdStatus = I2cLcd(status, 0x27, 2, 16)
lcdBateria = I2cLcd(status, 0x26, 2, 16)
consumo = 0
limiteBateria = 50000
energiaArmazenada = 0
porcentagemBateria = 0
bloqueado = False
def CalcularVoltagem(lux):
maximo = 5000
maximoFoto = 65007
resultadoVoltagem = ((lux * maximo) / (maximoFoto)) * -1 + 5039.380376
return resultadoVoltagem
def VerificarCarregamento(potencia):
global bloqueado
if porcentagemBateria >= 30 and not bloqueado:
ledVerde.high()
ledAmarela.low()
ledVermelha.low()
return "Recarga Autorizada"
elif porcentagemBateria > 1 and not bloqueado:
ledVerde.low()
ledAmarela.high()
ledVermelha.low()
return "Recarga Reduzida"
else:
ledVerde.low()
ledAmarela.low()
ledVermelha.high()
return "Recarga Bloqueada"
def Bateria(energiaDisponivel):
global energiaArmazenada
global porcentagemBateria
energiaArmazenada = energiaArmazenada + energiaDisponivel
if energiaArmazenada > limiteBateria:
energiaArmazenada = limiteBateria
if energiaArmazenada < 0:
energiaArmazenada = 0
porcentagemBateria = (energiaArmazenada / limiteBateria) * 100
lcdBateria.clear()
lcdBateria.move_to(0, 0)
lcdBateria.putstr(f"Bateria: {math.trunc(porcentagemBateria)}%")
visualizadorBateria = "-["
visualizadorBateria += "*" * int((porcentagemBateria // 10))
visualizadorBateria += "]"
lcdBateria.move_to(0, 1)
lcdBateria.putstr(visualizadorBateria)
def Recarga():
global porcentagemBateria
global bloqueado
saidaRecarga = math.trunc((potenciometro.read_u16() * 6500) / 65535)
saidaRecargaAtual = 0
if (porcentagemBateria >= 30):
saidaRecargaAtual = saidaRecarga
elif (porcentagemBateria > 1):
saidaRecargaAtual = math.trunc((saidaRecarga * porcentagemBateria) / 30)
else:
bloqueado = True
if (bloqueado and porcentagemBateria != 100):
saidaRecargaAtual = 0
else:
bloqueado = False
lcdSaidaRecarga.clear()
lcdSaidaRecarga.move_to(0, 0)
lcdSaidaRecarga.putstr(f"Potencia: {saidaRecarga}W")
lcdSaidaRecarga.move_to(0, 1)
lcdSaidaRecarga.putstr(f"Saida: {saidaRecargaAtual}W")
return saidaRecargaAtual
def Conectar():
if (carro1.porcentagemBateria == 100):
carro1.CriarNovo()
if (carro2.porcentagemBateria == 100):
carro2.CriarNovo()
if (carro3.porcentagemBateria == 100):
carro3.CriarNovo()
while True:
geracao = fotoresistor.read_u16()
potencia = math.trunc(CalcularVoltagem(geracao))
disponivel = potencia - Recarga()
Bateria(disponivel)
carro1.Carregar(Recarga() / carrosConectados)
carro2.Carregar(Recarga() / carrosConectados)
carro3.Carregar(Recarga() / carrosConectados)
infoMarca = f"Marca: {carro1.marca:12} | {carro2.marca:12} | {carro3.marca:12}"
infoPlaca = f"Placa: {carro1.placa:12} | {carro2.placa:12} | {carro3.placa:12}"
infoPorcentagemBateria = f"Bateria: {carro1.porcentagemBateria:11}% | {carro2.porcentagemBateria:11}% | {carro3.porcentagemBateria:11}%"
print(infoMarca)
print(infoPlaca)
print(infoPorcentagemBateria)
Conectar()
lcdInfo.clear()
lcdInfo.move_to(0, 0)
lcdInfo.putstr(f"Geracao: {potencia}W")
lcdInfo.move_to(0, 1)
lcdInfo.putstr(f"Consumo: {consumo}W")
statusCarregamento = VerificarCarregamento(disponivel)
print("--------------------------------------------------------------------------------")
print(f"Porcentagem da Bateria: {math.trunc(porcentagemBateria)}% / Decimal: {math.trunc(porcentagemBateria)} / Binário: {bin(math.trunc(porcentagemBateria))[2:]} / Hexadecimal: {hex(math.trunc(porcentagemBateria))[2:]}")
print("--------------------------------------------------------------------------------")
lcdStatus.clear()
lcdStatus.move_to(0, 0)
lcdStatus.putstr(f"Disponivel:{disponivel}W")
lcdStatus.move_to(0, 1)
lcdStatus.putstr(f"Stats:{statusCarregamento[8:]}")
time.sleep(0.25)