在Arduino的IDE编辑器上实现检测降雨量是比较简单的操作,在下面这个网址里有详细教程:https://www.cnblogs.com/eagler8/p/11561651.html
IDE的串口监视器虽然能输出信息,却不能将数据保存下来,也不能直接调用这些数据.
在上一节内容里,我介绍了:
通过python在Arduino开发板上实现blink—Arduino学习笔记1
在里面已经详细介绍了python调用Arduino开发板的2种方法,验证了使用python调用Arduino开发板的可行性,接下来,我要用第三种方法,通过python获取Arduino雨滴传感器模块传回的数据.
第三种方法用的库是pymata_aio. pymata_aio是使用Python asyncio的Arduino Firmata的Python协议抽象库
使用Firmata的主要模型有两种:
- 在一个模型中,Arduino草图的作者使用Firmata库提供的各种方法来选择性地在Arduino设备和主机上运行的软件之间发送和接收数据。例如,用户可以使用来将模拟数据发送到主机,Firmata.sendAnalog(analogPin,
analogRead(analogPin))或者使用来发送打包在字符串中的数据Firmata.sendString(stringToSend)。 - 第二种也是更常见的模型是在Arduino板上加载一个称为StandardFirmata的通用草图(或视您的需要而定义的StandardFirmataPlus或StandardFirmataEthernet等变体之一),然后仅使用主机与Arduino板进行交互。
为了节省时间,我们今天根据Arduino官网上的3线制雨滴传感器源码,把C语言改写成python.在改写的过程中,为了完善功能,我补充了一些内容.
先来看看c语言的程序是怎么实现的:
/*
【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
实验三十二:雨滴传感器模块(雨水/雨量/叶面湿度)《3线制》
*/
void setup()
{
pinMode(3,INPUT);
pinMode(13,OUTPUT);
}
void loop()
{
if (digitalRead(3))
{
digitalWrite(13,LOW);
}
else
{
digitalWrite(13,HIGH);
delay(1000);
}
}
雨滴传感器与Arduino开发板的连接方式如下:
需要注意的是,正负极不要接反,不然传回的数据是反的
接上电源后:
使用的线必须要有数据传输功能,只有充电功能的线会使程序出现报错
以下是python程序代码:
from pymata_aio.pymata3 import PyMata3
from pymata_aio.constants import Constants
from pymysql import *
import time
导入必要的模块
try:
conn = connect(host = '127.0.0.1',port = 3306,user = 'root',password = 'root',charset = 'utf8',db = 'test')
cursor = conn.cursor()
print("数据库连接成功!")
except Exception as e:
print(e)
连接数据库,把传回的数据保存在mysql里
BOARD_LED = 13
board = PyMata3(com_port="COM3") # 连接串口
连接名为COM3的串口
def setup():
board.set_pin_mode(BOARD_LED, Constants.OUTPUT)# 声明引脚为输出
board.set_pin_mode(3, Constants.INPUT)
board.enable_analog_reporting(0)
board.set_pin_mode(0, Constants.ANALOG) # 设置A0, 读模拟信号
初始化程序
def loop():
try:
if (board.digital_read(3)):
board.digital_write(BOARD_LED,1)
time.sleep(1)
else:
board.digital_write(BOARD_LED,0)
time.sleep(1)
ticks = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
hum = (board.analog_read(0))
print(ticks,'湿度:',hum) # 读A0,结果为0-1023的一个数
except Exception as e:
print(e)
board.shutdown()# 关闭连接, 很有必要
定义一个循环,让雨滴传感器持续工作
sql = 'insert into humiditydemo(dtime,humiditys)' + 'value(%s,%s)'
cursor.execute(sql,[ticks,hum])
最后在循环里加上把数据存到数据库里的语句
if __name__ == "__main__":
setup()
while True:
loop()
运行程序