26/05/2026, 17:45
(Questo messaggio è stato modificato l'ultima volta il: 26/05/2026, 17:48 da LaPa1.)
Buonasera a tutti,
l'oggetto che sto cercando di realizzare è molto semplice:
1) un PICO senza wireless
2) un pacco da 3 batterie AA
3)un sensore UR e temperatura BME280
l'idea è questa: l'oggetto dovrebbe essere collegato al PC per ilprimo rilievo così registra la data e l'ora e i dati del sensore in logger.csv, poi si accende il pacco batterie, si sconnette dal PC e per i successivi rilievi che avvengono ogni 15 minuti aggiorna in automatico la data ora aggiungendo 15 minuti e riscrive tutto nel file insieme al nuovo rilievo.
l'ambiente è Circuitpython
Tra un rilievo l'altro il pico va in deepsleep per consumare meno e per fare durare di più le batterie.
il codice è il seguente:
Non funziona. Secondo me perché
connetto al PC, parte in automatico code.py il primo rilievo compresa la data, se non ho capito male, non la scrive materialmente nel file logger.csv ma la tiene nella ram del Pico fino a che non si spegne il pico e lo si riaccende. Questo lo deduco dal fatto che se tra un rilievo e l'altro apro il logger.csv lo trovo vuoto, se spengo e riacendo il Pico anche se alla riaccensione arresto il code.py in logger.csv trovo il dato.
Pertanto il secondo rilievo non legge nessuna data a cui aggiungere i 15 minuti.
Insomma se faccio le prove con la procedura che ho ipotizzato e lo lascio per una o 2 orette lì a rilevare alla fine il file logger.csv è vuoto.
nel file errore trovo questo
----- NUOVO ERRORE -----
Traceback (chiamata più recente per ultima):
File "code.py", riga 80, in <module>
IndexError: index oltre il limite
in riga 80
in pratica nell riga 80 c'è la lettura del file per estrarre la data con un indice che però non trova perché la data non è scritta nel file fino a quando non si spegne e riaccende il Pico (se non ho capito male).
Potrei cambiare la procedura, devo provare.
1) primo rilievo con pico connesso attendo la scrittura poi disconnetto il il Pico dal PC
2) attendo 877 secondi e riaccendo il pico con le batterie.
però mi sembra molto rozzo .....
Suggerimenti?
Un grazie anticipato e per tutto
Un salutone
LaPa
l'oggetto che sto cercando di realizzare è molto semplice:
1) un PICO senza wireless
2) un pacco da 3 batterie AA
3)un sensore UR e temperatura BME280
l'idea è questa: l'oggetto dovrebbe essere collegato al PC per ilprimo rilievo così registra la data e l'ora e i dati del sensore in logger.csv, poi si accende il pacco batterie, si sconnette dal PC e per i successivi rilievi che avvengono ogni 15 minuti aggiorna in automatico la data ora aggiungendo 15 minuti e riscrive tutto nel file insieme al nuovo rilievo.
l'ambiente è Circuitpython
Tra un rilievo l'altro il pico va in deepsleep per consumare meno e per fare durare di più le batterie.
il codice è il seguente:
Codice:
import traceback
try:
#prova deep sleep senza scrittura file che aggiungo dopo
import time
import alarm
import board
import busio
import adafruit_bme280.basic as adafruit_bme280
import analogio
import digitalio
import usb_cdc #per la verifica della connessione del Pico
import rtc
import adafruit_datetime as datetime
print("ci sono 20 secondi prima che si avvii il codice per interromperlo e scaricare il logger.csv")
time.sleep(20)
print()
# Qui fai lettura sensore
print("Leggo sensore")
i2c = busio.I2C(scl=board.GP9,sda=board.GP8)
# BME280
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c,address=0x76)
time.sleep(2)
Temperatura = round(bme280.temperature, 2)
Umidità = round(bme280.humidity, 2)
# Leggi la tensione reale dal Pin 39 (VSYS)
vsys_adc = analogio.AnalogIn(board.VOLTAGE_MONITOR)
def get_vsys_voltage():
# Legge il valore ADC a 16-bit (0-65535)
adc_value = vsys_adc.value
# Converte il valore in tensione letta dall'ADC (3.3V di riferimento)
adc_voltage = (adc_value * 3.3) / 65535
# Il circuito del Pico dimezza VSYS sul pin 39, quindi moltiplichiamo per 2
vsys_actual = adc_voltage * 2
return vsys_actual
vsys = get_vsys_voltage()
print()
print("Temperatura:", Temperatura)
print("Umidità:", Umidità)
print("il voltaggio su vsys è ", vsys," deve essere maggiore di 3.3 volt altrimenti il Pico non funziona correttamente, il sensore funziona anche con tensione inferiore")
print("potrei inserire una condizione per cui quando il valore è minore di 3.3 si accende un led")
print("che indica di cambiare la batteria, ma al momento il valore lo scrivo solo sul logger")
print("----------------")
#inserire qui la condizione per la data ed eventuale calcolo della data
orologio = rtc.RTC() # Crea l'oggetto RTC per l'orologio interno
if usb_cdc.console.connected:
print("il Pico è connesso al computer può scrivere la data sul logger.csv")
# Crea l'oggetto RTC per l'orologio interno
orologio = rtc.RTC()#sincronizza l'orologio
# Ottieni il timestamp corrente
ora_corrente = datetime.datetime.now()#con questo faccio i calcoli
print (ora_corrente)
print(type(ora_corrente))
strOraCorrente=str(ora_corrente)#per trasformarlo in str devo creare un a nuova variabile
print(type(strOraCorrente))
print (strOraCorrente)#con questo lo scrivo su Excell
data=strOraCorrente
# Formatta la data e ora in una stringa pulita (Es: "2026-05-23 15:30:00")
#data_formattata = ora_corrente.strftime("%Y-%m-%d %H:%M:%S") #strftime non funziona in circuitpython
#print(data_formattata)
else:
print("il Pico non è connesso al computer aggiungere alla data ora precedente 15 minuti")
# 1. Legge l'ultima riga del file
f = open("logger.csv", "r")
#with open(logger.csv, "r") as f:
righe = f.readlines()
ultima_riga = righe[-1].strip()
# 2. Isola la stringa della data (es: "2026-05-23 16:10:00")
stringa_dataora = ultima_riga.split(";")[0] #prende il primo termine prima del ;
# 3. Separa i pezzi usando gli spazi, i trattini e i due punti
data_pezzi, ora_pezzi = stringa_dataora.split(" ")
anno, mese, giorno = data_pezzi.split("-")
ora, minuto, secondo = ora_pezzi.split(":")
# 4. Ricrea l'oggetto datetime puro
ultima_dataora = datetime.datetime(
int(anno), int(mese), int(giorno),
int(ora), int(minuto), int(secondo))
print(ultima_dataora)
# 5. Aggiunge 15 minuti
nuova_dataora = ultima_dataora + datetime.timedelta(minutes=15)
print(nuova_dataora)
data=str(nuova_dataora)
#print("qui dovrei inserire la scrittura su file logger che al momento non eseguo")
# apertura file
with open("logger.csv", "a") as file:#è un append
file.write(
data
+ ";"
+str(Temperatura)
+ ";"
+ str(Umidità)
+";"
+ str(vsys)
+ "\n"
)
file.flush()#salva il file
print("SCRITTO")
print("parte un deep sleep di 900 secondi")
# Attendi eventuali operazioni
time.sleep(1)
except Exception as e:
with open("errore.txt", "a") as f:
f.write("\n----- NUOVO ERRORE -----\n")
traceback.print_exception(e, file=f)
# Wake tra 15 minuti
time_alarm = alarm.time.TimeAlarm(
monotonic_time=time.monotonic() + 877
)
# deep sleep
alarm.exit_and_deep_sleep_until_alarms(
time_alarm
)Non funziona. Secondo me perché
connetto al PC, parte in automatico code.py il primo rilievo compresa la data, se non ho capito male, non la scrive materialmente nel file logger.csv ma la tiene nella ram del Pico fino a che non si spegne il pico e lo si riaccende. Questo lo deduco dal fatto che se tra un rilievo e l'altro apro il logger.csv lo trovo vuoto, se spengo e riacendo il Pico anche se alla riaccensione arresto il code.py in logger.csv trovo il dato.
Pertanto il secondo rilievo non legge nessuna data a cui aggiungere i 15 minuti.
Insomma se faccio le prove con la procedura che ho ipotizzato e lo lascio per una o 2 orette lì a rilevare alla fine il file logger.csv è vuoto.
nel file errore trovo questo
----- NUOVO ERRORE -----
Traceback (chiamata più recente per ultima):
File "code.py", riga 80, in <module>
IndexError: index oltre il limite
in riga 80
Codice:
ultima_riga = righe[-1].strip()in pratica nell riga 80 c'è la lettura del file per estrarre la data con un indice che però non trova perché la data non è scritta nel file fino a quando non si spegne e riaccende il Pico (se non ho capito male).
Potrei cambiare la procedura, devo provare.
1) primo rilievo con pico connesso attendo la scrittura poi disconnetto il il Pico dal PC
2) attendo 877 secondi e riaccendo il pico con le batterie.
però mi sembra molto rozzo .....
Suggerimenti?
Un grazie anticipato e per tutto
Un salutone
LaPa

![[-] [-]](https://forum.raspberryitaly.com/images/square/collapse.png)

Facebook
Twitter
Google +
Youtube
Telegram