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

在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的主要模型有两种:

  1. 在一个模型中,Arduino草图的作者使用Firmata库提供的各种方法来选择性地在Arduino设备和主机上运行的软件之间发送和接收数据。例如,用户可以使用来将模拟数据发送到主机,Firmata.sendAnalog(analogPin,
    analogRead(analogPin))或者使用来发送打包在字符串中的数据Firmata.sendString(stringToSend)。
  2. 第二种也是更常见的模型是在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()

运行程序
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.郑先生_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值