Lettura S0 - script python

Discussioni relative all'uso di contatori ad impulsi S0
rinoronie
Messaggi: 184
Iscritto il: 08/03/2018, 0:27

Re: Lettura S0 - script python

Messaggioda rinoronie » 28/04/2020, 13:41

Ho trovato, avevo messo il PIN_GPIO = 10, ma il suo BCM è 15, ora lo script mi restituisce i dati.


rinoronie
Messaggi: 184
Iscritto il: 08/03/2018, 0:27

Re: Lettura S0 - script python

Messaggioda rinoronie » 28/04/2020, 17:01

Ho notato che spesso mi fa più letture, non ho messo nessun resistenza, con il contatto chiudo il +5v e in GPIO
avete di suggerimenti?
ho provato anche metterci un relè ma a volte mi fa la lettura anche sullo spegnimento

grazie

rinoronie
Messaggi: 184
Iscritto il: 08/03/2018, 0:27

Re: Lettura S0 - script python

Messaggioda rinoronie » 28/04/2020, 20:19

Ho modificato lo script (il mio è per l'acqua) in modo che:

verifica se esiste il file letto da metern:
se esiste legge l'ultimo valore all'avvio (come nel precedente script)
se non esiste lo crea e lo valorizza con l'ultimo valore del csv

inoltre ignoro le letture per 3 secondi

All'inizio ci sono tutti i parametri e ho cercato di mettere un bel po di commenti e log

Codice: Seleziona tutto

#!/usr/bin/python

# pin gpio utilizzato per leggere gli impulsi
pin_gpio = 15
# n. di meter utilizzato in MeterN
metern_id = 18
# fattore di conversione del contatore (unita di misura)
conv = 1
#unita di misura
um = 'l'
#file metern
filemetern = '/dev/shm/metern'+str(metern_id)+'.txt'
#percorso cartella csv di metern
cartellacsv='/var/www/metern/data/csv'
#nome della colonna del csv da recuperare
nomecolonna='Acqua(l)'
#numero di secodi per ignorare le letture
secondi = 3

counter = 0

#cerco il file metern per recuperare l ultimo valore
try:
  #trovato il file metern
  f = open(filemetern)
  print('File '+filemetern+' trovato')
  fold = open(filemetern,'r')
  dato = fold.read()
  c1 = dato.find('(') + 1
  c2 = dato.find('*')
  counter = int(dato[c1:c2])
  print('Ultimo valore del file '+filemetern+': '+str(counter))
  f.close()
except IOError:
  #non trovato il file di metern, cerco l'ultimo valore nel csv
  print('File '+filemetern+' non trovato')
  import glob
  import os
  list_of_files = glob.glob(cartellacsv+'/*.csv')
  latest_file = max(list_of_files, key=os.path.getctime)
  import csv
  with open(latest_file, mode='r') as csv_file:
     csv_reader = csv.DictReader(csv_file)
     for riga in csv_reader:
        counter = int(riga[nomecolonna])
  print('Trovato file '+latest_file+' con ultimo valore della colonna '+nomecolonna+ ' = '+str(counter))
  documento = open(filemetern, "w")
  print('Creato il file '+filemetern)
  documento.write(str(metern_id)+'('+str(counter)+'*'+um+')')
  print('Inserisco il valore: '+str(metern_id)+'('+str(counter)+'*'+um+') nel file '+filemetern)
  documento.close()
#finally:

print('')

import time
import RPi.GPIO as GPIO
import datetime
from datetime import timedelta
now = datetime.datetime.now()
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin_gpio, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)

"""
counter = 0
fold = open('/run/shm/metern18.txt','r')
dato = fold.read()
c1 = dato.find('(') + 1
c2 = dato.find('*')
counter = int(dato[c1:c2])
"""

precedente = datetime.datetime.now() #test
print 'Inizio: ' + str(precedente) #test

print str(now) + ' - Avvio script s0 - conteggio iniziale: ' + str(counter)

while True:
    GPIO.wait_for_edge(pin_gpio, GPIO.RISING)
    attuale = datetime.datetime.now() #test
#    print 'precedente: ' + str(precedente) #test
#    print 'attuale:    ' + str(attuale) #test
#    print attuale - timedelta(seconds=2)
    if (attuale - timedelta(seconds=secondi))  > precedente :
        counter += 1

    now = datetime.datetime.now()

    if (attuale - timedelta(seconds=secondi))  > precedente :
         print str(now)  + ' - ' + str(metern_id) + '(' + str(counter*conv) + '*' + str(um) +')'
    else:
         print str(now)

    precedente = attuale

    volume = str(metern_id) + '(' + str(counter*conv) + '*' + um + ')\n'
    fp = open(filemetern,'w')
    fp.write(volume)
    fp.close()
    GPIO.wait_for_edge(pin_gpio, GPIO.FALLING)

GPIO.cleanup()
Ultima modifica di rinoronie il 30/04/2020, 22:36, modificato 3 volte in totale.

rinoronie
Messaggi: 184
Iscritto il: 08/03/2018, 0:27

Re: Lettura S0 - script python

Messaggioda rinoronie » 30/04/2020, 9:31

Non capisco il motivo, ma a volte mi ritrovo lo script non più in esecuzione, lo ho avviato con /percorso/nomescript.py &
potrebbe essere perché ho dei print? in quel caso dove finiscono?
grazie

Avatar utente
Flane
Messaggi: 2460
Iscritto il: 16/01/2016, 15:02

Re: Lettura S0 - script python

Messaggioda Flane » 30/04/2020, 11:32

Prova ad avviarlo al comando:

Codice: Seleziona tutto

script_da_avviare > /dev/null 2>/dev/null &

dove con la parte

Codice: Seleziona tutto

 > /dev/null 2>/dev/null &

blocchi l'uscita di eventuali output diretti altrimenti allo standard output

rinoronie
Messaggi: 184
Iscritto il: 08/03/2018, 0:27

Re: Lettura S0 - script python

Messaggioda rinoronie » 30/04/2020, 12:15

Si chiude comunque, ora lo tengo aperto da SHELL su un pc e verifico se si chiude magari con qualche errore...

EDIT:
dopo 9 ore è li ancora che gira... e nessun errore...

EDIT2:
avevo dimenticato un "int" quando recuperavo il valore dal csv, e leggeva la variabile counter come testo, poi al primo incremento andava in errore.
Ho aggiornato lo script al post precedente


Torna a “Contatori ad impulsi”

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti