[开发工具] 新定义NBK-EBS003 IoT功能扩展板,云端与显示的契合!

[复制链接]
 楼主| xld0932 发表于 2023-2-28 11:12 | 显示全部楼层 |阅读模式
本帖最后由 xld0932 于 2023-2-28 11:14 编辑

#申请原创#   @21小跑堂

NBK-EBS003 IoT功能扩展板是新定义推出的基于NBK-RD8x3x核心底板上的扩展硬件,具有丰富的功能:
1.四个常规LED灯
2.三色RGB灯
3.触控按键、触控滑条
4.OLED显示模块
5.ESP-01 Wi-Fi模块
1.png

在之前的分享帖中我们已经介绍了LED灯、RGB灯的控制方式,对于NBK-EBS003 IoT功能扩展板亦是相同的控制原理,需要注意的是,如果是将NBK-ES003 IoT扩展板直接插在NBK-RD8x3x核心底板上,需要将核心底板上的J10跳帽移动一设置选项,这样才可以使用三色RGB灯正常显示哦;

本篇要主要来分享一下使用RD8T36系列芯片的USCI0接口的TWI工作模式完成对OLED的显示驱动,UART0接口完成与ESP-01 Wi-Fi模块的通讯,最后结合这两个功能完成通过ESP-01 Wi-Fi模块连接Wi-Fi后,与知心天气服务器进行连接,获取当地的实时温度,显示在OLED上……

当然在完成上述功能的前提下,我们还需要准备一下软硬件相关的资料:
1、RD8T36P48J芯片数据手册
2、易码魔盒EasyCodeCube_RDSV3.2.5_20230105
3、新定义NBK-RD8x3x应用资料
上面3个都可以在新定义官网的下载中心进行下载:https://www.rdsmcu.com/
4、NBK-EBS003 IoT扩展板原理图: NBK-EBS003原理图.pdf (135.27 KB, 下载次数: 10)

除了软件资料外,我们硬件平台也是不可缺少的:
1、NBK-RD8x3x核心底板
2、NBK-EBS003 IoT扩展板
3、RD LINK PRO
因为在NBK-RD8x3x核心底板上已经带有ISP下载功能模块,所以RD LINK PRO是可选择工具;ISP仅可以下载程序到MCU运行,通过实际的运行结果验证功能是否正常;而RD LINK PRO除了具有下载程序的功能之外,还带有脱机烧录、在线调试、仿真等等丰富的功能……各位小伙伴可以根据需要自行选择……


