Python Script? - Регистрация серийного выхода от Arduino
Я использую плату OrangePI для регистрации данных от Arduino, который выдает строку по последовательному выходу каждые 10 секунд.
20.0 / 12.0 V
Это логарифм Температура, измеренная датчиком температуры, подключенным к Arduino, и напряжение, которое используется для экономии заряда аккумулятора.
Мне удалось создать сценарий из фрагментов и предложений, собранных в Интернете, который делает именно то, что мне нужно.
#!/bin/bash
# Script will run at reboot.
echo "Beginning Temperature Log!"
NOW=$(date +"%Y-%m-%d")
LOGFILE="log-$NOW"
name=$LOGFILE
if [[ -e $name ]] ; then
i=2
while [[ -e $name-$i ]] ; do
let i++
done
name=$name-$i
fi
ts </dev/ttyUSB0>$name
Сценарий запускается каждый раз, когда я загружаю машину, устанавливая cron @reboot, который работает довольно хорошо.
Теперь я планирую расширить код arduino с помощью "батарейного предохранителя", который отправляет предупреждение на последовательный выход, когда напряжение падает ниже определенного уровня.
20.0 / 9.0 V / BAT!
На этом этапе OrangePI должен остановить / отключить и отправить определенное письмо в arduino, когда он "безопасен для отключения", чтобы arduino мог деактивировать реле и отключить всю систему. (и сам)
Поэтому я предполагаю, что OrangePI всегда должен смотреть последнюю строку в выводе arduino для строки "BAT!" и затем вызвать отключение.
У меня есть концепция для аппаратной части этого проекта Также концепция для кода Arduino
Но не знаю, как кодировать это в Linux. Может быть, подход неправильный, как сейчас, и все это должно быть написано на python или что-то еще?
Спасибо за любые предложения.
1 ответ
Python был бы действительно простым и аккуратным способом. Используя pyserial, вы можете заставить его читать строки, передаваемые по последовательному соединению, и искать слово BAT, или что угодно, что вы действительно хотите. Итак, с моей головы, вы можете сделать что-то вроде:
import serial
from sys import argv
port = argv[1] # just to assign port and baud from command line
baud = argv[2]
COM = serial.Serial(port, baud) # create serial instance
data_in = COM.readline().strip("\r\n") # strip ending
### then some manipulation of data_in ### for example:
if(something you want is in the transmission string):
# do something
else:
float_list = [float(x) for x in data_in]
# convert all the vals to a floats for logging etc.
Надеюсь, этот пример полезен, и вы можете что-то с ним сделать.