【得捷电子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.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
-
- pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
-
- 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)
-
- 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)
-
- pixel.fill((255,0,0))
-
- 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.mode(WIFI_STA);
-
-
- 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;
-
-
- uint8_t broadcastAddress[] = {0xE8, 0x9F, 0x6D, 0x08, 0xC6, 0x58};
-
-
-
- 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.mode(WIFI_STA);
-
-
- 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;
-
- 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;
-
-
- 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下载中心
|