1.TWI底层驱动程序(中断方式 + 超时处理)
在TWM产生START信号、发送数据时,操作成功/完成后都会产生TWIF中断(中断打开的情况下),我们通过这个中断来判断操作是否完成,再结合TIMEOUT超时处理,这样可以保证程序不会因为通讯断开而导致程序卡死的现象,保证了程序的可靠性……
  1. /***********************************************************************************************************************
  2.   * @brief
  3.   * @param
  4.   * @retval
  5.   * @attention
  6.   *********************************************************************************************************************/
  7. void OLED_TWI_Ready(void)
  8. {
  9.     USCI0_TWI_AcknowledgeConfig(DISABLE);

  10.     _nop_();
  11.     _nop_();
  12.     _nop_();

  13.     USCI0_TWI_Cmd(DISABLE);
  14.     USCI0_TWI_Cmd(ENABLE);

  15.     _nop_();
  16.     _nop_();
  17.     _nop_();
  18. }

  19. /***********************************************************************************************************************
  20.   * @brief
  21.   * @param
  22.   * @retval
  23.   * @attention
  24.   *********************************************************************************************************************/
  25. uint16_t OLED_TWI_Start(void)
  26. {
  27.     uint16_t Timeout   = OLED_TWI_TIMEOUT;

  28.     TWI0_InterruptFlag = 0;

  29.     USCI0_TWI_Start();

  30.     while ((0 == TWI0_InterruptFlag) && (0 != Timeout))
  31.     {
  32.         Timeout--;
  33.     }

  34.     return (Timeout);
  35. }

  36. /***********************************************************************************************************************
  37.   * @brief
  38.   * @param
  39.   * @retval
  40.   * @attention
  41.   *********************************************************************************************************************/
  42. void OLED_TWI_Stop(void)
  43. {
  44.     _nop_();
  45.     _nop_();
  46.     _nop_();

  47.     USCI0_TWI_MasterModeStop();

  48.     _nop_();
  49.     _nop_();
  50.     _nop_();
  51. }

  52. /***********************************************************************************************************************
  53.   * @brief
  54.   * @param
  55.   * @retval
  56.   * @attention
  57.   *********************************************************************************************************************/
  58. uint16_t OLED_TWI_SendData(uint8_t Value)
  59. {
  60.     uint16_t Timeout   = OLED_TWI_TIMEOUT;

  61.     TWI0_InterruptFlag = 0;

  62.     USCI0_TWI_SendData(Value);

  63.     while ((0 == TWI0_InterruptFlag) && (0 != Timeout))
  64.     {
  65.         Timeout--;
  66.     }

  67.     return (Timeout);
  68. }

  69. /***********************************************************************************************************************
  70.   * @brief
  71.   * @param
  72.   * @retval
  73.   * @attention
  74.   *********************************************************************************************************************/
  75. uint16_t OLED_TWI_WaitACK(void)
  76. {
  77.     uint16_t Timeout = OLED_TWI_TIMEOUT;

  78.     while (RESET == USCI0_GetFlagStatus(USCI0_TWI_FLAG_TXRXnE) && (0 != Timeout))
  79.     {
  80.         Timeout--;
  81.     }

  82.     return (Timeout);
  83. }

  84. /***********************************************************************************************************************
  85.   * @brief
  86.   * @param
  87.   * @retval
  88.   * @attention
  89.   *********************************************************************************************************************/
  90. void OLED_TWI_WriteByte(uint8_t DeviceAddress, uint8_t Address, uint8_t Value)
  91. {
  92.     OLED_TWI_Ready();

  93.     OLED_TWI_Start();

  94.     OLED_TWI_SendData(DeviceAddress);
  95.     OLED_TWI_WaitACK();

  96.     OLED_TWI_SendData(Address);
  97.     OLED_TWI_WaitACK();

  98.     OLED_TWI_SendData(Value);
  99.     OLED_TWI_WaitACK();

  100.     OLED_TWI_Stop();
  101. }

  102. /***********************************************************************************************************************
  103.   * @brief
  104.   * @param
  105.   * @retval
  106.   * @attention
  107.   *********************************************************************************************************************/
  108. void USCI0_IRQHandler(void) interrupt 7
  109. {
  110.     if (SET == USCI0_GetFlagStatus(USCI0_TWI_FLAG_TWIF))
  111.     {
  112.         TWI0_InterruptFlag = 1;

  113.         USCI0_ClearFlag(USCI0_TWI_FLAG_TWIF);
  114.     }
  115. }
复制代码

