传感器 |
Pin |
I/O |
状态 |
D4 |
12 |
输出 |
1开0关 |
D5 |
13 |
输出 |
1开0关 |
风扇1 |
8,4 |
输出 |
开:8:0,4:1 关:8:1,4:0 |
蜂鸣器 |
5 |
输出 |
1关0开 |
概述
MicroPython是python3编程语言的精简实现,能够在资源非常有限的硬件上运行,如MCU微控制器
Micropython的网络功能和计算功能很强大,有非常多的库可以使用,它为嵌入式开发带来了一种新的编程方式和思维模式。嵌入式工程师不需要每次从最底层开始构建系统,可以直接从经过验证的硬件系统和软件架构开始设计,把重点放在应用层的开发上,降低了开发门槛,提高了开发效率。
合宙ESP32 C3外观及引脚分布
固件烧录
可使用在线网站进行固件烧录:https://dev.16302.com/tools/#/
GPIO相关知识
导入GPIO模块
from machine import Pin
创建一个GPIO对象
# 三种构造函数 # 2:引脚 # Pin.OUT:输出方向为:输出 #value=1: 高电平 #value=0: 低电平 led=Pin(2) led=Pin(2,Pin.OUT) led=Pin(2,Pin.OUT,value=1)
输入输出电频的两种方法
# 示例:2引脚输出高电频 from machine import Pin led=Pin(2,Pin.OUT) # 方法一: led.value(1) # 方法二: led.on() # 示例:2引脚输出低电频 from machine import Pin led=Pin(2,Pin.OUT) # 方法一: led.value(0) # 方法二: led.off()
延时相关知识点
导入延时模块
import time
延时三种级别
# 秒 time.sleep(1) # 毫秒 time.sleep_ms(1) # 微妙 time.sleep_us(1 )
LED灯闪烁
from machine import Pin import time led = Pin(9,Pin.OUT,value=0) while True: led.on() time.sleep(1) print("开") led.off() time.sleep(1) print("关") # D4和D5交替闪烁 from machine import Pin import time led12 = Pin(12,Pin.OUT,value=0) led13 =Pin(13,Pin.OUT,value=0) while True: led12.off() led13.on() time.sleep(1) led12.on() led13.off() time.sleep(1)
PWM相关知识点
导入PWM模块
from machine import Pin,PWM
创建PWM对象
# 参数一:引脚 # 参数二:频率 # 参数三:占空比 pwm1=PWM(Pin(2,Pin.OUT),freq=500,drty=512)
其他方法
PWM呼吸灯
from machine import Pin,PWM import time # 判断状态: # 0:1023到0 # 1:0到1023 open_off=0 pwmval=1023 pwm9=PWM(Pin(9,Pin.OUT),freq=500,duty=pwmval) while True: if open_off==0: pwmval=pwmval-1 if pwmval==0: open_off=1 else: pwmval=pwmval+1 if pwmval==1023: open_off=0 pwm9.duty(pwmval) time.sleep_ms(1)
定时器相关知识点
导入Timer模块
from machine import Timer
创建一个定时器对象
ti= Timer(-1) # -1表示使用软件定时器 # 初始化定时器(单次循环和循环定时) # 参数一:间隔 (单位毫秒) # 参数二:工作模式,单次和循环 # 参数三:回调函数 ti.init(period=200,mode=Timer.ONE_SHOT,callback=funciton1) ti.init(period=200,mode=Timer.PERIODIC,callback=funciton1)
其他函数
# 待验证 from machine import Timer tim=Timer(-1) result =0 def Service_T(tim): global reuslt result =result+1 print('当前秒数:',reuslt) tim.deinit() tim.init(period=1000,mode=Timer.PERIODIC,callback=Service_T)
DS18B20
导入模块
from machine import Pin import onewire,ds18x20,time
创建单总线对象,将其作为参数创建DS18B20对象
ow=onewire.OneWire(Pin(5)) ds=ds18x20.DS18X20(ow)
温度采集基本流程
rows=ds.scan() ds.convert_temp() time.sleep_ms(750) for row in rows: ds.read_temp(row)
网络连接相关功能
网络模块network主要针对wifi,提供网络驱动和程序配置功能,可以很方便的进行参数设置和网络连接。
导入模块
import network # WLAN类,提供了WIFI网络驱动 # 创建WLAN网络接口对象,支持两种网络接口 # 第一种:AP热点模式,作为服务器让其他WIFI客户端连接 ap=network.WLAN(network.AP_IF) # 第二种(常用):普通客户端模式,连接到WIIF热点 sta=network_WLAN(network.STA_IF)
其他方法
action() # 激活或禁用网络接口 scan() # 扫描无线网络
扫描可用WIFI名称
import network wifi = network.WLAN(network.STA_IF) wifi.active(True) scan= wifi.scan() for row in scan: print(row[0]) # # 结果: # >>> %Run -c $EDITOR_CONTENT # b'aaa' # b'\xe4\xba\x91\xe8\xae\xa1\xe7\xae\x97\xe5\xb7\xa5\xe4\xbd\x9c\xe5\xae\xa4' # b'JSJ' # b'WZXY' # b'' # b'' # b'JSJ' # b'WZXY' # b'WZXY' # b'Tineco_0269' # b'WZXY' # b'' # b'\xe5\xa4\xa7\xe6\x95\xb0\xe6\x8d\xae\xe5\xb7\xa5\xe4\xbd\x9c\xe5\xae\xa4' # b'' # b'JSJ' # b'' # b'HUAWEI-JCQ262' # b'FJXX-2.4G' # b'TP-LINK_5CE4' # b'TP-LINK_DD' # b'' # b'WZXY' # b'' # b'706' # b'WZXY' # b'TP-LINK_DD' # b'CMCC-eqh6' # >>>
AP模式和config()方法
# 设置连接WIFI热点的名称、密码、信道 ap.config(essid='名称',password="密码",channel=1) # 读取热点名称 # 例 import network ap=network.WLAN(network.AP_IF) ap.active(True) ap.config(essid='aaa', password="12345678" ) # 查询名称 print(ap.config("essid"))
STA模式和ifconfig()方法
- 实践说明
#ifconfig方法的参数:一个元组 # 元组中有四个参数分别是:ip/子网掩码、网关、dns import network sta= network.WLAN(network.STA_IF) sta.active(True) sta.ifconfig(("192.168.1.1","255.255.255.0","192.168.1.254","8.8.8.8")) # 不传参数使用该方法,则返回配置信息 print(sta.ifconfig())
接入WIFI网络
# connect(ssid,password) 方法连接网络 # disconnect() 断开网络 # isconnected() 查询网络状态
- 案例
import time,network sta = network.WLAN(network.STA_IP) sta.active(True) if not sta.isconnected(): print("正在等待网络连接") sta.connect("aaa","12345678") while not sta.isconnected(): pass print(sta.ifconfig()) time.sleep(10) sta.disconnect print("网络已断开")
Socket相关知识
- 导入模块
import socket
- 构造函数
# 三个参数 # 参数一: socket_INET/socket_INET6 # 参数二: TCP:socket.SOCK_STREAM UDP: socket.SOCK_DGRAM # 参数三:可选 socket()
- 其他方法
WIFI模块登录新大陆云平台
登录新大陆云平台
- 建立物联网项目并添加设备
- 登录云平台:http://www.nlecloud.com
- 开发者中心》新建项目》(填写项目名称和选择联网方案)下一步》(填写网关名称、设备标识和选择通信方式)点击确定添加设备》完成。
- 根据设备标识和传输密钥封装登录数据包,发送到云平台后进行登录。
- 传输数据格式
JSON键 |
JSON值 |
说明 |
消息示例 |
t |
1 |
固体数字1,代表连接请求 |
|
device |
设备标识 |
在平台上添加设备时的设备标识: 1) 新大陆网关:进入网关设置-》【参数设置】-》【系统参数】中的序列号 2) 新大陆农业网关:浏览器登录农业网关设置页面-》【设备状态】中的设备编号 3) 新大陆家居网关:进入平板的家居网关主界面,界面左上角的一行序列号 4) 其它的MCU/SOC/网关/手机等设备:可自行输入一个唯一的标识用于与平台连接 |
PF12345678 |
Key |
传输密钥 |
参考以下鉴权方式 |
|
ver |
客户端代码版本号 |
可以是自己拟定的一组客户端代码版本号值 |
V1.1 |
# device :为设备标识 # key: 为传输密钥 {"t":1,"device":"f3234242f","key":"cac7287d416b48abbca2ad6428ec26be","ver":"v0.0.0.0"}
import socket,time,network from machine import Pin # 连接WIFI print('设备上电成功',end='\n') sta = network.WLAN(network.STA_IF) ssid="aaa" password="12345678" sta.active(True) if not sta.isconnected(): print("正在进行网络连接中") sta.connect(ssid,password) while not sta.isconnected(): pass print("WIFI:",ssid,"连接成功!") print("======================") # socket 连接并发送心跳包 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("121.37.241.174","8600")) time.sleep(1) s.send(b'{"t":1,"device":"f3234242f","key":"cac7287d416b48abbca2ad6428ec26be","ver":"v0.0.0.0"}') msg = s.recv(256) print(msg) # =socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 返回结果: b'{"status":0,"t":2}\r'
- 效果图:
心跳包请求
- 心跳包是为了保持esp32_c3保持与云平台上的连接,在90秒内单片机与云平台无通信或没有心跳包时 ,云平台会自动与设备断开连接。
- 心跳请求是客户端周期性的向平台端发送心跳包,通知对方自己状态的一种机制。
- TCP协议的默认超时时间为1分钟,设备连接后,在超时期内无数据传输时,需要定期向平台端发送PING_REQ消息以保持连接,如果双方在固定1分钟时间内没有任何报文交互(包括此心跳报文),则服务端将主动关闭该连接。
import socket,time,network from machine import Pin # 连接WIFI print('设备上电成功',end='\n') sta = network.WLAN(network.STA_IF) ssid="aaa" password="12345678" sta.active(True) if not sta.isconnected(): print("正在进行网络连接中") sta.connect(ssid,password) while not sta.isconnected(): pass print("WIFI:",ssid,"连接成功!") print("======================") # socket 连接并发送心跳包 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("121.37.241.174","8600")) time.sleep(1) s.send(b'{"t":1,"device":"f3234242f","key":"cac7287d416b48abbca2ad6428ec26be","ver":"v0.0.0.0"}') msg = s.recv(256) print(msg) print("=========成功登录云平台==========") # 发送心跳包 num=0 while True: num +=1 s.send(b'$ok##') print("第",num,'次心跳包') # 解码打印 print(s.recv(256).decode('utf-8')) time.sleep(10)
- 效果图