数码之家

 找回密码
 立即注册
搜索
查看: 6414|回复: 9

[外设] 考研倒计时时钟 ESP8266 + STM32F410 +SSD1309

[复制链接]
发表于 2021-9-24 20:01:15 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
毕业工作后好久没搞单片机了,中秋节放假,女友考研倒计时不足100天了,正好有空翻到了以前玩剩下的电子模块组装了下,搞了个倒计时时钟。
1632483920337.jpg

1632483929735.jpg

本来想用ESP8266直接驱动屏幕的,按教程折腾半天也刷不进去固件,就放弃了,按教程IO01拉低,再上电,刷固件怎么搞都不行。评论区有懂行的大佬欢迎留言。
然后我就把大学例申请的stm32 开发板废物利用,驱动了屏幕,还得搞个自动设定时间功能,看ESP8266 的AT指令上有个NTP 功能,不成想我的模块里面的固件还不支持这个功能。
image.png

最后搞了个透传模式,再在电脑上搞了给TCP服务端每次主动给授时就好了。:lol:

下面为实现代码



  1. #include "mbed.h"
  2. #include "string"
  3. #include "Adafruit_SSD1306.h"
  4. #include "platform\ATCmdParser.h"
  5. #include "drivers\UARTSerial.h"
  6. #include <time.h>
  7. string str = "";
  8. char inchar;
  9. bool strover = false;
  10. RawSerial pc(SERIAL_TX, SERIAL_RX);
  11. //DigitalOut led(LED1);

  12. // an SPI sub-class that provides a constructed default
  13. class SPIPreInit : public SPI
  14. {
  15. public:
  16.     SPIPreInit(PinName mosi, PinName miso, PinName clk) : SPI(mosi, miso, clk)
  17.     {
  18.         format(8, 3);
  19.         frequency(2000000);
  20.     };
  21. };

  22. /*void UART_Rx_irq()
  23. {
  24.         while (pc.readable())
  25.         {
  26.                         inchar = pc.getc();
  27.                         if (inchar != 'E')
  28.                                         str = str + inchar;

  29.                         if (inchar == 'E')
  30.                                         strover = true;
  31.         }
  32. }*/

  33. SPIPreInit gSpi(SPI_MOSI, SPI_MISO, SPI_SCK);
  34. Adafruit_SSD1306_Spi gOled1(gSpi, PB_1, PB_12, PC_4, 64, 128);

  35. //ESP8266 解析器
  36. #define ESP8266_DEFAULT_BAUD_RATE 115200

  37. UARTSerial *_serial;
  38. ATCmdParser *_parser;

  39. int main()
  40. {
  41.     pc.baud(115200);
  42.     pc.printf("hello world\r\n");
  43.     //pc.attach(&UART_Rx_irq, SerialBase::RxIrq);
  44.     // led = 1;

  45.     uint16_t x = 0;
  46.     gOled1.clearDisplay();
  47.     //gOled1.printf("%ux%u OLED Display\r\n", gOled1.width(), gOled1.height());
  48.     //set_time(1256729737);  // Set RTC time to Wed, 28 Oct 2009 11:35:37
  49.    ThisThread::sleep_for(1000.0);               
  50.     printf("\nATCmdParser with ESP8266 example");

  51.     _serial = new UARTSerial(PA_15, PB_7, ESP8266_DEFAULT_BAUD_RATE);
  52.     _parser = new ATCmdParser(_serial);
  53.                 _parser->set_timeout(1000);
  54.     _parser->debug_on(1);
  55.     _parser->set_delimiter("\r\n");
  56.           _parser->send("AT+TME");
  57.     char timetmp[80];
  58.     //if (_parser->scanf("TME:%s", timetmp) && _parser->recv("OK"))
  59.           if (_parser->read(timetmp,10) && _parser->recv("OK"))
  60.     {
  61.                          //_parser->read(timetmp,10);
  62.                          printf("\nATCmdParser: %s", timetmp);
  63.         set_time(atoi(timetmp)+28800);  // Set RTC time to Wed, 28 Oct 2009 11:35:37
  64.         printf("\nATCmdParser: tiem success");
  65.     }
  66.     else
  67.     {
  68.         printf("\nATCmdParser: time failed");
  69.         //return -1;
  70.     }

  71.                
  72.                
  73.                 while (1)
  74.     {
  75.         //gOled1.clearDisplay();
  76.         time_t seconds = time(NULL);
  77.         //gOled1.printf("%u\r", x);
  78.         // gOled1.printf("%s\r", ctime(&seconds));
  79.                        
  80.                                 string timeTp        ;
  81.                           //strftime(timeTp.data(),80,"%T.",seconds);
  82.         //gOled1.puts(timeTp.data());
  83.                          int targetTime = 1640448000+28800; //2021-12-26 00:00:00

  84.         char buffer[32];
  85.                                 gOled1.setTextSize(4);
  86.         gOled1.setTextCursor(0, 0);//时,分
  87.         strftime(buffer, 32, "%R\n", localtime(&seconds));
  88.         //printf("Time as a custom formatted string = %s", buffer);
  89.                                 gOled1.puts(buffer);
  90.                                 gOled1.setTextSize(2);
  91.                                 gOled1.setTextCursor(128-33,30);//秒
  92.                                 strftime(buffer, 32, "%S\n", localtime(&seconds));

  93.                                 gOled1.puts(buffer);

  94.         gOled1.setTextCursor(0, 64-8);//Countdown
  95.                                 gOled1.setTextSize(1);
  96.                                 gOled1.printf("Countdown");
  97.                                 gOled1.setTextSize(2);
  98.                                 gOled1.setTextCursor(65, 64-16);//天数
  99.                                 gOled1.printf("%d", (targetTime - seconds)/(24*60*60));
  100.                                 gOled1.setTextCursor(95, 64-8);//days
  101.                                 gOled1.setTextSize(1);
  102.                                 gOled1.printf("days");
  103.                                 gOled1.display();
  104.     }
  105. }