2.OLED驱动、配置及显示
  1. /***********************************************************************************************************************
  2.   * @brief
  3.   * @param
  4.   * @retval
  5.   * @attention
  6.   *********************************************************************************************************************/
  7. void OLED_Set_Pos(uint8_t x, uint8_t y)
  8. {
  9.     OLED_TWI_WriteByte(0x78, 0x00, 0xB0 + y);
  10.     OLED_TWI_WriteByte(0x78, 0x00, ((x & 0xF0) >> 4) | 0x10);
  11.     OLED_TWI_WriteByte(0x78, 0x00, ((x & 0x0F) >> 0) | 0x00);
  12. }

  13. /***********************************************************************************************************************
  14.   * @brief
  15.   * @param
  16.   * @retval
  17.   * @attention
  18.   *********************************************************************************************************************/
  19. void OLED_Clear(void)
  20. {
  21.     uint8_t i = 0, j = 0;

  22.     for (i = 0; i < 8; i++)
  23.     {
  24.         OLED_TWI_WriteByte(0x78, 0x00, 0xb0 + i);
  25.         OLED_TWI_WriteByte(0x78, 0x00, 0x00);
  26.         OLED_TWI_WriteByte(0x78, 0x00, 0x10);

  27.         for (j = 0; j < 128; j++)
  28.         {
  29.             OLED_TWI_WriteByte(0x78, 0x40, 0x00);
  30.         }
  31.     }
  32. }

  33. /***********************************************************************************************************************
  34.   * @brief
  35.   * @param
  36.   * @retval
  37.   * @attention
  38.   *********************************************************************************************************************/
  39. void OLED_PartClear(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1)
  40. {
  41.     uint8_t i = 0, j = 0;

  42.     for (i = x0; i < x1; i++)
  43.     {
  44.         for (j = y0; j < y1; j++)
  45.         {
  46.             OLED_TWI_WriteByte(0x78, 0x00, 0xB0 + i);
  47.             OLED_TWI_WriteByte(0x78, 0x00, ((j & 0xF0) >> 4) | 0x10);
  48.             OLED_TWI_WriteByte(0x78, 0x00, ((j & 0x0F) >> 0) | 0x00);
  49.             OLED_TWI_WriteByte(0x78, 0x40, 0);
  50.         }
  51.     }
  52. }

  53. /***********************************************************************************************************************
  54.   * @brief
  55.   * @param
  56.   * @retval
  57.   * @attention
  58.   *********************************************************************************************************************/
  59. void OLED_ShowChar(uint8_t x, uint8_t y, char ch, uint8_t CharSize)
  60. {
  61.     uint8_t i = 0;

  62.     ch -= 0x20;

  63.     if (x > (128 - 1))
  64.     {
  65.         x = 0;
  66.         y = y + 2;
  67.     }

  68.     if (CharSize == 16)
  69.     {
  70.         OLED_Set_Pos(x, y);

  71.         for (i = 0; i < 8; i++)
  72.         {
  73.             OLED_TWI_WriteByte(0x78, 0x40, F8x16[ch * 16 + i]);
  74.         }

  75.         OLED_Set_Pos(x, y + 1);

  76.         for (i = 0; i < 8; i++)
  77.         {
  78.             OLED_TWI_WriteByte(0x78, 0x40, F8x16[ch * 16 + i + 8]);
  79.         }
  80.     }
  81.     else
  82.     {
  83.         OLED_Set_Pos(x, y);

  84.         for (i = 0; i < 6; i++)
  85.         {
  86.             OLED_TWI_WriteByte(0x78, 0x40, F6x8[ch][i]);
  87.         }
  88.     }
  89. }

  90. /***********************************************************************************************************************
  91.   * @brief
  92.   * @param
  93.   * @retval
  94.   * @attention
  95.   *********************************************************************************************************************/
  96. void OLED_ShowString(uint8_t x, uint8_t y, char *str, uint8_t CharSize)
  97. {
  98.     unsigned char j = 0;

  99.     while (*str != '\0')
  100.     {
  101.         OLED_ShowChar(x, y, *str, CharSize);

  102.         x += 8;

  103.         if (x > 120)
  104.         {
  105.             x  = 0;
  106.             y += 2;
  107.         }

  108.         str++;
  109.     }
  110. }

  111. /***********************************************************************************************************************
  112.   * @brief
  113.   * @param
  114.   * @retval
  115.   * @attention
  116.   *********************************************************************************************************************/
  117. void OLED_Init(void)
  118. {
  119.     TWI0_InterruptFlag = 0;

  120.     GPIO_Init(GPIO0, GPIO_PIN_5, GPIO_MODE_IN_PU);

  121.     USCI0_TWI_GeneralCallCmd(ENABLE);
  122.     USCI0_TWI_AcknowledgeConfig(ENABLE);
  123.     USCI0_ITConfig(ENABLE, LOW);
  124.     USCI0_TWI_MasterCommunicationRate(USCI0_TWI_32);
  125.     USCI0_TWI_Cmd(ENABLE);
  126. }

  127. /***********************************************************************************************************************
  128.   * @brief
  129.   * @param
  130.   * @retval
  131.   * @attention
  132.   *********************************************************************************************************************/
  133. void OLED_Configure(void)
  134. {
  135.     OLED_TWI_WriteByte(0x78, 0x00, 0xAE);
  136.     OLED_TWI_WriteByte(0x78, 0x00, 0x00);
  137.     OLED_TWI_WriteByte(0x78, 0x00, 0x10);
  138.     OLED_TWI_WriteByte(0x78, 0x00, 0x40);
  139.     OLED_TWI_WriteByte(0x78, 0x00, 0xB0);
  140.     OLED_TWI_WriteByte(0x78, 0x00, 0x81);
  141.     OLED_TWI_WriteByte(0x78, 0x00, 0xFF);
  142.     OLED_TWI_WriteByte(0x78, 0x00, 0xA1);
  143.     OLED_TWI_WriteByte(0x78, 0x00, 0xA6);
  144.     OLED_TWI_WriteByte(0x78, 0x00, 0xA8);
  145.     OLED_TWI_WriteByte(0x78, 0x00, 0x3F);
  146.     OLED_TWI_WriteByte(0x78, 0x00, 0xC8);
  147.     OLED_TWI_WriteByte(0x78, 0x00, 0xD3);
  148.     OLED_TWI_WriteByte(0x78, 0x00, 0x00);

  149.     OLED_TWI_WriteByte(0x78, 0x00, 0xD5);
  150.     OLED_TWI_WriteByte(0x78, 0x00, 0x80);

  151.     OLED_TWI_WriteByte(0x78, 0x00, 0xD8);
  152.     OLED_TWI_WriteByte(0x78, 0x00, 0x05);

  153.     OLED_TWI_WriteByte(0x78, 0x00, 0xD9);
  154.     OLED_TWI_WriteByte(0x78, 0x00, 0xF1);

  155.     OLED_TWI_WriteByte(0x78, 0x00, 0xDA);
  156.     OLED_TWI_WriteByte(0x78, 0x00, 0x12);

  157.     OLED_TWI_WriteByte(0x78, 0x00, 0xDB);
  158.     OLED_TWI_WriteByte(0x78, 0x00, 0x30);

  159.     OLED_TWI_WriteByte(0x78, 0x00, 0x8D);
  160.     OLED_TWI_WriteByte(0x78, 0x00, 0x14);

  161.     OLED_TWI_WriteByte(0x78, 0x00, 0xAF);
  162. }
