ESP32(WeMos D1 R32)开发资料

2023-03-07,,

1.乐鑫官网

2.ESP32踩坑

  ESP32控制摇杆,定义sw的引脚时一定要设置为上拉才行。

3.ESP32入门之arduino IDE环境搭建

4.ESP32 MicroPython编程官网文档

 ESP32教程(MicroPython与arduino)

ESP-IDF 编程指南

 微信控制ESP8266操控舵机(使用MicroPython)

import network
import socket #网络套接字和python一样
from machine import Pin,PWM
import time UDP_server_addr = ('115.28.93.201', 7005) #115.28.93.201 端口:UDP 7005
SSID = your_wifi_ssid #路由器名称
PASSWORD = your_wifi_password #路由器密码
wlan = network.WLAN(network.STA_IF) UserID = your_user_ID
DeviceID = your_device_id
MM = your_mm #16位密码 servo1 = PWM(Pin(12), freq = 50)
servo1.duty(130)
servo2 = PWM(Pin(14), freq = 50)
servo2.duty(130)
time.sleep(2)
servo1.deinit()
servo2.deinit() client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #生成新的套接字对象
Heart = r"004532A01" + DeviceID + MM + r"123401hi05" #心跳包 # 连接网络
def do_connect():
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect(SSID, PASSWORD)
start = time.time()
while not wlan.isconnected():
time.sleep(1)
if time.time()-start > 5:
print("connect timeout!")
break
#如果连接成功
if wlan.isconnected():
print('network connect success . \nnetwork config:', wlan.ifconfig()) def shakeHand_UDP_server():
global client
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #生成新的套接字对象
client.settimeout(5) #设置连接超时时间
while True:
print("sendto: " + Heart)
len = client.sendto(Heart, UDP_server_addr) #向服务器发送心跳包
print("sendlen : " + str(len) )
time.sleep(0.5)
try:
print("now recv...")
data, addr = client.recvfrom(64) #接收心跳包数据
print(b"recv :" + data)
break
except:
print("recv error!")
time.sleep(10) def revMsgAndKeepConnect ():
client.settimeout(20) #设置连接超时时间
time.sleep(0.2)
try:
print("try recv data...")
data, addr = client.recvfrom(64) #从服务器接收数据
print(b"recv: " + data)
if b'open' in data:
DataFlag = data[9:13]
SendData = b'005532A01' + DeviceID + MM + DataFlag + b'09' + UserID + b'OK05'
print(b"sendto: " + SendData)
servo1.init(duty = 20)
servo2.init(duty = 20)
client.sendto(SendData, UDP_server_addr) #向服务器发送数据转为bytes
time.sleep(4)
servo1.duty(130)
servo2.duty(130)
time.sleep(1)
servo1.deinit()
servo2.deinit()
else:
pass
except:
client.sendto(Heart, UDP_server_addr) #向服务器发送心跳包
print("sendto heart:" + Heart)
if __name__=='__main__':
time.sleep(1)
do_connect()
shakeHand_UDP_server()
while True:
revMsgAndKeepConnect()

微信控制ESP8266操控舵机

 ESP32与PC端使用阿里云物联网平台通过MQTT发布订阅消息(使用MicroPython)

from umqtt.simple import MQTTClient
import usocket as socket
import time
import wifi wifi.connect() #Demo_01
ProductKey = "*********"#使用你自己的
ClientId = "1234|securemode=3,signmethod=hmacsha1|"
DeviceName = "Demo_01"
DeviceSecret = "*******************************"#使用你自己的 strBroker = ProductKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com"
Brokerport = 1883 user_name = "Demo_01&*********"#使用你自己的
user_password = "**********************************************"#使用你自己的 print("clientid:",ClientId,"\n","Broker:",strBroker,"\n","User Name:",user_name,"\n","Password:",user_password,"\n") def connect():
client = MQTTClient(client_id = ClientId,server= strBroker,port=Brokerport,user=user_name, password=user_password,keepalive=60)
#please make sure keepalive value is not 0 client.connect() temperature =25.00
while temperature < 30:
temperature += 0.5 send_mseg = '{"params": {"IndoorTemperature": %s},"method": "thing.event.property.post"}' % (temperature)
client.publish(topic="/sys/*************/Demo_01/thing/event/property/post", msg=send_mseg,qos=1, retain=False)#*号处为product id time.sleep(3) while True:
pass #client.disconnect()

ESP32 上的代码

