- 2024-04-09
-
回复了主题帖:
矿卡|T9+入门使用
T9+
- 2023-11-21
-
回复了主题帖:
【得捷电子Follow me第2期】全任务汇总
Jacktang 发表于 2023-11-15 07:47
WS2812B效果控制,用板载boot按键切换颜色。也可以用无线按键切换颜色与亮度这个也可以试试的
可以的,无线控制部分是独立的。
- 2023-11-14
-
发表了主题帖:
【得捷电子Follow me第2期】全任务汇总
很高兴能参加EEWORL电子工程世界与DigKey得捷电子合作的Follow me 第2期活动,让我有幸体验Adafruit ESP32-S3 TFT Feather开发板。Adafruit官方为这个开发板创作了许多的官方教程,非常利于初自学者学习。我在这些教程与大家的指导下完成了此次任务
//内容一:3-5分钟短视频//
【得捷电子Follow me第2期】任务演示视频-EEWORLD大学堂
//内容二: 任务/项目总结报告//
我在初期尝试使用VScode+ CircuitPython插件,但是cpy插件经常会莫名报错索性改用Thonny完成开发。
本次任务一共使用了三个开发板,其中两个用于无线遥控的发射与接收。远程控制主开发板。
任务1:控制屏幕显示中文
项目介绍:完成屏幕的控制,并且能显示中文
在这个任务中我遇到最困难的步骤就是制作字体的部分,最初我尝试直接将ttf字体转化为bdf文件,但它的体积太大了无法放入开发板内存之中。其次我尝试再通过bdftopcf font converter (adafruit.github.io)将其转化为pcf文件减小体积,但其大小依旧比开发板可用内存大无法放入。
在跟着做的直播中乔帮主@乔楚HonestQiao 介绍了利用FontForge精简字库的方法。经过一些波折我最终也完成了小体积字库的制作。
在字库完成后这个任务就很简单了,引入bitmap_font库调用函数就可以轻松完成汉字的显示。
import board
import displayio
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
# 初始化屏幕
display = board.DISPLAY
#设置屏幕亮度
board.DISPLAY.brightness = 0.6
# 创建显示组
text_group = displayio.Group()
#字体 内容 颜色 位置 行距 大小
text_area = label.Label(bitmap_font.load_font("font\jf-openhuninn-2.0-21.bdf"), text="天上有月 \n\n地下開fan",color=0xC94737,x=20,y=35,line_spacing=0.7,scale=2)
#将文字放入显示组
text_group.append(text_area)
#输出显示组内容
display.show(text_group)
#死循环,一直显示的汉字
while True:
pass
任务2:网络功能使用
项目介绍:完成网络功能的使用,能够创建热点和连接到WiFi
这个任务可以说是其中最简单的任务了
创建热点
直接引入WiFi库调用函数两行代码即可完成
import wifi
#创建WiFi热点
wifi.radio.start_ap("WiFi_Mista", "44444444")
连接到WiFi
直接修改配置文件settings.toml 即可完成
打开settings.toml文件添加
CIRCUITPY_WIFI_SSID = "这里填WiFi名"
CIRCUITPY_WIFI_PASSWORD = "这里填WiFi密码"
两行代码并写入自己的WiFi名与密码保存后重启即可自动连接至WiFi并显示ip地址。
CIRCUITPY_WIFI_SSID = "这里填WiFi名"
CIRCUITPY_WIFI_PASSWORD = "这里填WiFi密码"
任务3:控制WS2812B
项目介绍:使用按键控制板载Neopixel LED的显示和颜色切换
使用这个开发板搭配cpy驱动WS2812B也是十分轻松的,官方的示例中提供了NeoPixel LED的示例demo。只需结合教程中之前的数字输入即可完成这个任务
import time
import board
import digitalio
import neopixel
#配置Neopixel灯
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
#设置Neopixel亮度
pixel.brightness = 0.1
# 配置按键
key = digitalio.DigitalInOut(board.BUTTON)
key.switch_to_input(pull=digitalio.Pull.UP)
while True:
#当按下按钮时对颜色进行设置
if not key.value:
#消抖
time.sleep(0.2)
pixel.fill((255, 0, 0))
time.sleep(0.5)
if not key.value:
pixel.fill((0, 255, 0))
time.sleep(0.5)
if not key.value:
pixel.fill((0, 0, 255))
time.sleep(0.5)
任务4:WS2812B效果控制
项目介绍:完成一个Neopixel(12灯珠或以上)控制器,通过按键和屏幕切换展示效果
我为这个任务制作了两个4*4的小型WS2812B的灯板,将它们插在了面包板上使用。直接使用usb引脚的5v vbus进行供电
软件部分有了任务一的屏幕操作与任务三的控制WS2812B的基础,又新学习引入了display_shapes库进行图形的绘制,文字没有使用任务一自制的字库而是使用了内置字库。同时更改了led灯颜色的控制模式了。
控制部分,可以用板载boot按键切换颜色。也可以用无线按键切换颜色与亮度。
import time
import board
import neopixel
import displayio
import digitalio,terminalio
from adafruit_display_text import label
from adafruit_display_shapes.circle import Circle
# 初始化屏幕
display = board.DISPLAY
#设置屏幕亮度
board.DISPLAY.brightness = 0.6
# 创建显示组
shape_group = displayio.Group()
# 配置按键
key = digitalio.DigitalInOut(board.BUTTON)
key.switch_to_input(pull=digitalio.Pull.UP)
key1 = digitalio.DigitalInOut(board.D5)
key1.switch_to_input(pull=digitalio.Pull.UP)
key2 = digitalio.DigitalInOut(board.A0)
key2.switch_to_input(pull=digitalio.Pull.UP)
#配置Neopixel灯
pixel = neopixel.NeoPixel(board.D6, 32)
#创建两个变量
a = 0
b = 1
#输出到屏幕的信息
text = label.Label(terminalio.FONT, text="Press Red \nChange color",color=0xff0000,x=0,y=20,scale=2)
text1 = label.Label(terminalio.FONT, text="Press Green \nChange btightness",color=0x00ff00,x=0,y=90,scale=2)
text2 = label.Label(terminalio.FONT, text="The Color",color=0xffffff,x=130,y=10,scale=2)
shape_group.append(text)
shape_group.append(text1)
shape_group.append(text2)
display.show(shape_group)
while True:
#颜色控制
if key.value == 0 or key1.value == 0:
#消抖
time.sleep(0.2)
a = a + 1
if (a >= 3):
a = 0
#亮度控制
if key2.value == 0:
time.sleep(0.2)
b = b + 1
if (b >= 11):
b = 1
if a == 0:
#更新需要改变的信息
circle = Circle(x0=200, y0=60, r=30, fill=0xff0000, outline=0xffffff)
shape_group.append(circle)
display.show(shape_group)
#设置Neopixel颜色
pixel.fill((255,0,0))
#设置Neopixel亮度
pixel.brightness = b/10
if a == 1:
circle = Circle(x0=200, y0=60, r=30, fill=0x00ff00, outline=0xFFffFF)
shape_group.append(circle)
display.show(shape_group)
pixel.fill((0,255,0))
pixel.brightness = b/10
if a == 2:
circle = Circle(x0=200, y0=60, r=30, fill=0x0000ff, outline=0xFFffFF)
shape_group.append(circle)
display.show(shape_group)
pixel.fill((0,0,255))
pixel.brightness = b/10
无线遥控部分
接收部分代码
开发板: M5STAMP PICO MATE
使用Arduino
#include <esp_now.h>
#include <WiFi.h>
#include <Arduino.h>
int RED = 18;
int GREN = 19;
int q = 0;
int w = 0;
// 创建一个结构体接收数据
typedef struct struct_message {
int a;
int b;
} struct_message;
// 创建一个结构体变量
struct_message myData;
// 回调函数,当收到消息时会调佣该函数
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Bytes received: ");
Serial.println(len);
Serial.print("RED: ");
Serial.println(myData.a);
Serial.print("GREN: ");
Serial.println(myData.b);
Serial.println();
}
void setup() {
// 初始化串口波特率
Serial.begin(115200);
// 设置wifi模式
WiFi.mode(WIFI_STA);
// 初始化esp-now
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
//注册接收信息的回调函数
esp_now_register_recv_cb(OnDataRecv);
pinMode(RED, OUTPUT);
pinMode(GREN, OUTPUT);
}
void loop() {
q = myData.a;
w = myData.b;
if(q == 1)
digitalWrite(RED, LOW);
else
digitalWrite(RED,HIGH );
if(w == 1)
digitalWrite(GREN, LOW);
else
digitalWrite(GREN, HIGH);
delay(250);
}
发送部分代码
开发板: SEEED STUDIO XIAO ESP32C3
使用Arduino
#include <esp_now.h>
#include <WiFi.h>
#include <Arduino.h>
int RED = D3;
int GREN = D4;
// 接收端的MAC地址
uint8_t broadcastAddress[] = {0xE8, 0x9F, 0x6D, 0x08, 0xC6, 0x58};//M5Stamp
//uint8_t broadcastAddress[] = {0x34, 0x85, 0x18, 0x05, 0xCD, 0x44};//XIAO C3
// 发送结构体类型
typedef struct struct_message {
int a;
int b;
} struct_message;
// 创建一个结构体变量
struct_message myData;
// 回调函数,函数将在发送消息时执行。此函数告诉我们信息是否成功发送;
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
Serial.print("\r\nLast Packet Send Status:\t");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
void setup() {
// 初始化串口波特率
Serial.begin(115200);
// 设置WIFI模式为STA模式,即无线终端
WiFi.mode(WIFI_STA);
// 初始化ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
//注册回调函数
esp_now_register_send_cb(OnDataSent);
// 注册通信频道
esp_now_peer_info_t peerInfo;
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0; //通道
peerInfo.encrypt = false;//是否加密为False
if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Failed to add peer");
return;
}
pinMode(RED,INPUT_PULLUP);
pinMode(GREN,INPUT_PULLUP);
}
void loop()
{
//设置要发送的值
if(digitalRead(RED) == 0)
{
myData.a = 1;
}
else myData.a = 0;
if(digitalRead(GREN) == 0)
{
myData.b = 1;
}
else myData.b = 0;
//发送信息到指定ESP32上
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
//判断是否发送成功
if (result == ESP_OK) {
Serial.println("Sent with success");
}
else {
Serial.println("Error sending the data");
}
delay(250);
}
对本活动的心得体会(包括意见或建议)
这次活动是我第一次接触200+的开发板,也是我第一次使用python(CPY)编程 。不得不说adafruit丰富的资料使得学习难度降低了很多。对于穷学生来说这种体验真的很难得,希望下次还能有机会参与。
意见和建议嘛,希望之后的活动能准备充足的库存吧ψ(`∇´)ψ
//内容三:可编译下载的代码//
全部代码:Follow me第2期全部任务代码-嵌入式开发相关资料下载-EEWORLD下载中心
更改后的任务四:更改后的Follow me第2期第四任务-嵌入式开发相关资料下载-EEWORLD下载中心
-
加入了学习《Follow me第二期任务展示视频》,观看 Follow me第二期任务展示视频
- 2023-11-13
-
加入了学习《基于Adafruit ESP32-S3 TFT Feather的网络应用开发实践》,观看 基于Adafruit ESP32-S3 TFT Feather的网络应用开发实践
-
上传了资料:
更改后的Follow me第2期第四任务
- 2023-11-11
-
上传了资料:
Follow me第2期全部任务代码
-
上传了资料:
Follow me第2期四个任务代码
- 2023-11-02
-
加入了学习《【得捷电子Follow me第2期】任务提交 》,观看 【得捷电子Follow me第2期】任务提交