复制代码

3.UART0底层驱动程序
UART0配置了中断方式,通过中断标志位,来实现发送数据完成的判断,接收到新数据的缓存操作……
  1. /***********************************************************************************************************************
  2.   * @brief
  3.   * @param
  4.   * @retval
  5.   * @attention
  6.   *********************************************************************************************************************/
  7. void ESP12_Init(void)
  8. {
  9.     QUEUE_INIT();

  10.     ESP12_InitBuffer();

  11.     GPIO_Init(GPIO2, GPIO_PIN_0, GPIO_MODE_IN_PU);
  12.     GPIO_Init(GPIO2, GPIO_PIN_1, GPIO_MODE_IN_PU);

  13.     UART0_Init(32000000, 115200, UART0_Mode_10B, UART0_CLOCK_TIMER1, UART0_RX_ENABLE);

  14.     UART0_ITConfig(ENABLE, LOW);

  15.     TimeSliceStartup(ESP12_TxHandler, 5000);
  16.     TimeSliceStartup(ESP12_RxHandler, 5);
  17. }

  18. /***********************************************************************************************************************
  19.   * @brief
  20.   * @param
  21.   * @retval
  22.   * @attention
  23.   *********************************************************************************************************************/
  24. void UART0_IRQHandler(void) interrupt 4
  25. {
  26.     if (SET == UART0_GetFlagStatus(UART0_FLAG_RI))
  27.     {
  28.         QUEUE_PUSH(UART0_ReceiveData8());

  29.         UART0_ClearFlag(UART0_FLAG_RI);
  30.     }

  31.     if (SET == UART0_GetFlagStatus(UART0_FLAG_TI))
  32.     {
  33.         UART0_ClearFlag(UART0_FLAG_TI);

  34.         UART0_TI_Flag = 1;
  35.     }
  36. }
复制代码