# coding=utf-8
import datetime
import time
import hmac
import hashlib
import math try:
import paho.mqtt.client as mqtt
except ImportError:
print("MQTT client not find. Please install as follow:")
print("pip install paho-mqtt") # 设置连接信息 #Demo_02
ProductKey = "*********"#使用你自己的
ClientId = "2234" # 自定义clientId
DeviceName = "Demo_02"
DeviceSecret ="************************************8**"#使用你自己的 # 获取时间戳(当前时间毫秒值)
us = math.modf(time.time())[0]
ms = int(round(us * 1000))
timestamp = str(ms) # 计算密码(签名值)
def calculation_sign(signmethod):
data = "".join(("clientId", ClientId, "deviceName", DeviceName,
"productKey", ProductKey, "timestamp", timestamp)) if "hmacsha1" == signmethod:
# ret = hmac.new(bytes(DeviceSecret),
# bytes(data), hashlib.sha1).hexdigest()
ret = hmac.new(bytes(DeviceSecret, encoding="utf-8"),
bytes(data, encoding="utf-8"),
hashlib.sha1).hexdigest()
elif "hmacmd5" == signmethod:
# ret = hmac.new(bytes(DeviceSecret, encoding="utf-8"),
# bytes(data, encoding="utf-8"), hashlib.md5).hexdigest()
ret = hmac.new(bytes(DeviceSecret, encoding="utf-8"),
bytes(data, encoding="utf-8"),
hashlib.md5).hexdigest()
else:
raise ValueError
return ret # ====================================================== strBroker = ProductKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com"
port = 1883 client_id = "".join((ClientId,
"|securemode=3",
",signmethod=", "hmacsha1",
",timestamp=", timestamp,
"|"))
username = "".join((DeviceName, "&", ProductKey))
password = calculation_sign("hmacsha1") print("="*60)
print(strBroker)
print("client_id:", client_id)
print("username:", username)
print("password:", password)
print("="*60) # 成功连接后的操作
def on_connect(client, userdata, flags, rc):
print("OnConnetc, rc: " + str(rc)) # 成功发布消息的操作
def on_publish(client, msg, rc):
if rc == 0:
print("publish success, msg = " + msg) # 成功订阅消息的操作
def on_subscribe(mqttc, obj, mid, granted_qos):
print("Subscribed: " + str(mid) + " " + str(granted_qos)) def on_log(mqttc, obj, level, string):
print("Log:" + string) def on_message(mqttc, obj, msg):
curtime = datetime.datetime.now()
strcurtime = curtime.strftime("%Y-%m-%d %H:%M:%S")
print(strcurtime + ": " + msg.topic + " " + str(msg.qos) + " " + str(msg.payload))
on_exec(str(msg.payload)) def on_exec(strcmd):
print("Exec:", strcmd)
strExec = strcmd if __name__ == '__main__':
mqttc = mqtt.Client(client_id)
mqttc.username_pw_set(username, password)
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subscribe
mqttc.on_log = on_log
mqttc.connect(strBroker, port, 120)
# mqttc.loop_start()
time.sleep(1)
temperature =27.55
mqttc.subscribe("/sys/************/Demo_02/thing/service/property/set", qos=1) # 换成自己的
#send_mseg = '{"pm_25": %s,"area":"%s","time":"%s"}' % (0, 0, datetime.datetime.now())
#send_mseg = '{"id": "1234", "version": "1.0","params": {"IndoorTemperature": %s},"method": "thing.event.property.post"}'%(temperature)
send_mseg = '{"params": {"IndoorTemperature": %s},"method": "thing.event.property.post"}' % (temperature) print('send_mseg is : ',send_mseg) mqttc.loop_forever()

PC端python代码

5.ESP32红外遥控器

6.APP控制ESP32

  点灯blinker app:

    点灯blinker官方microPython支持文档

    使用Thonny上传blinker依赖包到ESP32板中

    三分钟实现手机控制Arduino/esp8266/esp32

  Blynk app:

    Blynk app

    Blynk ESP32 WiFi示例

7.微信公众号控制ESP32

  微信硬件平台

  微信公众平台测试版

  微信小程序控制ESP8266(可远程)

  在微信小程序上ble蓝牙配网esp32,blufi

  使用MicroPython开发ESP32(04):无线网络使用和WebREPL

  使用python + 阿里云搭建一套最简单的物联系统

  ESP32教程大全:http://mc.dfrobot.com.cn/thread-271930-1-1.html

  微信控制ESP8266 LED

  微信公众号物联网直连控制LED灯(不需要自己搭建服务器)

成果:

7.1微信公众号控制LED(缺点:所有人修改同一个文件,不适合多人使用)

  第一步:在阿里云或其他云买服务器和域名,服务器开启8888 20 443 22等端口,然后上传weixin库到根目录

  第二步:申请公众号(这里可以使用微信公众平台测试账号)并开启设备功能然后绑定服务器接口(URL填写weixin库的index.php的位置,这里我填的是http://www.cnblogs.xyz/weixin/index.php,  token填写index.php文件中token的值,这里我填的是weixin)

  第三步:上载urequests.py库(文件中已上传)到ESP32开发板中,示例代码也可以另存到ESP32开发板中;然后插上传感器,运行代码,打开公众号发送‘on’或‘off’来控制红灯亮灭。

# 说明:微信公众号控制LED
# 使用ESP32 micropython API中提供的库来创建web服务器
try:
import usocket as socket
except:
import socket from machine import Pin
import network # 使用ESP32 micropython API中提供的network库来建立网络连接
import urequests import esp
esp.osdebug(None) import gc
gc.collect() # 清理内存 # wifi名称及密码
ssid = 'TP-LINK_ZLTech'
password = 'zhonglingkeji' # 把wifi模式设置为STA模式,连接路由器模式并激活
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password) while station.isconnected() == False: # 判断wifi连接是否成功
pass print('Connection successful')
print(station.ifconfig()) # 显示IP地址 led = Pin(26, Pin.OUT) try:
while True:
res = urequests.get('http://www.cnblogs.xyz/weixin/1.txt').text
# print(res)
if res == 'on' or res == 'ON':
print('LED ON')
led.value(1)
if res == 'off' or res == 'OFF':
print('LED OFF')
led.value(0)
print()
finally:
print('Connection closed')

微信公众号控制LED示例代码

  注意:坑1:使用过另一个urequests.py库,不过在ESP32发送请求时会每隔一段时间报错一次OSError23,不好用。

ESP32(WeMos D1 R32)开发资料的相关教程结束。

《ESP32(WeMos D1 R32)开发资料.doc》

下载本文的Word格式文档,以方便收藏与打印。