python - 由 Arduino 通过 HC12 控制的继电器到树莓派
问题描述
我正在尝试使用连接到 Arduino 的 HC12 来实现无线土壤湿度传感器,以发送信号(值:0-100%)然后激活连接到树莓派 3 的继电器,具体取决于特定百分比(例如: 20% 开,90% 关)。我想出了如何发送值,我可以在 pi 上看到它们,但我无法激活继电器。请帮忙。
这是我正在使用的代码:
import RPi.GPIO as GPIO
import smtplib
import time
from time import sleep
import serial
GPIO.setmode(GPIO.BCM) # Set our GPIO numbering to BCM
relay_pin = 16
GPIO.setup(relay_pin, GPIO.OUT)
GPIO.output(relay_pin, 1)
ser = serial.Serial ("/dev/ttyS0",9600) #Open port with baud rate
try:
while True:
received_data = ser.read() #read serial port
data_left = ser.inWaiting()
received_data += ser.read(data_left)
print (received_data) #print received data
ser.write(received_data) #transmit data serially
if received_data <= '20':
GPIO.output(relay_pin, 0)
elif received_data >= '90':
GPIO.output(relay_pin, 1)
except KeyboardInterrupt:
pass
GPIO.cleanup()
解决方案
我的代码仍然有问题,一旦我将代码更改为:if int(received_data) <= 20,就会出现一条错误消息。这是修改后的代码:
import RPi.GPIO as GPIO
import smtplib
import time
from time import sleep
import serial
GPIO.setmode(GPIO.BCM) # Set our GPIO numbering to BCM
relay_pin = 16
GPIO.setup(relay_pin, GPIO.OUT)
GPIO.output(relay_pin, GPIO.HIGH)
ser = serial.Serial ("/dev/ttyS0",9600)
try:
while True:
received_data = ser.read() #read serial port
data_left = ser.inWaiting()
received_data += ser.read(data_left)
print (received_data) #print received data
ser.write(received_data) #transmit data serially
if int(received_data) <= 20:
GPIO.output(relay_pin, GPIO.HIGH)
elif int(received_data) >= 90:
GPIO.output(relay_pin, GPIO.LOW)
else:
GPIO.output(relay_pin, GPIO.LOW)
except KeyboardInterrupt:
pass
GPIO.cleanup()
但是,当我删除“if int(received_data) <= 20”,并将代码保留为:
import RPi.GPIO as GPIO
import smtplib
import time
from time import sleep
import serial
GPIO.setmode(GPIO.BCM) # Set our GPIO numbering to BCM
relay_pin = 16
GPIO.setup(relay_pin, GPIO.OUT)
GPIO.output(relay_pin, GPIO.HIGH)
ser = serial.Serial ("/dev/ttyS0",9600)
try:
while True:
received_data = ser.read() #read serial port
data_left = ser.inWaiting()
received_data += ser.read(data_left)
print (received_data) #print received data
ser.write(received_data) #transmit data serially
if received_data <= 20:
GPIO.output(relay_pin, GPIO.HIGH)
elif received_data >= 90:
GPIO.output(relay_pin, GPIO.LOW)
else:
GPIO.output(relay_pin, GPIO.LOW)
except KeyboardInterrupt:
pass
GPIO.cleanup()
继电器打开,但它不响应从 Arduino 和土壤湿度传感器接收到的串行数据。我在想也许可以定义来自 Arduino 的串行数据让我们说:在 20% 的湿度时打开继电器并在土壤湿度为 90% 时关闭,因此将 20% 的值定义为“1”或GPIO.HIGH 打开继电器,反之亦然,但我不知道如何实现。有什么建议吗?
推荐阅读
- android - 如何在 Kotlin 的 RecyclerView.Adapter 中使用 SharedPreferences?
- visual-studio-code - FileSystemProvider.watch 函数中“排除”选项的格式
- linux - 如何在不运行 uname 或 proc/version 的情况下找出正在运行的内核版本?
- typescript - 来自同一碱基的亚型之间的区别
- algorithm - 可以根据这些变量的特定总和的结果计算变量值的算法
- apache-spark - Spark:无法从填充另一列空值的输出中创建新列
- excel - 在一个表中查找一个值,从同一行复制不同列中的数据,然后粘贴到另一个表中
- php - 通过 PHAR 在 Windows 上安装的 PHPUnit 8 显示没有执行测试
- matlab - 呈现函数值随三个参数变化,一个数字
- python - XArray:向 NetCDF 添加数据“层”