Я пишу программу регистрации данных для моего 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 будет записана новая строка.