4.消息队列代码实现
使用消息队列是用来暂存UART0接收到的数据,对于接收到的数据不要中断函数中进行处理,而是先缓存起来,这样在接收大量数据时,保证了接收数据不会丢失(接收缓存大小满足的情况下),保证程序处理消息的正确性,随后在应用中对消息队列中的数据再进行解析处理……
  1. /* Private variables **************************************************************************************************/
  2. uint16_t ESP12_QueueFront = 0;
  3. uint16_t ESP12_QueueRear  = 0;
  4. uint8_t  ESP12_QueueData[600];

  5. /* Private functions **************************************************************************************************/

  6. /***********************************************************************************************************************
  7.   * @brief
  8.   * @param
  9.   * @retval
  10.   * @attention
  11.   *********************************************************************************************************************/
  12. void QUEUE_INIT(void)
  13. {
  14.     ESP12_QueueFront = 0;
  15.     ESP12_QueueRear  = 0;

  16.     memset(ESP12_QueueData, 0, sizeof(ESP12_QueueData));
  17. }

  18. /***********************************************************************************************************************
  19.   * @brief
  20.   * @param
  21.   * @retval
  22.   * @attention
  23.   *********************************************************************************************************************/
  24. uint8_t QUEUE_EMPTY(void)
  25. {
  26.     if (ESP12_QueueFront == ESP12_QueueRear)
  27.     {
  28.         return (1);
  29.     }
  30.     else
  31.     {
  32.         return (0);
  33.     }
  34. }

  35. /***********************************************************************************************************************
  36.   * @brief
  37.   * @param
  38.   * @retval
  39.   * @attention
  40.   *********************************************************************************************************************/
  41. uint8_t QUEUE_POP(void)
  42. {
  43.     uint8_t Value = ESP12_QueueData[ESP12_QueueFront];

  44.     ESP12_QueueFront += 1;
  45.     ESP12_QueueFront %= 500;

  46.     return (Value);
  47. }

  48. /***********************************************************************************************************************
  49.   * @brief
  50.   * @param
  51.   * @retval
  52.   * @attention
  53.   *********************************************************************************************************************/
  54. void QUEUE_PUSH(uint8_t Value)
  55. {
  56.     ESP12_QueueData[ESP12_QueueRear] = Value;

  57.     ESP12_QueueRear += 1;
  58.     ESP12_QueueRear %= 500;
  59. }
复制代码

