Raspberry Pi & Arduino 读取串行传感器数据



我有一个电压传感器连接到我的Arduino uno,它又连接到我的Raspberry Pi 3。我想以乒乓球的方式从Arduino到Raspberry Pi获取传感器信息。我将用一个通过 cronjob 上的 Python 脚本发送的字符来唤醒它,并将传感器值抓取并放入 mysql 数据库中。

将来我想为Arduino添加更多传感器

我遇到的问题是当我运行python代码时,Python方面我只得到一个空白的黑线。

Raspberry Pi 3 Python 代码:

#!/usr/bin/python
import serial 
import MySQLdb
import time
db = MySQLdb.connect(host="localhost",    
user="user",        
passwd="password", 
db="database")        
cur = db.cursor()
port = serial.Serial("/dev/ttyACM0", baudrate = 9600, timeout=None)
port.flushInput()      
sensor1 = 0;
sensor2 = 0;
sensor3 = 0;
vals = []
while (port.inWaiting()==0):
port.write("*")
time.sleep(1)
vals = (port.readline()).split(',')
print vals
sensor1 = int(vals[0])
sensor2 = int(vals[1])
sensor3 = int(vals[2])
cur.execute("insert into voltage(volts) values(" + str(Battout) + ")" ) 
cur.execute("SELECT * from voltage")
db.close()

Arduino 代码:

const int BattVolt = A0;
int BattVal = 0;
float Battout;          
void setup() {
Serial.begin(9600);
}

void loop() {
Serial.flush();
while(!Serial.available());  //wait for character from raspi
delay(1000);
float Voltage;
BattVal = analogRead(BattVolt);  //read analog pins
Voltage=BattVal/4.09;
Battout=(Voltage/10);
Serial.print(Battout);
Serial.print(",");
}

对实现的一些观察。

  1. 为什么在 python 脚本中使用Battout

  2. 在 python 脚本中,您需要一行(这意味着以""结尾的字符串),但在 Arduino C++ 代码中,您使用print而不是println或添加换行符。

  3. 显然,您希望在python
  4. 脚本中收到类似"12,32,15"的内容,但是如果您只向Arduino发送一个字符,则只会对主循环进行1次迭代。

Raspberry Pi 3和uart0(蓝牙),uart1(串行)存在问题。
对于Pi 3,uart1通常在/dev/ttyS0和TX-GPIO 14,RX-GPIO 15上可用。
uart1的波特率取决于内核时钟。因此,如果核心时钟发生变化,波特率也会发生变化!
解决方法 1:/boot/config.txt中添加行core_freq=250。保存并重新启动!现在您的 Pi 具有恒定的核心频率。树莓派 3 UART 波特率解决方法
解决方法 2:更改设备树,将uart0用于串行通信,uart1用于蓝牙(蓝牙现在存在相同的问题)。树莓派3兼容性(BT禁用和串行端口重新映射修复)

最新更新