久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1978|回復: 0
打印 上一主題 下一主題
收起左側

基于ESP32手勢切換天氣相冊的制作 附程序

[復制鏈接]
跳轉到指定樓層
樓主
硬件部分
一塊ESP32開發板、一塊TFT顯示屏(驅動ILI9341、不用觸摸、尺寸自選,用的是240*320,2.8寸)、Micro SD卡讀取模塊、micro SD卡(我測試的時候2G的掛載成功但是無法讀取,最后用的128M的)、PAJ7620手勢傳感器。

SP32模塊作為主控,實現天氣信息獲取以及將SD卡內圖片推送到TFT屏幕上。在連線時,需要注意一點:因為TFT屏幕與SD卡共用一套SPI,所以他們的一些引腳是接在一起的,只需要控制片選引腳即可,PAJ7620使用的是IIC總線(PAJ7620未在圖中繪出),在源碼里我注釋了接線的引腳。
軟件流程
流程根據功能化為4個部分,心知天氣API獲取,網頁圖片上傳、手勢傳感器切花,FTF顯示,每個部分的相關操作如下圖:

硬件部分與軟件流程圖:





部分代碼
  1. #include "JpegDecoder.h"
  2. #include <math.h>
  3. #include <stdlib.h>

  4. using namespace std;

  5. //---------------------------------------------------------------------------


  6. void JpegDecoder::DecoderTable()
  7. {
  8.         int val = 0; // type of table ( DC(0,1) or AC(0,1) )
  9.         uint8_t buf[16];

  10.         fread(&val, 1, 1, fp); // get type of table
  11.         fread(buf, 1, 16, fp); // get key value
  12.         map<string, uint8_t> &tb = huffman[val];

  13.         string keyStr = "";
  14.         for (int i = 0; i < 16; i++) // length of key (i.e. i = 2 means key = 000 , 001 , 010 , 011 or ...)
  15.         {
  16.                 int cnt = buf[i]; // number of key, which length is (i+1)

  17.                 /* alignment */
  18.                 for (int k = keyStr.length(); k <= i; k++)
  19.                 {
  20.                         keyStr += "0";
  21.                 }

  22.                 while (cnt > 0)
  23.                 {
  24.                         /* value of key */
  25.                         fread(&val, 1, 1, fp); // read value
  26.                         //printf("%s = %X\n", keyStr.c_str(), val);
  27.                         tb.insert(pair<string, uint8_t>(keyStr, val));

  28.                         /* increment */
  29.                         int carry = 1; //??λ
  30.                         for (int k = keyStr.length() - 1; k >= 0; k--)
  31.                         {
  32.                                 int tmpVal = (keyStr[k] + carry - '0'); //?????λ
  33.                                 carry = tmpVal / 2;
  34.                                 keyStr[k] = tmpVal % 2 + '0'; //??????λ???
  35.                         }
  36.                         cnt = cnt - 1;
  37.                 }
  38.         }
  39. }

  40. //-------------------------------------------------------------------------------

  41. Mtx JpegDecoder::InveseSample(Mtx& block, int number)
  42. {
  43.         Mtx ret;

  44.         int x = (number / 2) * 4;
  45.         int y = (number % 2) * 4;
  46.         for (int i = 0; i < 8; i += 2)
  47.         {
  48.                 for (int j = 0; j < 8; j += 2)
  49.                 {
  50.                         ret[i][j] = ret[i][j + 1] = ret[i + 1][j] = ret[i + 1][j + 1] = block[x + i / 2][y + j / 2];
  51.                 }
  52.         }

  53.         return ret;
  54. }


  55. /* @brief ????????? YCbCr -> RGB
  56. */
  57. void JpegDecoder::ConvertClrSpace(Mtx &Y, Mtx &Cb, Mtx &Cr, Pixel out[8][8])
  58. {
  59.         for (int i = 0; i < 8; i++)
  60.         {
  61.                 for (int j = 0; j < 8; j++)
  62.                 {
  63.                         out[i][j].R = Y[i][j] + 1.402 * Cr[i][j] + 128;
  64.                         out[i][j].G = Y[i][j] - 0.34414 * Cb[i][j] - 0.71414 * Cr[i][j] + 128;
  65.                         out[i][j].B = Y[i][j] + 1.772 * Cb[i][j] + 128;

  66.                         /* ??? */
  67.                         if (out[i][j].R > 255) out[i][j].R = 255;
  68.                         if (out[i][j].G > 255) out[i][j].G = 255;
  69.                         if (out[i][j].B > 255) out[i][j].B = 255;

  70.                         /* ??? */
  71.                         if (out[i][j].R < 0) out[i][j].R = 0;
  72.                         if (out[i][j].G < 0) out[i][j].G = 0;
  73.                         if (out[i][j].B < 0) out[i][j].B = 0;
  74.                 }
  75.         }
  76. }


  77. /* @brief ???? ConvertClrSpace(), ?? MCU ?е? YCbCr ??????? RGB ???
  78. */
  79. void JpegDecoder::Convert()
  80. {
  81.         Mtx cb;
  82.         Mtx cr;
  83.         Pixel out[8][8];


  84.         cb = InveseSample(mcu.cbMtx, 0);
  85.         cr = InveseSample(mcu.crMtx, 0);
  86.         ConvertClrSpace(mcu.yMtx[0], cb, cr, out);
  87.         WriteToRGBBuffer(out, 0);

  88.         cb = InveseSample(mcu.cbMtx, 1);
  89.         cr = InveseSample(mcu.crMtx, 1);
  90.         ConvertClrSpace(mcu.yMtx[1], cb, cr, out);
  91.         WriteToRGBBuffer(out, 1);

  92.         cb = InveseSample(mcu.cbMtx, 2);
  93.         cr = InveseSample(mcu.crMtx, 2);
  94.         ConvertClrSpace(mcu.yMtx[2], cb, cr, out);
  95.         WriteToRGBBuffer(out, 2);

  96.         //for (int i = 0; i < 8; i++)
  97.         //{
  98.         //        for (int j = 0; j < 8; j++)
  99.         //        {
  100.         //                cr[i][j] = mcu.crMtx[4 + i % 4][4 + j % 4];
  101.         //                cb[i][j] = mcu.cbMtx[4 + i % 4][4 + i % 4];
  102.         //        }
  103.         //}

  104.         cb = InveseSample(mcu.cbMtx, 3);
  105.         cr = InveseSample(mcu.crMtx, 3);
  106.         ConvertClrSpace(mcu.yMtx[3], cb, cr, out);
  107.         WriteToRGBBuffer(out, 3);
  108. }


  109. /* @brief ??????????RGB????д??RGB????????
  110.         @buf: ????????
  111.         @blockIndex: ?????? ????Χ: 00, 01, 10, 11 (??????) -> 0??1??2??3 (?????)

  112. */
  113. void JpegDecoder::WriteToRGBBuffer(Pixel buf[8][8], int blockIndex)
  114. {
  115.         int xOffset = 8 * (blockIndex & 0x02) >> 1; // binary: blockIndex & 10 (i.e. if blockIndex =  01 => blockIndex & 0x02 == 01 & 10 => xOffset = 0 * 8 = 0 )
  116.         int yOffset = 8 * (blockIndex & 0x01);      // binary: blockIndex & 01 (i.e. if blockIndex =  01 => blockIndex & 0x01 == 01 & 01 => yOffset = 1 * 8 = 8 )
  117.         for (int i = 0; i < 8; i++)
  118.         {
  119.                 for (int j = 0; j < 8; j++)
  120.                 {
  121.                         rgbBuf[xOffset + i][yOffset + j].R = buf[i][j].R;
  122.                         rgbBuf[xOffset + i][yOffset + j].G = buf[i][j].G;
  123.                         rgbBuf[xOffset + i][yOffset + j].B = buf[i][j].B;
  124.                 }
  125.         }
  126. }

  127. //-------------------------------------------------------------------------------

  128. /* @brief ??????? MCU
  129. */
  130. void JpegDecoder::DecoderNextMCU()
  131. {
  132.         /* Y ?????? ??? 0??? */
  133.         DecoderMtx(mcu.yMtx[0], 0, quantY, dcY);
  134.         DecoderMtx(mcu.yMtx[1], 0, quantY, dcY);
  135.         DecoderMtx(mcu.yMtx[2], 0, quantY, dcY);
  136.         DecoderMtx(mcu.yMtx[3], 0, quantY, dcY);

  137.         /* Cb, Cr ?????? ??? 1??? */
  138.         DecoderMtx(mcu.cbMtx, 1, quantC, dcCr);
  139.         DecoderMtx(mcu.crMtx, 1, quantC, dcCb);
  140. }

  141. //--------------------------------------------------------------------

  142. /* @brief ??????? 8 x 8 ??????
  143. */
  144. void JpegDecoder::DecoderMtx(Mtx &block, int table, uint8_t *quant, int &dc)
  145. {
  146.         if (endOfDecoder) return; // ???????

  147.         // reset matrix
  148.         for (int i = 0; i < 64; i++) block[i / 8][i % 8] = 0x0;

  149.         // decoder DC of matrix
  150.         int length = FindKeyValue(table);
  151.         int value = GetRealValue(length);
  152.         dc += value; // DC
  153.         block[0][0] = dc;

  154.         // decoder AC of matrix, table = table + 16 => table = 0x00 (DC-0)-> table = 0x10 (AC-0)
  155.         for (int i = 1; i < 64; i++)
  156.         {
  157.                 length = FindKeyValue(table + 16);
  158.                 if (length == 0x0) break; // ????????

  159.                 value = GetRealValue(length & 0xf); // ??? 4λ??????????
  160.                 i += (length >> 4);          // ??? 4λ???г????
  161.                 block[i / 8][i % 8] = value; // AC
  162.         }


  163.         // ??????
  164.         for (int i = 0; i < 64; i++) block[i / 8][i % 8] *= quant[i];

  165.         // ?? Zig-Zag ????
  166.         UnZigZag(block);

  167.         // ?????????任
  168.         IDCT(block);
  169. }

  170. /* @brief ?????????????????????Ч?
  171. */
  172. int JpegDecoder::FindKeyValue(int table)
  173. {
  174.         map<string, uint8_t> &huf = huffman[table];

  175.         string keyStr = "";
  176.         while (huf.find(keyStr) == huf.end())
  177.         {
  178.                 //printf("%s\n", keyStr.c_str());
  179.                 keyStr += (NextBit() + '0'); // char of 0 or 1
  180.         }

  181.         //printf("%s = %d\n", keyStr.c_str(), huf[keyStr]);
  182.         return huf[keyStr];
  183. }


  184. /* ????????????????????? */
  185. int JpegDecoder::GetRealValue(int length)
  186. {
  187.         int retVal = 0;
  188.         for (int i = 0; i < length; i++)
  189.         {
  190.                 retVal = (retVal << 1) + NextBit();
  191.         }

  192.         return (retVal >= pow(2, length - 1) ? retVal : retVal - pow(2, length) + 1);
  193. }
  194. //---------------------------------------------------------------------

  195. /* @brief ????
  196. */
  197. BitmapImage &JpegDecoder::Decoder()
  198. {
  199.         /* decoder quant table */
  200.         DecoderQuant();

  201.         /* decoder width and height of image */
  202.         DecoderSize();

  203.         /* decoder huffman table of DC and AC */
  204.         DecoderHuffman();

  205.         /* decoder data */
  206.         ToStartOfData();

  207.         /* decoder MCU */
  208.         int totalBlock = xNumberOfBlock * yNumberOfBlock;
  209.         while (!endOfDecoder && (idxOfBlock < totalBlock))
  210.         {
  211.                 DecoderNextMCU();

  212.                 Convert();

  213.                 WirteBlock(rgbBuf);
  214.         }

  215.         /* end of decoder */
  216.         return img;
  217. }
