from machine import Pin, ADC, RTC
from time import sleep_ms, localtime
'''
Cria um objeto para conversão A-D conectado ao pino 33
A conexão é feita através de um atenuador, a escolher:
ADC.ATTN_0DB: sem atenuação (tensão entre 0V e 1V)
ADC.ATTN_2_5DB: atenuação de 2.5dB (tensão entre 0V e 1.5V)
ADC.ATTN_6DB: atenuação de 6dB (tensão entre 0V e 2.25V)
ADC.ATTN_11DB: atenuação de 11dB (tensão entre 0V e 3.3V)
'''
sensor = ADC(Pin(33), atten=ADC.ATTN_11DB)
'''
Um botão está conectado ao pino 22 e ao GND
Quando apertado, o pino 22 está no estado baixo (0V)
Quando solto, o pino 22 está no estado alto (3v3)
'''
bot = Pin(22, Pin.IN, Pin.PULL_UP)
'''
Cria um objeto que dá acesso ao relógio de tempo real (RTC)
Com o método datetime(), é possível acertar o relógio
datetime pede uma tupla com 8 parâmetros
'''
rtc = RTC()
rtc.datetime( (2026, 5, 26, 1, 20, 40, 25, 0) )
def tensaoADC(x):
'''
Determina a tensão no pino conectado a um ADC, a partir do valor obtido por ele
Considera um ADC de 16 bits (padrão do método read_u16())
Considera a faixa de tensão entre 0V e 3.3V
'''
return 3.3*x/65535
leituras = [0, 0, 0, 0, 0]
bAntes = bot.value() # Estado original do botão
while True:
bAgora = bot.value()
if bAgora != bAntes: # Estado do pino mudou (botão apertado ou botão solto)
if bAgora == 0: # O estado mudou pois o botão foi pressionado
'''
Ação a ser executada por causa do pressionamento do botão
'''
for i in range(5): # Repete o ciclo de leitura 5 vezes
leituras[i] = sensor.read_u16() # Leitura do ADC em 16 bits (resultado entre 0 e 65535)
media = sum(leituras)/len(leituras)
tensao = tensaoADC(media)
'''
Obtém o instante de tempo da medição e
formata uma linha de dados para gravação ou envio os dados
'''
t = localtime()
ts = f'{t[0]}-{t[1]}-{t[2]}T{t[3]}:{t[4]}:{t[5]}'
dados = f'{ts};{media};{tensao}'
'''
Grava uma linha de dados no arquivo de registro de telemetria
'''
with open('telemetria.csv','a') as arquivo:
arquivo.write(dados)
'''
Ação a ser executada por causa do pressionamento do botão
'''
bAntes = bAgora # Atualiza o estado original do botão, para detectar novas mudanças
sleep_ms(100) # Pausa o tempo necessário para minimizar ruído (bouncing)