5.ESP-01 Wi-Fi驱动程序
ESP-01模块实现主要2部分,一部分是对于AT指令的处理,用于配置ESP-01模块的参数,比如连接Wi-Fi网络、连接服务器等;另一部分就是在与服务器建议通讯连接后,与服务器之间的消息通讯;这两部分都有不同的解析和处理方式,都是基于上述的消息队列来实现的……
  1. /***********************************************************************************************************************
  2.   * @brief
  3.   * @param
  4.   * @retval
  5.   * @attention
  6.   *********************************************************************************************************************/
  7. void ESP12_InitBuffer(void)
  8. {
  9.     ESP12_Length = 0;
  10.     memset(ESP12_Buffer, 0, sizeof(ESP12_Buffer));
  11. }

  12. /***********************************************************************************************************************
  13.   * @brief
  14.   * @param
  15.   * @retval
  16.   * @attention
  17.   *********************************************************************************************************************/
  18. uint16_t ESP12_SendData(uint8_t Value)
  19. {
  20.     uint16_t Timeout = ESP12_UART_TIMEOUT;

  21.     UART0_TI_Flag = 0;

  22.     UART0_SendData8(Value);

  23.     while ((0 == UART0_TI_Flag) && (0 != Timeout))
  24.     {
  25.         Timeout--;
  26.     }

  27.     return (Timeout);
  28. }

  29. /***********************************************************************************************************************
  30.   * @brief
  31.   * @param
  32.   * @retval
  33.   * @attention
  34.   *********************************************************************************************************************/
  35. void ESP12_SendString(char *str)
  36. {
  37.     while (*str)
  38.     {
  39.         ESP12_SendData(*str++);
  40.     }
  41. }

  42. /***********************************************************************************************************************
  43.   * @brief
  44.   * @param
  45.   * @retval
  46.   * @attention
  47.   *********************************************************************************************************************/
  48. uint8_t ESP12_AT_WaitForReply(char *Keyword)
  49. {
  50.     while (QUEUE_EMPTY() == 0)
  51.     {
  52.         ESP12_Buffer[ESP12_Length++] = QUEUE_POP();

  53.         if (strstr((char *)ESP12_Buffer, Keyword) != NULL)
  54.         {
  55.             return (1);
  56.         }
  57.     }

  58.     return (0);
  59. }

  60. /***********************************************************************************************************************
  61.   * @brief
  62.   * @param
  63.   * @retval
  64.   * @attention
  65.   *********************************************************************************************************************/
  66. uint16_t ESP12_AT_SendCommand(char *Command, char *Response, uint16_t Timeout)
  67. {
  68.     if (Command != NULL)
  69.     {
  70.         QUEUE_INIT();

  71.         ESP12_SendString(Command);
  72.         ESP12_SendString("\r\n");
  73.     }

  74.     if (0 != Timeout)
  75.     {
  76.         ESP12_InitBuffer();

  77.         while (Timeout--)
  78.         {
  79.             if (0 != ESP12_AT_WaitForReply(Response))
  80.             {
  81.                 return (1);
  82.             }

  83.             TimeSliceDelayMS(1);
  84.         }

  85.         return (0);
  86.     }

  87.     return (1);
  88. }

  89. /***********************************************************************************************************************
  90.   * @brief
  91.   * @param
  92.   * @retval
  93.   * @attention
  94.   *********************************************************************************************************************/
  95. void ESP12_Configure(void)
  96. {
  97.     uint8_t Result = 0;

  98.     OLED_Clear();
  99.     OLED_ShowString(0, 0, "Step:01", 16);
  100.     OLED_ShowString(0, 2, "ESP12 Configure", 16);
  101.     TimeSliceDelayMS(500);

  102.     do
  103.     {
  104.         TimeSliceDelayMS(10);

  105.         Result = ESP12_AT_SendCommand("AT", "OK", 100);

  106.     } while (0 == Result);

  107.     OLED_Clear();
  108.     OLED_ShowString(0, 0, "Step:02", 16);
  109.     OLED_ShowString(0, 2, "AT->OK", 16);
  110.     TimeSliceDelayMS(500);

  111.     /* 开回显 */
  112.     ESP12_AT_SendCommand("ATE1", "OK", 100);

  113.     OLED_Clear();
  114.     OLED_ShowString(0, 0, "Step:03", 16);
  115.     OLED_ShowString(0, 2, "ATE1", 16);
  116.     TimeSliceDelayMS(500);

  117.     /* 查询版本信息 */
  118.     ESP12_AT_SendCommand("AT+GMR", "OK", 100);

  119.     OLED_Clear();
  120.     OLED_ShowString(0, 0, "Step:04", 16);
  121.     OLED_ShowString(0, 2, "AT+GMR", 16);
  122.     TimeSliceDelayMS(500);

  123.     /* 设置当前Wi-Fi模式: Station模式 */
  124.     ESP12_AT_SendCommand("AT+CWMODE=1", "OK", 100);

  125.     OLED_Clear();
  126.     OLED_ShowString(0, 0, "Step:05", 16);
  127.     OLED_ShowString(0, 2, "Station Mode", 16);
  128.     TimeSliceDelayMS(500);

  129.     /* 连接WiFi */
  130.     if (ESP12_AT_SendCommand("AT+CWJAP="********","********"", "OK", 8000) == 0)
  131.     {
  132.         if (ESP12_AT_SendCommand(NULL, "OK", 8000) == 0)
  133.         {
  134.             OLED_Clear();
  135.             OLED_ShowString(0, 0, "WiFi Connect Error!", 16);
  136.             return;
  137.         }
  138.     }

  139.     OLED_Clear();
  140.     OLED_ShowString(0, 0, "Step:06", 16);
  141.     OLED_ShowString(0, 2, "WiFi Connect OK", 16);
  142.     TimeSliceDelayMS(500);

  143.     ESP12_WiFiFlag = 1;

  144.     /* 查询IP地址 */
  145.     ESP12_AT_SendCommand("AT+CIFSR", "OK", 100);

  146.     OLED_Clear();
  147.     OLED_ShowString(0, 0, "Step:07", 16);
  148.     OLED_ShowString(0, 2, "Get IP", 16);
  149.     TimeSliceDelayMS(500);

  150.     /* 设置单链接 */
  151.     ESP12_AT_SendCommand("AT+CIPMUX=0", "OK", 100);

  152.     OLED_Clear();
  153.     OLED_ShowString(0, 0, "Step:08", 16);
  154.     OLED_ShowString(0, 2, "AT+CIPMUX=0", 16);
  155.     TimeSliceDelayMS(500);

  156.     /* 连接服务器 */
  157.     if (ESP12_AT_SendCommand("AT+CIPSTART="TCP","api.seniverse.com",80", "OK", 8000) == 0)
  158.     {
  159.         OLED_Clear();
  160.         OLED_ShowString(0, 0, "Server Connect Error!", 16);
  161.         return;
  162.     }

  163.     OLED_Clear();
  164.     OLED_ShowString(0, 0, "Step:09", 16);
  165.     OLED_ShowString(0, 2, "Server Connect OK", 16);
  166.     TimeSliceDelayMS(500);

  167.     ESP12_ServerFlag = 1;

  168.     /* 透明传输 */
  169.     ESP12_AT_SendCommand("AT+CIPMODE=1", "OK", 100);

  170.     OLED_Clear();
  171.     OLED_ShowString(0, 0, "Step:10", 16);
  172.     OLED_ShowString(0, 2, "AT+CIPMODE=1", 16);
  173.     TimeSliceDelayMS(500);

  174.     /* 开始传输 */
  175.     if (ESP12_AT_SendCommand("AT+CIPSEND", ">", 1000) == 0)
  176.     {
  177.         OLED_Clear();
  178.         OLED_ShowString(0, 0, "Transfer Not Ready...", 16);
  179.         return;
  180.     }

  181.     OLED_Clear();
  182.     OLED_ShowString(0, 0, "Step:11", 16);
  183.     OLED_ShowString(0, 2, "Transfer Ready", 16);
  184.     TimeSliceDelayMS(500);

  185.     ESP12_InitFlag = 1;
  186. }
