Raspberry Pi & Arduino 读取串口传感器数据
Raspberry Pi & Arduino reading serial sensor data
我有一个电压传感器连接到我的 Arduino uno,它又连接到我的 Raspberry Pi 3. 我想以乒乓方式从 Arduino 到 Raspberry Pi。我将通过 cronjob 上的 Python 脚本发送一个字符来唤醒它,并抓取传感器值并将其放入 mysql 数据库中。
以后我想给 Arduino 添加更多的传感器
我遇到的问题是 Python 方面,当我 运行 python 代码时,我只得到一条空白的黑线。
Raspberry Pi3Python代码:
#!/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(",");
}
对您的实施的一些观察。
为什么在python脚本中使用Battout
?
在 python 脚本中你期待一行(这意味着字符串以 '\n' 结尾)但在 Arduino C++ 代码中你使用 print
而不是println
或添加换行符。
显然您希望在 python 脚本中收到类似“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 有一个恒定的核心频率。 Raspberry Pi 3 UART baud rate workaround
解决方法 2: 更改设备树,使用 uart0
进行串行通信,使用 uart1
进行蓝牙(现在蓝牙也有同样的问题)。Raspberry Pi 3 compatibility (BT disable & serial port remap fix)
我有一个电压传感器连接到我的 Arduino uno,它又连接到我的 Raspberry Pi 3. 我想以乒乓方式从 Arduino 到 Raspberry Pi。我将通过 cronjob 上的 Python 脚本发送一个字符来唤醒它,并抓取传感器值并将其放入 mysql 数据库中。
以后我想给 Arduino 添加更多的传感器
我遇到的问题是 Python 方面,当我 运行 python 代码时,我只得到一条空白的黑线。
Raspberry Pi3Python代码:
#!/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(",");
}
对您的实施的一些观察。
为什么在python脚本中使用
Battout
?在 python 脚本中你期待一行(这意味着字符串以 '\n' 结尾)但在 Arduino C++ 代码中你使用
print
而不是println
或添加换行符。显然您希望在 python 脚本中收到类似“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 有一个恒定的核心频率。 Raspberry Pi 3 UART baud rate workaround
解决方法 2: 更改设备树,使用 uart0
进行串行通信,使用 uart1
进行蓝牙(现在蓝牙也有同样的问题)。Raspberry Pi 3 compatibility (BT disable & serial port remap fix)