復制代碼

51hei截圖20230306162537.png (9.34 KB, 下載次數: 168)

壓縮文件

壓縮文件

程序.7z

269.86 KB, 下載次數: 24, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男女视频在线观看免费 | 精品久久久久一区二区国产 | 超碰精品在线观看 | av中文网 | 欧美色a v | 日日骚视频 | 香蕉视频1024| 成年人免费看 | 韩日在线观看视频 | 国产精品片 | 91在线看网站| 日日夜夜91 | 一区二区三区免费 | 国精产品一品二品国精在线观看 | 九九av| 精精国产视频 | 久久久夜| 日韩视频专区 | 国产伦精品一区二区三区视频金莲 | 国产区精品 | 日韩免费一区 | 久草精品视频 | 国产精品日韩在线观看一区二区 | 精品国产91久久久久久 | 亚洲网站在线观看 | 成人性生交大片免费看中文带字幕 | 美女天天干天天操 | 天天影视亚洲综合网 | 青青久久久 | 久久精品| 亚洲精品久久久一区二区三区 | 特级黄色毛片 | 日韩成人免费视频 | 日韩中文字幕一区二区 | 欧美成人h版在线观看 | 精品一区二区三区在线视频 | 午夜精品一区二区三区在线视 | 免费观看www7722午夜电影 | 午夜婷婷激情 | 国产成人小视频 | 中文字幕一区二区三区精彩视频 |