通过python获取Arduino雨滴传感器模块的数据(PyMata3+MySQL)

mac2024-03-14  24

在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()

运行程序

最新回复(0)