589|2

4

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子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

 这个任务可以说是其中最简单的任务了

  1. 创建热点

直接引入WiFi库调用函数两行代码即可完成

import wifi
#创建WiFi热点
wifi.radio.start_ap("WiFi_Mista", "44444444")
  1. 连接到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下载中心

最新回复

WS2812B效果控制,用板载boot按键切换颜色。也可以用无线按键切换颜色与亮度这个也可以试试的   详情 回复 发表于 2023-11-15 07:47
点赞 关注
 
 

回复
举报

6861

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

WS2812B效果控制,用板载boot按键切换颜色。也可以用无线按键切换颜色与亮度这个也可以试试的

点评

可以的,无线控制部分是独立的。  详情 回复 发表于 2023-11-21 15:39
 
 
 

回复

4

帖子

3

TA的资源

一粒金砂(中级)

板凳
 
Jacktang 发表于 2023-11-15 07:47 WS2812B效果控制,用板载boot按键切换颜色。也可以用无线按键切换颜色与亮度这个也可以试试的

可以的,无线控制部分是独立的。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表