首页 > 解决方案 > 由 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()

标签: pythonarduinoraspberry-pi

解决方案


我的代码仍然有问题,一旦我将代码更改为: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 打开继电器,反之亦然,但我不知道如何实现。有什么建议吗?


推荐阅读