FireBeetle 2 ESP32-S3 测试1--连接透明显示屏、测试摄像头
本帖最后由 Anders项勇 于 2023-9-6 23:24 编辑这次幸运抽取到试用FireBeetle 2 ESP32-S3,先测试其基本功能:
1.arduino环境:
arduino先安装ESP32-S3板子,但是连接国外网络原因,经常安装经常容易失败,可以按后面这个方法安装会快很多https://arduino.me/a/esp32
2.连接摄像头、1.51”透明单色OLED显示屏:
这么小的板子能同时连接摄像头和显示屏是不错的,头一次用1.51”透明单色OLED显示屏,显示效果不错。屏幕要安装U8g2_Arduino库文件。
测试当中有时会碰到“上传失败: 上传错误:exit status 2”,只要按下boot键,然后再重新上传就好了。有时刷程序报端口错误,看设备管理器里面端口一下接通一下不通,比较奇怪,换一根数据线好了,然后在换回原来数据线又好了,不知道何原因。
案例测试代码:/*!
* @file Cube.ino
* @brief Rotating 3D stereoscopic graphics
* @n This is a simple rotating tetrahexon
*
* @copyrightCopyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @licence The MIT License (MIT)
* @author (Ivey.lu@dfrobot.com)
* @maintainer (feng.yang@dfrobot.com)
* @versionV1.0
* @maintainer (feng.yang@dfrobot.com)
* @versionV1.0
* @date2019-10-15
* @url https://github.com/DFRobot/U8g2_Arduino
*/
#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
/*
* Display hardware IIC interface constructor
*@param rotation:U8G2_R0 Not rotate, horizontally, draw direction from left to right
U8G2_R1 Rotate clockwise 90 degrees, drawing direction from top to bottom
U8G2_R2 Rotate 180 degrees clockwise, drawing in right-to-left directions
U8G2_R3 Rotate clockwise 270 degrees, drawing direction from bottom to top
U8G2_MIRROR Normal display of mirror content (v2.6.x version used above)
Note: U8G2_MIRROR need to be used with setFlipMode().
*@param reset:U8x8_PIN_NONE Indicates that the pin is empty and no reset pin is used
* Display hardware SPI interface constructor
*@paramJust connect the CS pin (pins are optional)
*@paramJust connect the DC pin (pins are optional)
*
*/
#if defined ARDUINO_SAM_ZERO
#define OLED_DC7
#define OLED_CS5
#define OLED_RST 6
/*ESP32 */
#elif defined(ESP32)
#define OLED_DCD2
#define OLED_CSD6
#define OLED_RST D3
/*ESP8266*/
#elif defined(ESP8266)
#define OLED_DCD4
#define OLED_CSD6
#define OLED_RST D5
/*AVR series board*/
#else
#define OLED_DC2
#define OLED_CS3
#define OLED_RST 4
#endif
U8G2_SSD1309_128X64_NONAME2_1_4W_HW_SPI u8g2(/* rotation=*/U8G2_R0, /* cs=*/ OLED_CS, /* dc=*/ OLED_DC,/* reset=*/OLED_RST);
//2D array: The coordinates of all vertices of the tetrahesome are stored
double tetrahedron = {{0,20,-20},{-20,-20,-20},{20,-20,-20},{0,0,20}};
void setup(void) {
u8g2.begin();
}
void loop(void) {
/*
* firstPage will change the current page number position to 0
* When modifications are between firstpage and nextPage, they will be re-rendered at each time.
* This method consumes less ram space than sendBuffer
*/
u8g2.firstPage();
do {
//Connect the corresponding points inside the tetrahethal together
u8g2.drawLine(OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron), OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron));
u8g2.drawLine(OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron), OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron));
u8g2.drawLine(OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron), OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron));
u8g2.drawLine(OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron), OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron));
u8g2.drawLine(OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron), OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron));
u8g2.drawLine(OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron), OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron));
// Rotate 0.1°
rotate(0.1);
} while ( u8g2.nextPage() );
//delay(50);
}
/*!
* @brief Convert xz in the three-dimensional coordinate system Oxyz
* into the u coordinate inside the two-dimensional coordinate system Ouv
* @param x in Oxyz
* @param z in Oxyz
* @return u in Ouv
*/
int OxyzToOu(double x,double z){
return (int)((x + 64) - z*0.35);
}
/*!
* @brief Convert the yz in the three-dimensional coordinate system Oxyz into the v coordinate inside
* the two-dimensional coordinate system Ouv
* @param y in Oxyz
* @param z in Oxyz
* @return v in Ouv
*/
int OxyzToOv(double y,double z){
return (int)((y + 26) - z*0.35);
}
/*!
* @briefRotate the coordinates of all points of the entire 3D graphic around the Z axis
* @paramangle represents the angle to rotate
*
*z rotation (z unchanged)
x3 = x2 * cosb - y1 * sinb
y3 = y1 * cosb + x2 * sinb
z3 = z2
*/
void rotate(double angle)
{
double rad, cosa, sina, Xn, Yn;
rad = angle * PI / 180;
cosa = cos(rad);
sina = sin(rad);
for (int i = 0; i < 4; i++)
{
Xn = (tetrahedron * cosa) - (tetrahedron * sina);
Yn = (tetrahedron * sina) + (tetrahedron * cosa);
//Store converted coordinates into an array of coordinates
//Because it rotates around the Z-axis, the coordinates of the point z-axis remain unchanged
tetrahedron = Xn;
tetrahedron = Yn;
}
}
视频:
https://v.qq.com/x/page/e35303y9q8m.html
3.测试摄像头:
在arduino IDE中选择File->Examples->ESP32->Camera->CameraWebServer示例,使用下面的代码替换CameraWebServer中的代码
/* Connect the SD card to the following pins:
* SD Card | ESP32
* MISO MISO
* SCK SCK
* ss D6
* MOSI MOSI
* GND GND
* +5V VCC
*/
#include "FS.h"
#include "SD.h"
#include "SPI.h"
void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
Serial.printf("Listing directory: %s\n", dirname);
File root = fs.open(dirname);
if(!root){
Serial.println("Failed to open directory");
return;
}
if(!root.isDirectory()){
Serial.println("Not a directory");
return;
}
File file = root.openNextFile();
while(file){
if(file.isDirectory()){
Serial.print("DIR : ");
Serial.println(file.name());
if(levels){
listDir(fs, file.path(), levels -1);
}
} else {
Serial.print("FILE: ");
Serial.print(file.name());
Serial.print("SIZE: ");
Serial.println(file.size());
}
file = root.openNextFile();
}
}
void createDir(fs::FS &fs, const char * path){
Serial.printf("Creating Dir: %s\n", path);
if(fs.mkdir(path)){
Serial.println("Dir created");
} else {
Serial.println("mkdir failed");
}
}
void removeDir(fs::FS &fs, const char * path){
Serial.printf("Removing Dir: %s\n", path);
if(fs.rmdir(path)){
Serial.println("Dir removed");
} else {
Serial.println("rmdir failed");
}
}
void readFile(fs::FS &fs, const char * path){
Serial.printf("Reading file: %s\n", path);
File file = fs.open(path);
if(!file){
Serial.println("Failed to open file for reading");
return;
}
Serial.print("Read from file: ");
while(file.available()){
Serial.write(file.read());
}
file.close();
}
void writeFile(fs::FS &fs, const char * path, const char * message){
Serial.printf("Writing file: %s\n", path);
File file = fs.open(path, FILE_WRITE);
if(!file){
Serial.println("Failed to open file for writing");
return;
}
if(file.print(message)){
Serial.println("File written");
} else {
Serial.println("Write failed");
}
file.close();
}
void appendFile(fs::FS &fs, const char * path, const char * message){
Serial.printf("Appending to file: %s\n", path);
File file = fs.open(path, FILE_APPEND);
if(!file){
Serial.println("Failed to open file for appending");
return;
}
if(file.print(message)){
Serial.println("Message appended");
} else {
Serial.println("Append failed");
}
file.close();
}
void renameFile(fs::FS &fs, const char * path1, const char * path2){
Serial.printf("Renaming file %s to %s\n", path1, path2);
if (fs.rename(path1, path2)) {
Serial.println("File renamed");
} else {
Serial.println("Rename failed");
}
}
void deleteFile(fs::FS &fs, const char * path){
Serial.printf("Deleting file: %s\n", path);
if(fs.remove(path)){
Serial.println("File deleted");
} else {
Serial.println("Delete failed");
}
}
void testFileIO(fs::FS &fs, const char * path){
File file = fs.open(path);
static uint8_t buf;
size_t len = 0;
uint32_t start = millis();
uint32_t end = start;
if(file){
len = file.size();
size_t flen = len;
start = millis();
while(len){
size_t toRead = len;
if(toRead > 512){
toRead = 512;
}
file.read(buf, toRead);
len -= toRead;
}
end = millis() - start;
Serial.printf("%u bytes read for %u ms\n", flen, end);
file.close();
} else {
Serial.println("Failed to open file for reading");
}
file = fs.open(path, FILE_WRITE);
if(!file){
Serial.println("Failed to open file for writing");
return;
}
size_t i;
start = millis();
for(i=0; i<2048; i++){
file.write(buf, 512);
}
end = millis() - start;
Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end);
file.close();
}
void setup(){
Serial.begin(115200);
if(!SD.begin()){
Serial.println("Card Mount Failed");
return;
}
uint8_t cardType = SD.cardType();
if(cardType == CARD_NONE){
Serial.println("No SD card attached");
return;
}
Serial.print("SD Card Type: ");
if(cardType == CARD_MMC){
Serial.println("MMC");
} else if(cardType == CARD_SD){
Serial.println("SDSC");
} else if(cardType == CARD_SDHC){
Serial.println("SDHC");
} else {
Serial.println("UNKNOWN");
}
uint64_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.printf("SD Card Size: %lluMB\n", cardSize);
listDir(SD, "/", 0);
createDir(SD, "/mydir");
listDir(SD, "/", 0);
removeDir(SD, "/mydir");
listDir(SD, "/", 2);
writeFile(SD, "/hello.txt", "Hello ");
appendFile(SD, "/hello.txt", "World!\n");
readFile(SD, "/hello.txt");
deleteFile(SD, "/foo.txt");
renameFile(SD, "/hello.txt", "/foo.txt");
readFile(SD, "/foo.txt");
testFileIO(SD, "/test.txt");
Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));
}
void loop(){
}
wifi信息改掉,烧录程序。打开串口,查看IP,在浏览器输入ip,就可以看到摄像头画面
注意arduino板子里面的一些设置按下图:
页:
[1]