Arduino Uno Raspberry Pi Последовательная связь двойные чтения - PullRequest
0 голосов
/ 27 августа 2018

Я использую Arduino Uno для преобразования аналоговых данных в цифровые с датчика освещенности и отправки этих данных в raspberry pi с помощью кабеля USB. Однако когда я запускаю код, я читаю значения, например 1923, с 10-битного датчика.

Вот код Arduino

int a = A0;
int meas = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
meas = analogRead(a);
if(Serial.readString() == "1"){ //Check that Raspberry wants data or not
Serial.println(meas);     
}
}

Вот код Python в Raspberry Pi

import serial
from datetime import datetime
now = datetime.now()

ser = serial.Serial('/dev/ttyACM0', 9600)
ser.write("1".encode())
s = ser.readline()

file = open("dataset.txt", "a")
file.write(now.strftime("%Y-%m-%d %H:%M") + " Sensor Value:" + str(s)+ "\n")
file.close()

Вот пример выходных данных после запуска кода каждые 5 минут

14:08 Sensor Value:6
14:10 Sensor Value:8
14:15 Sensor Value:8
14:20 Sensor Value:10
14:25 Sensor Value:6
14:30 Sensor Value:9
14:35 Sensor Value:6
14:40 Sensor Value:7
14:45 Sensor Value:5
14:50 Sensor Value:5
14:55 Sensor Value:12
15:00 Sensor Value:1
15:05 Sensor Value:1
15:10 Sensor Value:10
15:15 Sensor Value:12
15:20 Sensor Value:14
15:25 Sensor Value:1922
15:30 Sensor Value:2211
15:35 Sensor Value:11
15:39 Sensor Value:6
15:40 Sensor Value:7
15:45 Sensor Value:8
15:50 Sensor Value:10
15:55 Sensor Value:1
16:00 Sensor Value:
16:05 Sensor Value:11

Я хочу избавиться от этих 1-х и 1922-х годов, как от вещей, которые, безусловно, являются бессмысленными данными.

PS: датчик находится на вершине горы, я использую удаленное соединение для проверки данных и манипулирования кодом.

Как я могу это сделать? Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Я думаю, что Марк Сетчелл прав. Вы получаете данные прошлых измерений.

Лично я бы реализовал более надежный протокол, но поскольку ваше приложение довольно простое, вы можете попробовать более простой подход, который он и предложил.

Это легко решается добавлением небольшой задержки в программе Python между запросом и чтением. Примерно так может быть достаточно:

from time import sleep
...
ser.write("1".encode())
sleep(0.05);
s = ser.readline()

А пока мне не нравится, как ты справляешься с чтением в Arduino. Если вы всегда отправляете команды с одним символом, я предлагаю такой подход:

void loop() {
    meas = analogRead(a);
    if (Serial.available())
    {
        if (Serial.read() == '1')
        {
            Serial.println(meas);
        }
    }
}

Это не блокирует выполнение цикла (что может пригодиться, если вы планируете расширить функциональные возможности)

0 голосов
/ 27 августа 2018

Вы можете взглянуть на калибровку, вот пример кода,

https://www.arduino.cc/en/Tutorial/Calibration

...