【问题标题】:Relay controlled by Arduino via HC12 to a raspberry pi由 Arduino 通过 HC12 控制的继电器到树莓派
【发布时间】:2019-02-05 07:22:08
【问题描述】:

我正在尝试使用连接到 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()

【问题讨论】:

  • 你能分享你试过的代码吗?
  • 是的,我刚刚在我的问题上发布了它。
  • 您如何区分100 与三个数字 1,0,0 或单个数字 100 或可能是 10 和 0?你如何确保你得到完整的数字,而不仅仅是第一个数字?
  • 我不知道如何区分诸如'100'%之类的数字,因为我对编码不太熟悉。因此,我不确定是否可以根据 Arduino 发送的模拟数据使继电器工作,是否有可能实现?

标签: python arduino raspberry-pi


【解决方案1】:

我认为,问题在于声明if

if received_data <= '20':
    GPIO.output(relay_pin, 0)
elif received_data >= '90':
    GPIO.output(relay_pin, 1)

'20' 是字符串而不是数字。
尝试删除引号,如下所示:

if received_data <= 20:
    GPIO.output(relay_pin, 0)
elif received_data >= 90:
    GPIO.output(relay_pin, 1)

【讨论】:

  • received_data 也是一个字符串。
  • 我删除了引号,但继电器仍然没有响应,但我可以看到来自 arduino 的数据。
  • 所以尝试将received_data转换为int,然后进行比较。 if int(received_data) &lt;= 20
【解决方案2】:

我的代码仍然有问题,一旦我将代码更改为:if int(received_data)

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)

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 打开继电器,反之亦然,但我不知道如何实现。有什么建议吗?

【讨论】:

  • 或另一个想法:通过使用节点 red 或其他应用程序来允许用户从 Android 应用程序中选择特定的土壤湿度水平。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多