Сравнение данных с датчиков в массивах перед записью файла CSV не работает, Raspberry Pi - PullRequest
0 голосов
/ 25 сентября 2019

Я пишу программу регистрации данных для моего Raspberry Pi, которая работает довольно хорошо.Но прежде чем писать новую строку в CSV-файле, я хочу проверить, отличаются ли данные, чтобы убедиться, что я не пишу одни и те же данные дважды.Проблема в том, что я использую массив для хранения новых данных и массив для хранения старых данных.когда они отличаются, код запишет новую строку в CSV-файл и сделает старые и новые данные одинаковыми, тогда новые данные снова изменятся.Но по какой-то причине старый! = Новый не работает при поиске изменения данных.

Я попытался использовать больше глобальных переменных, но не локальных переменных.Я попытался использовать массив значений (все данные датчиков, а также 0) вместо информационного массива (данные активных датчиков).Я думал, что это может быть проблема с указателем, но я не думаю, что Python использует указатели.Когда я пишу строку "old = new" в цикле if new! = Old :.(см. код) он проходит только один раз и останавливается.Что меня действительно раздражает, так это то, что когда я меняю значения датчика и использую CTRL + C для прерываний.кажется, что старое и новое ВСЕГДА одинаковы.но они обновились до новых значений.Я попытался отладить код, но Пи и Тонни замирают, когда я добираюсь до библиотек.

######################Variables#######################
AnalogSensor = [False, True, False, False, False, True, True, True]    #8 analog inputs
AnalogSensorDelay = [1, 1, 1, 1, 1, 0.4, 2, 0.8]                       #the timing to read all of these inputs.
LoggingDelay = 1                                                       #the timing to write the Csv file
# DHT = 17 #not yet connected
Decimalen = 0                                                          #the amount of decimals after the decimal dot (1 means only logging 100th of seconds, 2 means 10th of a second. etc.)

###############Libraries##################
import time
import csv
from datetime import date
import datetime
import os.path
import Adafruit_GPIO.SPI as SPI
import Adafruit_MCP3008

###############Initial values of variables#############

name = "/media/pi/DIRK\040PI/" + str(date.today()) + ".0.csv"          #this will write a file to this path (USB stick in the pi) with the name 2019-09-25.0.csv
old = 1
new = 0
SPI_PORT   = 0
SPI_DEVICE = 0
starttime = time.time()
Sensortimer = [0]*8
values = [0]*8
Loggingtimer = 0
dataArray = [0]

###############Setup###################################

if Decimalen == 0:
    Decimalen = -1                                                    #gets rid of the decimal dot of there are no decimals.
mcp = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE))
data = [0]*(AnalogSensor.count(True))                                 #creates an array with the size of the amount of inputs put on True

def Filename(name):                                                   #this function changes the '2019-09-25.0.csv' name and changes the .0 to .1 .2 etc if the file already exists.
    x = 0
    while os.path.isfile(name):                                       #checks if the file exists.
        print("There was already a file named",name)
        x = x + 1                                                     #increase file number
        name = "/media/pi/DIRK\040PI/" + str(date.today()) + "." + str(x) + ".csv" 
    print("Creating file ", name)
    return name

def Writecsv(name, delay, info):                                      #writes a csv file with the name returned by the Filename function, with the delay chosen with LoggingDelay, and info is an array filled with active sensor data.
    global Loggingtimer
    global totaltime
    global starttime
    global old
    global new
    if (Loggingtimer + delay <= totaltime - starttime):              #checks if delay time has passed ( this is to bypass the sleep function and to be able to do other things )
        Loggingtimer = time.time() - starttime
        new = info                                                   #changes new to an array with the same values as info ( an array with active sensor values )
        if new != old:                                               # if new data is different from old data
            print(info)                                              # prints data in the Shell for comfort.
            write = str(datetime.datetime.now())                     ##
            write = write.split()                                    ##
            write[1] = write[1][:(9+Decimalen)]                      ##
            data = [write[0],write[1]]                               ## Creates a timestamp with 2 values, the date, and the time with chosen decimals
            for x in range((AnalogSensor.count(True))):              ## Add the data from the info array to the timestamp array to create the LOG.
                data.append(info[x])                                 ##
            with open(name,'a',newline="") as f: 
                writer = csv.writer(f)
                writer.writerow(data)                                # Write a row with the complete log
            print("Writing to file")
----------------------------------------------------------------------
#            old = new
----------------------------------------------------------------------            

def Analogread(pin, delay):                                          # This function reads the values of the MCP3008 and puts them in array Values, note. the array Values has the values of all 8 inputs, even if some inputs are disabled
    global totaltime
    global Sensortimer
    global starttime
    if (Sensortimer[pin] + delay <= totaltime - starttime):
        Sensortimer[pin] = time.time() - starttime
        values[pin] = mcp.read_adc(pin)
        return values[pin]

name = Filename(name)
while True:
    totaltime = time.time()                                          # Keeps updating the time
    y = 0
    for counter in range(8):                                         # Looks in the AnalogSensor array how many sensors are on True
        if AnalogSensor[counter] == True:
            Analogread(counter, AnalogSensorDelay[counter])          # Read the value of the inputs that are on True, ( the inputs on false will always be 0 )
            data[y] = values[counter]                                # Puts the data from the active sensors in a different array with only active sensor data
            y = y + 1
    Writecsv(name, LoggingDelay, data)                               

Я ожидаю, что результат будет примерно таким:

There was already a file named /media/pi/DIRK PI/2019-09-25.0.csv
There was already a file named /media/pi/DIRK PI/2019-09-25.1.csv
There was already a file named /media/pi/DIRK PI/2019-09-25.2.csv
Creating file /media/pi/DIRK PI/2019-09-25.3.csv
[7, 0, 700, 254]
Writing to file
[4, 0, 702, 254]
Writing to file
[9, 0, 697, 356]
Writing to file
[3, 0, 707, 456]
Writing to file
[2, 0, 712, 677]
Writing to file

Но после

[7, 0, 700, 254]
Writing to file

Просто останавливается.Нет ошибки.И продолжает обновлять как старые, так и новые массивы данных, которые по какой-то причине остаются неизменными.Несмотря на то, что old может быть обновлено только до значения new после того, как old и new будут различаться, и в файле csv будет записана новая строка.

1 Ответ

0 голосов
/ 25 сентября 2019

Я думаю, что ошибка здесь, попробуйте этот код:

def Analogread(pin, delay):
    global totaltime
    global Sensortimer
    global starttime
    if (Sensortimer[pin] + delay <= totaltime - starttime):
        Sensortimer[pin] = time.time() - starttime
        return mcp.read_adc(pin)

и измените

Analogread(counter, AnalogSensorDelay[counter])
data[y] = values[counter]

на

data[y] = Analogread(counter, AnalogSensorDelay[counter])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...