|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
毕业工作后好久没搞单片机了,中秋节放假,女友考研倒计时不足100天了,正好有空翻到了以前玩剩下的电子模块组装了下,搞了个倒计时时钟。
本来想用ESP8266直接驱动屏幕的,按教程折腾半天也刷不进去固件,就放弃了,按教程IO01拉低,再上电,刷固件怎么搞都不行。评论区有懂行的大佬欢迎留言。
然后我就把大学例申请的stm32 开发板废物利用,驱动了屏幕,还得搞个自动设定时间功能,看ESP8266 的AT指令上有个NTP 功能,不成想我的模块里面的固件还不支持这个功能。
最后搞了个透传模式,再在电脑上搞了给TCP服务端每次主动给授时就好了。:lol:
下面为实现代码
- #include "mbed.h"
- #include "string"
- #include "Adafruit_SSD1306.h"
- #include "platform\ATCmdParser.h"
- #include "drivers\UARTSerial.h"
- #include <time.h>
- string str = "";
- char inchar;
- bool strover = false;
- RawSerial pc(SERIAL_TX, SERIAL_RX);
- //DigitalOut led(LED1);
- // an SPI sub-class that provides a constructed default
- class SPIPreInit : public SPI
- {
- public:
- SPIPreInit(PinName mosi, PinName miso, PinName clk) : SPI(mosi, miso, clk)
- {
- format(8, 3);
- frequency(2000000);
- };
- };
- /*void UART_Rx_irq()
- {
- while (pc.readable())
- {
- inchar = pc.getc();
- if (inchar != 'E')
- str = str + inchar;
- if (inchar == 'E')
- strover = true;
- }
- }*/
- SPIPreInit gSpi(SPI_MOSI, SPI_MISO, SPI_SCK);
- Adafruit_SSD1306_Spi gOled1(gSpi, PB_1, PB_12, PC_4, 64, 128);
- //ESP8266 解析器
- #define ESP8266_DEFAULT_BAUD_RATE 115200
- UARTSerial *_serial;
- ATCmdParser *_parser;
- int main()
- {
- pc.baud(115200);
- pc.printf("hello world\r\n");
- //pc.attach(&UART_Rx_irq, SerialBase::RxIrq);
- // led = 1;
- uint16_t x = 0;
- gOled1.clearDisplay();
- //gOled1.printf("%ux%u OLED Display\r\n", gOled1.width(), gOled1.height());
- //set_time(1256729737); // Set RTC time to Wed, 28 Oct 2009 11:35:37
- ThisThread::sleep_for(1000.0);
- printf("\nATCmdParser with ESP8266 example");
- _serial = new UARTSerial(PA_15, PB_7, ESP8266_DEFAULT_BAUD_RATE);
- _parser = new ATCmdParser(_serial);
- _parser->set_timeout(1000);
- _parser->debug_on(1);
- _parser->set_delimiter("\r\n");
- _parser->send("AT+TME");
- char timetmp[80];
- //if (_parser->scanf("TME:%s", timetmp) && _parser->recv("OK"))
- if (_parser->read(timetmp,10) && _parser->recv("OK"))
- {
- //_parser->read(timetmp,10);
- printf("\nATCmdParser: %s", timetmp);
- set_time(atoi(timetmp)+28800); // Set RTC time to Wed, 28 Oct 2009 11:35:37
- printf("\nATCmdParser: tiem success");
- }
- else
- {
- printf("\nATCmdParser: time failed");
- //return -1;
- }
-
-
- while (1)
- {
- //gOled1.clearDisplay();
- time_t seconds = time(NULL);
- //gOled1.printf("%u\r", x);
- // gOled1.printf("%s\r", ctime(&seconds));
-
- string timeTp ;
- //strftime(timeTp.data(),80,"%T.",seconds);
- //gOled1.puts(timeTp.data());
- int targetTime = 1640448000+28800; //2021-12-26 00:00:00
- char buffer[32];
- gOled1.setTextSize(4);
- gOled1.setTextCursor(0, 0);//时,分
- strftime(buffer, 32, "%R\n", localtime(&seconds));
- //printf("Time as a custom formatted string = %s", buffer);
- gOled1.puts(buffer);
- gOled1.setTextSize(2);
- gOled1.setTextCursor(128-33,30);//秒
- strftime(buffer, 32, "%S\n", localtime(&seconds));
- gOled1.puts(buffer);
- gOled1.setTextCursor(0, 64-8);//Countdown
- gOled1.setTextSize(1);
- gOled1.printf("Countdown");
- gOled1.setTextSize(2);
- gOled1.setTextCursor(65, 64-16);//天数
- gOled1.printf("%d", (targetTime - seconds)/(24*60*60));
- gOled1.setTextCursor(95, 64-8);//days
- gOled1.setTextSize(1);
- gOled1.printf("days");
- gOled1.display();
- }
- }
复制代码这是服务端的代码
- import socket
- import time
- # 创建socket
- tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- # 本地信息
- address = ('', 8080)
- # 绑定
- tcp_server_socket.bind(address)
- tcp_server_socket.listen(128)
- while True:
- # 等待新的客户端连接
- client_socket, clientAddr = tcp_server_socket.accept()
- while True:
- # 接收对方发送过来的数据
- recv_data = client_socket.recv(10) # 接收10字节
-
-
- print('接收到的数据为:', recv_data.decode('gbk') )
- send_data = time.time()
- client_socket.send((str(int(send_data)+1)+'\r\n').encode("gbk"))
- client_socket.send(('OK'+'\r\n').encode("gbk"))
- recv_data_str = recv_data.decode('gbk')
- if recv_data_str.startswith('AT+TME'):
- print('接收到的命令:AT+TME')
- # time.sleep(5)
- # client_socket.close()
- # break
- # if recv_data.fnmatch('file')== True:
-
- # print('startswith接收到的数据为:', recv_data.decode('gbk'))
- # send_data = time.time()
- # client_socket.send(send_data.encode("gbk"))
- # client_socket.close()
- # else:
- # break
-
- tcp_server_socket.close()
复制代码
|
打赏
-
查看全部打赏
|