ESP8266 MP3制作——从sd卡读取数据并显示出来

读取数据并显示

概述

这一部分本来并不难,想直接做不用记录,但是早上还是做了快半个小时,还是写一下出现的一些问题吧。从sd卡中读取数据已经在上一篇文章中有提及,这里就不多赘述,主要是说一下SSD1306 OLED屏幕的一个函数,display.drawXbm()

开始操作

之前已经把OLED显示做好了,现在再把读出来的数据作为参数传进去就行了,所以先来了解一下这个函数的参数(并非来自官网)

drawXbm(34,14,width,height,testCode)
  1. 第一个参数和第二个参数分别对应起点的x和y坐标,参考系是默认是左上角开始,而我的0.96寸的OLED屏幕是128*64个像素点的,所以根据这些数据的计算就可以准确得出自己想要绘画的位置了。
  2. 第三个参数就是宽和高,起点,宽,高,这几个量合起来就可以确定绘画范围
  3. 最后是绘画的内容,我觉得应该是前四个参数合起来就可以确定元素个数,所以这个内容数组没有要求填写数组大小,我试了一下,用偏大的内存空间也是可以正常显示的
  4. 所以在使用的时候可以创建一个足够大的数组,每次使用之前用memset或者for循环清空数组(置为0),然后就把读到的数据放进去,要显示下一个图像就把这个清空读下一个即可。

遇到的问题

我把数据读出来,是十进制的数据,结果OLED屏幕显示乱码,我用这串十进制数直接写进PROGMEM,结果显示正常,然后再把我得到的height和width数据输出,结果width居然有一百多
原数据:

24
24

读取代码:

if(myFile.available())
{
  char c1 = myFile.read();
  char c2 = myFile.read();
  char c3 = myFile.read(); //read \n
  Serial.println(int(c3));
  char arr[2] = {c1,c2};
  height = charArr_to_int(arr,2);
}
if(myFile.available())
{
  char c1 = myFile.read();
  char c2 = myFile.read();
  char c3 = myFile.read(); //read \n
  Serial.println(int(c3));
  char arr[2] = {c1,c2};
  width = charArr_to_int(arr,2);
}

看起来没什么问题对吧,先读前两个字符,然后转成十进制数(charArr_to_int函数在上一篇文章《从sd卡读取数据》有代码),接着把换行符读出来,再接着读下一个
但事实不是这样的

解决方案

  • 其实在不同系统对应换行符的处理是不同的,在windows中,换行符是\n\r,而mac和linux中只是\n,我这个txt文件是在windows下创建的,所以换行符不只一个符号,也就导致我把\r当作第一个字符读取出来,然后经过一番处理,就得到那个100多的结果
  • 所以真正的解决方案我想到的有两条,第一个是修改文件格式,比如说改成:
	24#24 //因为我读取数据的时候有处理换行符,所以可以这么做
  • 第二个做法是修改源代码,这是我选择的做法,就是多读一个字符就行了
	int height = 0;
    int width = 0;
    if(myFile.available())
    {
      char c1 = myFile.read();
      char c2 = myFile.read();
      myFile.read(); //read \n
      char c3 = myFile.read(); //read \r
      Serial.println(int(c3));
      char arr[2] = {c1,c2};
      height = charArr_to_int(arr,2);
    }
    if(myFile.available())
    {
      char c1 = myFile.read();
      char c2 = myFile.read();
      myFile.read();  //read \n
      char c3 = myFile.read(); //read \r
      Serial.println(int(c3));
      char arr[2] = {c1,c2};
      width = charArr_to_int(arr,2);
    }

这样子问题就解决了!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集 ESP8266 和 MPU6050关节数据采集
要实现esp8266和RC522卡器在网页上显示取到的卡片数据,可以按照以下步骤进行操作: 1. 首先需要连接esp8266和RC522卡器,可以使用SPI协议进行通信。 2. 在esp8266上编写程序,使用RC522库取卡片数据,并将数据存储到一个变量中。 3. 使用ESPAsyncWebServer库创建一个Web服务器,并设置一个路由,用于处理客户端的请求。 4. 在路由处理程序中,将取到的卡片数据作为响应发送给客户端。 下面是一个简单的示例程序,可以帮助你完成这个任务: ```c++ #include <SPI.h> #include <MFRC522.h> #include <ESPAsyncWebServer.h> #define SS_PIN D1 #define RST_PIN D2 MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建MFRC522实例 String cardData = ""; // 存储取到的卡片数据 AsyncWebServer server(80); // 创建Web服务器实例 void setup() { Serial.begin(9600); SPI.begin(); // 初始化SPI总线 mfrc522.PCD_Init(); // 初始化RC522卡器 server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(200, "text/plain", cardData); // 将取到的卡片数据作为响应发送给客户端 }); server.begin(); // 启动Web服务器 } void loop() { if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { for (byte i = 0; i < mfrc522.uid.size; i++) { cardData += String(mfrc522.uid.uidByte[i], HEX); // 取卡片数据并存储到cardData变量中 } mfrc522.PICC_HaltA(); } delay(50); } ``` 在这个示例程序中,我们首先定义了MFRC522实例和一个名为cardData的字符串变量,用于存储取到的卡片数据。 然后使用ESPAsyncWebServer库创建了一个Web服务器实例,并设置了一个路由,用于处理客户端的请求。 在主循环中,我们使用MFRC522库的函数检测是否有新的卡片出现,并取卡片数据并存储到cardData变量中。 最后,在路由处理程序中,我们将cardData变量作为响应发送给客户端,这样就可以在网页上显示取到的卡片数据了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值