使用python实现win10系统和arduino usb串口通信

arduino

NO.1
前言

arduino有很多可以直接使用的传感器,可以很方便的获取大量的环境数据.

常见的有:

  • 温度(室温,冰箱,水箱等场景)

  • 湿度(房间空气湿度,花盆土壤湿度等场景)

  • 声(声控灯,噪音检测,深海测量,医疗器械等场景)

  • 光(灯光调节,距离检测等场景)

  • 气压,磁力,位置,角度等传感器数据

现在有个问题,如何把通过arduino获取的温湿度等数据,发送给pc电脑或者树莓派等设备,以达到数据存储,数据展示的目的.

提到通信方法,众所周知的有

  • 蓝牙(BLE):即蓝牙低能耗技术,是一种低成本、短距离、可互操作的无线技术

  • wifi:一种是无线局域网技术,功耗高,但是场景通用,现在几乎每家每户都有一台路由器.

其次是

  • 串口通信

  • ZigBee:基于IEEE802.15.4标准的低功耗局域网协议,是一种短距离、低功耗的、便宜的无线组网通讯技术

按照从简原则,先从最直接的方式入手,也就是使用usb串口通信

  • 当前的arduino就是使用usb连接到pc电脑,无需其他操作(如果使用蓝牙,wifi,还需要对应的模块和较多的程序开发)

  • pc电脑通信完成后,再用arduino通信树莓派,无缝对接,本质都是系统,都是usb连接,都可以使用python(当前环境为居家场景)

  • 测试上位机操作arduino更加方便,如控制arduino灯的开关,直接用电脑的键盘,或者简单的web界面,甚至只是简单python代码片段就可以(如果使用蓝牙,wifi,通过手机或者其他硬件来控制,中间就多了一层,如写APP,对接开关硬件等,而通过usb到电脑,可以更快的实时调试和修改,这样能更方便的尝试之后的其他项目)

NO.2
通信场景

arduino串口通信可以划分为

  • 下位机通信:arduino向其他设备传输数据(数据发送到云端或者本地服务器储存等)

  • 上位机通信:其他设备向arduino传输数据(通过手机,电脑等一些交互页面或者服务向arduino发送指令,动态控制等)

usb连接()

  • 左侧为usb扩展器

  • 中间为arduino开发板

  • 右侧为面包板和温湿度传感器

arduino

NO.3
获取数据
一.获取设备端口和波特率

端口查看

打开arduino ide->工具->端口

可以查看到当前勾选的端口为 COM3

arduino

波特率查看

Serial.begin(9600);

可以看到设置的波特率为9600

arduino

二.设置python串口通信

本文用到的Python库为pyserial,pyserial的作用在于提供一个从串口读取信息的接口

  1. 安装pyserial: pip install pyserial

  2. 打开编辑器,新建index.py文件(可以使用pyCharm,本文使用vsCode)

  3. 写入代码,具体描述和功能参考代码注释

# 引入串口库(注意是serial,不是pyserial)
import serial

# 设置端口变量和值
serialPosrt = "COM3"
# 设置波特率变量和值
baudRate = 9600
# 设置超时时间,单位为s
timeout = 0.5
# 接受串口数据
ser = serial.Serial(serialPosrt, baudRate, timeout=timeout)

# 循环获取数据(条件始终为真)
while 1:
    # 读取接收到的数据的第一行
    str = ser.readline()
    # 把数据打印到终端显示
    print(str)

得到的结果为

arduino

至此,pc端就拿到arduino传送的温湿度等传感器数据了.

NO.4
Tips

运行python代码时,可能会遇到以下错误:

  • 没有权限

  • 端口被占用

如提示

serial.serialutil.SerialException: could not open port 'COM3': PermissionError(13, '拒绝访问。', None, 5)

经过排查,是因为arduino ide的串口显示器占用了端口,导致pc上的python无法访问端口

arduino

解决这个问题的方式就是关闭arduino的串口显示器后,再执行python脚本

也许遇到的问题不一定同我一样,你还可以尝试

  • 使用管理员权限打开终端,如cmd

  • 确认端口和波特率值正确以及代码的大小写,单词等格式或者拼写正确

  • 按照错误提示修复问题或者参考搜索引擎检索答案

NO.5
总结

本文描述了

  • 常见的几种通信方式和传感器应用场景

  • arduino usb串口通信python获取数据的实现方法

  • 开发调试过程中遇到了一个难排查的错误问题

下期内容

  • 使用sqlite等数据库存储arduino的传感器数据

  • 构建web ~~大 ~~数据面板,实时查看温湿度变化,动态折线图表,仪表盘效果等

  • 根据温湿度值来设置舒适度提示反馈,高低温预警,自动温湿度控制等

  • 上位机反向控制arduino led灯开关,通过web界面或者代码等

END.