复制代码
这是服务端的代码


  1. import socket
  2. import time
  3. # 创建socket
  4. tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  5. # 本地信息
  6. address = ('', 8080)

  7. # 绑定
  8. tcp_server_socket.bind(address)

  9. tcp_server_socket.listen(128)

  10. while True:
  11.     # 等待新的客户端连接
  12.     client_socket, clientAddr = tcp_server_socket.accept()
  13.     while True:
  14.         # 接收对方发送过来的数据
  15.         recv_data = client_socket.recv(10)  # 接收10字节
  16.                      
  17.                                           
  18.         print('接收到的数据为:', recv_data.decode('gbk') )
  19.         send_data = time.time()
  20.         client_socket.send((str(int(send_data)+1)+'\r\n').encode("gbk"))
  21.         client_socket.send(('OK'+'\r\n').encode("gbk"))
  22.         recv_data_str = recv_data.decode('gbk')
  23.         if recv_data_str.startswith('AT+TME'):
  24.             print('接收到的命令:AT+TME')         
  25. #         time.sleep(5)
  26. #         client_socket.close()
  27. #         break
  28. #         if recv_data.fnmatch('file')== True:
  29.             
  30. #             print('startswith接收到的数据为:', recv_data.decode('gbk'))
  31. #             send_data = time.time()
  32. #             client_socket.send(send_data.encode("gbk"))
  33. #             client_socket.close()
  34. #         else:
  35. #             break
  36.    

  37. tcp_server_socket.close()
复制代码







打赏

参与人数 1家元 +80 收起 理由
家睦 + 80

查看全部打赏

发表于 2021-9-24 20:53:42 | 显示全部楼层
羡慕会编程的,现在一直在伸手党再修改
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-24 21:24:23 | 显示全部楼层
可能是给8266的供电不足,这家伙3.3V瞬间电流有时可达500mA
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-25 08:55:54 来自手机浏览器 | 显示全部楼层
居然还是新站第一贴…:praise:
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-25 13:06:58 | 显示全部楼层
本帖最后由 muyan 于 2021-9-25 13:08 编辑

0023aSxhzy7Mo6Ufzx8da.png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-25 21:07:24 | 显示全部楼层

感谢大佬指点,等我撸个电源回来再试试
回复 支持 反对

使用道具 举报

发表于 2021-9-27 13:11:24 | 显示全部楼层
这屏幕有点奢侈
过几天就烧屏了
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-28 22:16:27 | 显示全部楼层
还不如送个包包
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-29 16:12:21 | 显示全部楼层
这外壳还能在敷衍吗
回复 支持 反对

使用道具 举报

发表于 2021-9-29 16:52:51 | 显示全部楼层
IO0拉低进入刷机模式。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-19 06:53 , Processed in 0.280801 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表