复制代码

6.OLED显示实时温度
OLED在配置ESP-01的步骤时,会进行相应的提示;在与知心天气服务器建立通讯后,会定期的向服务器发送获取信息的请求,服务器在收到请求后会核对信息和密钥,然后返回数据;返回的数据是JSON格式的,在C51中我们为了节省空间和操作,直接使用字符串的函数进行提取操作,并显示相应的信息到OLED显示屏上……
  1. /***********************************************************************************************************************
  2.   * @brief
  3.   * @param
  4.   * @retval
  5.   * @attention
  6.   *********************************************************************************************************************/
  7. void ESP12_TxHandler(void)
  8. {
  9.     if (1 == ESP12_InitFlag)
  10.     {
  11.         /* 每间隔5秒获取一次天气信息, 服务器限制每分钟最多20次!!! */
  12.         ESP12_SendString("GET https://api.seniverse.com/v3/weather/now.json?key=*****************&location=shanghai&language=zh-Hans&unit=c\r\n");
  13.     }
  14. }

  15. /***********************************************************************************************************************
  16.   * @brief
  17.   * @param
  18.   * @retval
  19.   * @attention
  20.   *********************************************************************************************************************/
  21. void ESP12_RxHandler(void)
  22. {
  23.     static uint8_t BraceCount = 0;
  24.     static uint8_t BraceState = 0;
  25.     uint8_t RxData = 0;

  26.     if (0 == QUEUE_EMPTY())
  27.     {
  28.         if (0 == BraceState)
  29.         {
  30.             BraceState = 1;
  31.             BraceCount = 0;

  32.             ESP12_InitBuffer();
  33.         }

  34.         RxData = QUEUE_POP();

  35.         ESP12_Buffer[ESP12_Length++] = RxData;

  36.         switch (RxData)
  37.         {
  38.             case 0x7B:
  39.                 BraceCount++;
  40.                 break;

  41.             case 0x7D:
  42.                 BraceCount--;

  43.                 if (0 == BraceCount)
  44.                 {
  45.                     BraceState = 2;
  46.                 }
  47.                 break;

  48.             default:
  49.                 break;
  50.         }

  51.         if (ESP12_Length >= sizeof(ESP12_Buffer))
  52.         {
  53.             ESP12_Length = 0;
  54.         }
  55.     }
  56.     else
  57.     {
  58.         if (2 == BraceState)
  59.         {
  60.             BraceState = 0;

  61.             OLED_ShowString(0, 0, strstr((char *)ESP12_Buffer, ""temperature""), 16);
  62.         }
  63.     }
  64. }
复制代码


演示视频:



软件工程源代码:
Project_NBK-RD8x3x_NBK-EBS003.zip (204.14 KB, 下载次数: 28)

评论

结构清晰,代码详细,实现效果较好,视频展示也很不错,采用AT指令方式与模块通信,简单快捷。  发表于 2023-3-6 15:57
tabmone 发表于 2023-3-7 20:34 | 显示全部楼层
IOT可以扩展esp8266的wifi板子。
hilahope 发表于 2023-3-7 21:11 | 显示全部楼层
这个wifi接口的速度怎么样?              
primojones 发表于 2023-3-7 22:22 | 显示全部楼层
使用是易码魔盒开发的吗?              
RDS小定 发表于 2023-10-10 17:32 | 显示全部楼层
好贴,顶起
callhgd 发表于 2024-11-16 10:30 | 显示全部楼层
不错,给小哥点赞,俺 学习学习。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:King.Xu

77

主题

3023

帖子

38

粉丝
快速回复 在线客服 返回列表 返回顶部