- 2023-11-15
-
回复了主题帖:
【得捷电子Follow me第2期】空气质量传感器和网络控制led显示展示
lansebuluo 发表于 2023-11-15 08:44
能不能交替显示
网络控制的字体可以变大,空气质量显示的字体其实已经挺极限了,屏幕就这么高,要显示5 ...
可以的,按你说的最简单其实是所有数据滚动显示,就跟边上的led一样
- 2023-11-14
-
回复了主题帖:
【得捷电子Follow me第2期】空气质量传感器和网络控制led显示展示
lansebuluo 发表于 2023-11-14 18:19
空气质量传感器和网络控制led显示,字体好小啊,能不能放大一些
网络控制的字体可以变大,空气质量显示的字体其实已经挺极限了,屏幕就这么高,要显示5行
-
回复了主题帖:
【得捷电子Follow me第2期】空气质量传感器和网络控制led显示展示
秦天qintian0303 发表于 2023-11-14 16:55
这个全彩点阵屏挺不错啊,特意做的吗?
Adafruit官方的,板子叫dotstar wing,用的是apa102灯珠,理论通信速度高于ws2812
-
加入了学习《【得捷电子Follow me第2期】空气质量传感器与基于wifi的led控制系统》,观看 基于Adafruit esp32s3 tft feather的空气质量传感器与基于wifi的led控制系统
-
发表了主题帖:
【得捷电子Follow me第2期】空气质量传感器和网络控制led显示展示
本帖最后由 Lucheni 于 2023-11-14 16:43 编辑
本帖子为Follow me第二期最终的作业提交展示,共完成了两个项目
①空气质量传感器
②基于板载按键和网页按键的rgb led控制系统
具体项目展示可参考视频:http://training.eeworld.com.cn/video/38390?md5__2280=eqRxy7GQeiu49DBqDTClYOi%3Dq0Qweq%2Bex&alichlgref=http%3A%2F%2Ftraining.eeworld.com.cn%2Fcourse%2F68227
空气质量传感器项目介绍及关键代码说明:
此项目使用Adafruit ESP32-S3 TFT Feather板卡连接了SGP40和SCD41传感器,这两颗传感器可以分别测量voc、温度、湿度以及真实二氧化碳数值,开发板板载有iic接口,同时还有一块TFT彩屏,非常适合用来进行传感器的链接以及数据显示,所以本项目基于这三个部分搭建了空气质量传感器的demo
代码采用arduino编写,各个模块初始化、数据读取以及显示刷新都被我封装为函数,在setup及loop函数中直接进行调用,个人认为可阅读性还是非常高的
以下是传感器数据读取函数,其中要注意的是sgp40内部计算voc时需要将scd41获取的温湿度数据传入
void ScdRead(uint16_t &co2, float &temperature, float &humidity){
bool isDataReady = false;
uint16_t error;
error = scd4x.getDataReadyFlag(isDataReady);
if (isDataReady) {
delay(10);
error = scd4x.readMeasurement(co2, temperature, humidity);
if (error) {
Serial.print("Error trying to execute readMeasurement(): ");
errorToString(error, errorMessage, 256);
Serial.println(errorMessage);
} else if (co2 == 0) {
Serial.println("Invalid sample detected, skipping.");
}
}
}
void SgpRead(uint16_t &sraw, int32_t &voc_index, float &temperature, float &humidity){
sraw = sgp.measureRaw(temperature, humidity);
voc_index = sgp.measureVocIndex(temperature, humidity);
}
以下为tft刷新函数,每次仅局部刷新数据部分显示块
void TftRefresh() {
// tft print function!
tft.fillRect(60, 0, 60, 135, ST77XX_BLACK);
tft.setCursor(60, 10);
tft.setTextColor(ST77XX_RED);
tft.setTextSize(2);
tft.println(temperature);
tft.setCursor(60, 35);
tft.setTextColor(ST77XX_YELLOW);
tft.setTextSize(2);
tft.println(humidity);
tft.setCursor(60, 60);
tft.setTextColor(ST77XX_GREEN);
tft.setTextSize(2);
tft.println("null");
tft.setCursor(60, 85);
tft.setTextColor(ST77XX_BLUE);
tft.setTextSize(2);
tft.println(co2);
tft.setCursor(60, 110);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(2);
tft.println(voc_index);
}
tft端的数据采用中文显示,本代码将中文字转为位图,调用drawbitmap函数进行处理(处理方法可以看之前发的速通教程http://bbs.eeworld.com.cn/thread-1254565-1-1.html):
const uint8_t PROGMEM str1[]= {0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00};/*"温",1*/
const uint8_t PROGMEM str2[]= {0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E};/*"度",1*/
const uint8_t PROGMEM str3[]= {0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00};/*"湿",0*/
const uint8_t PROGMEM str4[]= {0x10,0x00,0x10,0x00,0x3F,0xFC,0x20,0x00,0x4F,0xF0,0x80,0x00,0x3F,0xF0,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x0A,0x00,0x0A,0x00,0x06,0x00,0x02};/*"气",0*/
const uint8_t PROGMEM str5[]= {0x00,0x00,0x3F,0xFE,0x20,0x00,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x2F,0xFC,0x20,0x80,0x20,0x80,0x20,0x90,0x20,0x88,0x20,0x88,0x40,0x80,0x5F,0xFE,0x80,0x00};/*"压",1*/
本项目实际完成了任务一在屏幕上显示中文的要求
基于板载按键和网页按键的rgb led控制系统介绍及关键代码说明:
本项目实现了板载按键控制板载led颜色变化,网页按键控制外接led阵列显示内容的效果。
loop函数轮询按键是否被按下,若按下则板载led开始变色(这里可以优化为按键中断,不过目前项目轮询也可以就没有修改)
if (!digitalRead(0)) {
TB.setColor(TB.Wheel(j++));
}
同时loop函数轮询esp32生成网页页面中的按键是否被按下,若按下则修改标志位
WiFiClient client = server.available();
if (client) { // if you get a client,
Serial.println("New Client."); // print a message out the serial port
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected()) { // loop while the client's connected
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
if (c == '\n') { // if the byte is a newline character
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
// and a content-type so the client knows what's coming, then a blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
// the content of the HTTP response follows the header:
client.print("Click <a href=\"/H\">here</a> to move LED.<br>");
client.print("Click <a href=\"/L\">here</a> to stop LED.<br>");
// The HTTP response ends with another blank line:
client.println();
// break out of the while loop:
break;
} else { // if you got a newline, then clear currentLine:
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
// Check to see if the client request was "GET /H" or "GET /L":
if (currentLine.endsWith("GET /H")) {
go=1; // GET /H turns the LED on
}
if (currentLine.endsWith("GET /L")) {
go=0; // GET /L turns the LED off
}
}
最后根据标志位和当前时间判断是否对外接led阵列上显示内容进行滑动
if ((((t=millis()%65536)-ledprevtime)>SHIFTDELAY)&&(go==1)){
matrix.fillScreen(0);
matrix.setCursor(x, 5);
for (byte i = 0; i < strlen(adafruit); i++) {
// set the color
matrix.setTextColor(adaColors[i]);
// write the letter
matrix.print(adafruit[i]);
}
if (--x < -50) {
x = matrix.width();
}
matrix.show();
ledprevtime = millis()%65536;
}
本项目实际完成了任务二、任务三以及任务四的分任务二,实现了wifi生成网页和控制,板载按键的使用,板载rgb led使用,外接6*12led阵列的使用四个小项目
以上项目代码可以在这里找到:http://download.eeworld.com.cn/detail/Lucheni/629865
总结:
本次活动研究了基于esp32s3的wifi控制,led控制,传感器数据读取及中文显示,收获还是很多的,当然我个人最喜欢的还是这次活动的开发板,在小巧的feather版型上放下了tft彩屏,还板载电量计以及预留了温湿度传感器的焊接接口,双面布局,对于开发板而言是非常精致了,期待以后的活动能玩到更多更好的板子!
- 2023-11-13
-
上传了资料:
得捷电子Follow me第2期 lucheni项目代码
- 2023-10-31
-
加入了学习《Digi-Key: Follow Me 系列(2) 直播回放》,观看 Adafruit ESP32-S3 TFT Feather开发板使用入门
- 2023-08-31
-
回复了主题帖:
【得捷电子Follow me第2期】任务1:控制屏幕显示中文
jobszheng5 发表于 2023-8-31 09:43
现在商家的套路也很明显啊!
这一拖,不仅赚了钱,还省去了维修费了
话说:CircuitPython ...
你可以理解为MicroPython的变种
- 2023-08-29
-
发表了主题帖:
【得捷电子Follow me第2期】Arduino速通教程
本帖最后由 Lucheni 于 2023-8-29 14:41 编辑
本教程基于Adafruit 5693 ESP32-S3 Reverse TFT Feather(后简称Reverse板),与活动开发板Adafruit 5483 ESP32-S3 TFT Feather非常类似,但可能有细微电路差别,仅作为Arduino环境下的快速上手教程,具体使用请查阅Adafruit官方教程:Overview | Adafruit ESP32-S3 TFT Feather | Adafruit Learning System 若英文阅读有困难,推荐edge浏览器打开后使用自带翻译功能
本教程为速通教程,追求的是最快速地完成所有分支任务,并不适合想要刨根问底学习的开发者,若想要学习驱动原理或代码逻辑,请仔细阅读Adafruit官方教程
上手第一步:熟悉开发板
出厂Demo
拿到开发板的第一步可以使用Type-C数据线供电,此时开发板应如图显示,第一行为开发板名称(红色),第二行为例程名称(黄色),第三行为电量信息(绿色),usb供电下电量信息可能会显示超过100%,这是正常现象,第四行为板卡连接的I2C设备地址(蓝色),此板卡到货状态应该只焊接了MAX17048电池监视器,此传感器通信地址为0x36,此时屏幕上显示内容应为I2C:0x36
出厂例程Adafruit应该是基于Arduino环境编写的,官方也开放了Reverse板的出厂Demo代码:Factory Shipped Demo | Adafruit ESP32-S3 Reverse TFT Feather | Adafruit Learning System
清除老旧库文件
Arduino环境开发很容易出现硬件库冲突的情况,比如同事安装了tft_espi显示库和Adafruit官方显示库,编译过程中就有可能报错,所以建议先清除之前Arduino已安装的库文件,或将他们备份到另一个文件夹里,待本项目开发完毕后再恢复。
各人Arduino软件安装流程不同,库文件保存地址也不同,本例程参考默认保存地址为C:\Users\Lucheni\Documents\Arduino,库文件在此地址下的libraries文件夹下,建议备份后清空此文件夹。
安装相关库文件
此时可以安装Adafruit为此开发板相关硬件所设计的库文件,Arduino下安装库文件方式为工具-管理库
在搜索栏输入你想要的库文件,依次安装Adafruit MAX1704X,Adafruit ST7735 and ST7789 Library,安装过程中可能会询问是否安装所有依赖库,点击安装所有。
任务一:控制屏幕显示中文
屏幕显示测试
既然要显示中文,我们首先进行屏幕显示的测试,测试例程为文件-示例-Adafruit ST7735 and ST7789 Library-graphicstest_feather_esp32s2_tft
打开例程,选择开发板和串口号后就可以上传,此时开发板屏幕即开始显示测试,会显示不同尺寸、颜色的字符并显示不同的图形,以及最后的屏幕翻转显示。简单浏览代码可以发现Adafruit将繁杂的显示任务抽象为了简单的draw函数,显示文字为drawtext,显示像素为drawPixel,以及线以及各种形状的显示:drawFastHLine、drawFastVLine、drawCircle、drawTriangle。这些显示函数本次速通并不会使用,若想学习用法,请参考Adafruit官方教程:Graphics Primitives | Adafruit GFX Graphics Library | Adafruit Learning System
显示中文
对于速通教程来说,显示中文虽然是第一个任务,但可能是最难的任务,因为其他的任务都有Adafruit官方硬件库支持,而官方显示库仅能显示英文,中文显示需要自己一点点办法
对于常规的开发来说,显示中文的正常开发逻辑是先用第三方软件生成中文字库,之后导入到已有的显示库中,再逐一显示。但基于速通的目的,本教程采用了一点偷懒的办法~
由于任务1要求仅为显示中文,所以我个人认为在只需要显示几个中文字符的需求下,以位图显示中文相对简单直接,故本次速通教程将使用官方教程末尾的一个函数:drawBitmap。
生成中文字
本次生成中文字使用软件为正点原子开发板资料里的PCtoLCD2002,实际网上还有大量类似软件,Adafruit官方也推荐了位图-内存图的网页工具image2cpp (javl.github.io)
本速通教程仅显示四个中文汉字:中文显示
首先打开软件的设置菜单,对生成的格式进行设置,本次设置格式为:阴码、逐行式、C51格式
其他相关设置可以自己尝试,本次教程追求速通就不赘述了
选择确定,回到初始页面,在输入行输入本次需要显示的四个中文字符:中文显示(步骤①)
点击生成子模(步骤②)后下方即为本次需要使用的字符数据(步骤③)
按照教程使用PROGMEM指令将字符数据保存于内存中,再使用drawBitmap命令显示(drawBitmap函数6个参数分别为显示位置x,y,数据地址,位图宽度,位图高度,显示颜色)即可。
参考代码:
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
// Use dedicated hardware SPI pins
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
const uint8_t PROGMEM str1[]= {此处字符请按需自行生成!};
const uint8_t PROGMEM str2[]= {此处字符请按需自行生成!};
const uint8_t PROGMEM str3[]= {此处字符请按需自行生成!};
const uint8_t PROGMEM str4[]= {此处字符请按需自行生成!};
void setup(void) {
Serial.begin(9600);
delay(500);
Serial.print(F("Hello! Feather TFT Test"));
// turn on backlite
pinMode(TFT_BACKLITE, OUTPUT);
digitalWrite(TFT_BACKLITE, HIGH);
// turn on the TFT / I2C power supply
pinMode(TFT_I2C_POWER, OUTPUT);
digitalWrite(TFT_I2C_POWER, HIGH);
delay(10);
// initialize TFT
tft.init(135, 240); // Init ST7789 240x135
tft.setRotation(1);
tft.fillScreen(ST77XX_BLACK);
Serial.println(F("Initialized"));
uint16_t time = millis();
tft.fillScreen(ST77XX_BLACK);
time = millis() - time;
Serial.println(time, DEC);
delay(500);
// large block of text
tft.fillScreen(ST77XX_BLACK);
// tft print function!
tft.drawBitmap(0, 0, str1, 16, 16, ST77XX_WHITE);
tft.drawBitmap(16, 0, str2, 16, 16, ST77XX_WHITE);
tft.drawBitmap(32, 0, str3, 16, 16, ST77XX_WHITE);
tft.drawBitmap(48, 0, str4, 16, 16, ST77XX_WHITE);
Serial.println("done");
delay(1000);
}
void loop() {
tft.invertDisplay(true);
delay(500);
tft.invertDisplay(false);
delay(500);
}
显示效果如下(loop中加入了翻转显示,实际为底色和字符黑白交替显示):
任务二:网络功能使用
此任务可直接使用官方例程:示例-WiFi-WiFiAccessPoint
从注释可知本例程使用方式:
WiFiAccessPoint.ino创建一个WiFi接入点,并在其上提供一个网络服务器。
步骤:
1.连接到接入点“yourAp”
2.将您的网络浏览器指向http://192.168.4.1/H打开LED或http://192.168.4.1/L把它关掉或在PuTTY终端上运行原始TCP“GET/H”和“GET/L”,IP地址为192.168.4.1,端口为80
注意!!!!!!请按需修改ssid及password,例程的LED管脚并不是活动板卡的LED管脚,请自行修改,LED管脚号请参考官方例程:Pinouts | Adafruit ESP32-S3 TFT Feather | Adafruit Learning System
任务三:控制WS2812B
此任务可以直接从factory_test源码修改完成,以下仅展示LED显示关键代码
void setup() {
TB.neopixelPin = PIN_NEOPIXEL;//板卡连接WS2812B引脚号
TB.neopixelNum = 1; //板卡连接WS2812B数量
TB.begin();
TB.setColor(WHITE);//设置LED为白色
}
void loop() {
TB.setColor(TB.Wheel(j++));//LED颜色循环显示
delay(10);
return;
}
任务四:WS2812B效果控制
既然为速通教程,我选择了最易实现的分任务2,使用Adafruit官方的https://www.adafruit.com/product/3449,直接使用官方例程示例-Adafruit_DotStarMatrix-dotstar_wing(记得修改例程中的开发板型号,否则需要重新烧写固件!)
简单修改显示内容后即可显示自己想要的内容:
此任务若追求速度,也可选择分任务4,使用Adafruit的音乐播放器模块:https://www.adafruit.com/product/3357,Adafruit也有基于此模块的详细例程,能很快上手。
- 2023-08-28
-
回复了主题帖:
【得捷电子Follow me第2期】CircuitPython入门到完成任务1-5详细教程
ttxiaotaoge 发表于 2023-8-24 16:35
这个没有,我没买那些设备
Adafruit有music maker模块的,资料例程也都有,去官网搜下看下资料然后国内找类似的就行