偶然在b站看到这个项目机械数码管,正好手边有个ESP8266模块还有PCA9685就来做一下。
模型下载地址

目前就搞了一个数字,未来工厂3d打印太贵了

PCA9685

要先设置频率寄存器才能有输出,想设置频率寄存器必须先把MODE1寄存器的SLEEP位置一。

void set_freq(float freq)
{u16 prescale,oldmode,newmode;float prescaleval;unsigned int day_time = 0;freq *= 0.92;                                   prescaleval = 25000000;                        prescaleval /= 4096;                       //prescaleval=round(osc_cloc/4096/freq)-1;prescaleval /= freq;prescaleval -= 1;prescale = floor(prescaleval + 0.5);        oldmode = I2C_Read_One_Byte(0x80, PCA9685_MODE1_reg);        newmode = (oldmode&0xEF) | 0x10;              I2C_Write_One_Byte(0x80, PCA9685_MODE1_reg, newmode);        I2C_Write_One_Byte(0x80, PCA9685_PRE_SCALE_reg, prescale);   I2C_Write_One_Byte(0x80, PCA9685_MODE1_reg, oldmode);delay_ms(2);I2C_Write_One_Byte(0x80, PCA9685_MODE1_reg, (oldmode | 0xa1));
}

ESP8266

ESP8266测试

先连接esp8266到电脑,用串口助手发送命令检测模块的功能

#测试模块能否正常工作
AT
#设置模块为sta模式
AT+CWMODE=1
#重启试生效
AT+RST
#连接WiFi
AT+CWJAP="热点名字","密码"
#设置单路模式
AT+CIPMUX=0

时间API

我使用的是淘宝免费的api

#TCP连接
AT+CIPSTART="TCP","api.m.taobao.com",80
#发送71个字符
AT+CIPSEND=71

出现“>”可以发送指令

输入GET命令,获取时间:

GET http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp

#透传模式开
AT+CIPMODE=1
#发送数据
AT+CIPSEND

esp8266退出透传模式重新使能AT命令发送“+++”(注意取消串口助手的发送新行)。实际连接单片机使用时出现不断重启的问题,检查后发现应该时模块的供电不够导致的。

串口控制ESP8266

实际使用时发现还是不进入透传模式更方便

char tcp_con[] = "AT+CIPSTART=\"TCP\",\"api.m.taobao.com\",80\r\n";
char send_comm[] = "AT+CIPSEND=71\r\n";
char get_comm[] = "GET http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp\r\n";esp8266_init_time();
while(time_flag == NON_OK);
time_flag = NON_OK;void esp8266_init_time()
{esp8266_send(tcp_con);delay_ms(100);esp8266_send(send_comm);delay_ms(100);esp8266_send(get_comm);delay_ms(100);
}void esp8266_send(char* str)
{uart4_send_str(str);
}

串口4接收返回的时间戳

每次串口接收到新行“\r\n”,接收缓冲区就从头开始接收。根据实际得到的淘宝网返回的字符串格式,发现字符串开头是“+IPD”结尾是“CLOSED”,把这个当作帧头帧尾查找,确定unix时间戳字符所在的位置并将其转化成数值。

u8 day_hour = 0;
u8 day_min = 0;
u8 day_sec = 0;void UART4_IRQHandler()
{u8 res;static int index = 0;u8 counter = 0;unsigned int multi = 1;unsigned int day_time = 0;   if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET){res = USART_ReceiveData(UART4);rxbuff[index] = res;if((rxbuff[index] == '\n') && (rxbuff[index-1] == '\r')){if((rxbuff[index-2] == 'D')&&(rxbuff[index-3] == 'E')&&(rxbuff[index-4] == 'S')&&(rxbuff[index-5] == 'O')&&(rxbuff[index-6] == 'L')&&(rxbuff[index-7] == 'C')&&(rxbuff[0] == '+')){unix_time = 0;multi = 1;for(counter = 0;counter < 10;counter++){unix_time += (rxbuff[111-counter] - 0x30) * multi;    multi = multi * 10;}               day_time = unix_time % 86400;day_hour = day_time / 3600 + 8;day_min   = (day_time % 3600) / 60;day_sec  = (day_time % 3600) % 60;//day_hour = day_hour + 8;//printf("%d:%2d:%2d\r\n", day_hour, day_min, day_sec);time_flag = OK;}index = 0;}else{index++;}}
}

stm32f1串口发送

使用串口发送字符串时,出现了第一个字符发送不出来的情况。
置零sr的tc位:

UART4->SR |= 0xBF;

或者读取一下SR寄存器:

(void)UART4->SR;

定时器每秒钟刷新时间每小时对时一次

#define CHECK_DURATION 3600
void TIM2_IRQHandler(void)   //TIM3??
{static u8 flag = 0;static unsigned int counter = 0;if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //??TIM3????????{        if(counter == CHECK_DURATION){esp8266_init();//while(time_flag == NON_OK);time_flag = NON_OK;counter = 0;printf("TIME_SYNC\r\n");}else{if(day_sec == 59){day_sec = 0;if(day_min == 59){day_min = 0;if(day_hour == 23){day_hour = 0;}else{day_hour++;}}else{day_min++;}}else{day_sec++;}counter++;}if(flag == 0){GPIO_ResetBits(GPIOG,GPIO_Pin_13);flag = ~flag;}else{GPIO_SetBits(GPIOG,GPIO_Pin_13);flag = ~flag;}        printf("%d:%2d:%2d\r\n", day_hour, day_min, day_sec);     }TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}

如下图可以得到正确的时间:

字符编码

//                 A           B           C           D           E           F           G
char number[] = {0xcd, 0x00, 0xcd, 0x00, 0x99, 0x01, 0xcd, 0x00, 0x99, 0x01, 0xcd, 0x00, 0xcd, 0x00,               //00x99, 0x01, 0x99, 0x01, 0x99, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0x99, 0x01,              //10xcd, 0x00, 0x99, 0x01, 0x99, 0x01, 0x99, 0x01, 0x99, 0x01, 0x99, 0x01, 0xcd, 0x00,              //20xcd, 0x00, 0x99, 0x01, 0x99, 0x01, 0x99, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0xcd, 0x00,              //30x99, 0x01, 0xcd, 0x00, 0x99, 0x01, 0x99, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0x99, 0x01,              //40xcd, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0x99, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0xcd, 0x00,              //50xcd, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0x99, 0x01, 0x99, 0x01, 0xcd, 0x00, 0xcd, 0x00,              //60xcd, 0x00, 0x99, 0x01, 0x99, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0x99, 0x01,              //70xcd, 0x00, 0xcd, 0x00, 0x99, 0x01, 0x99, 0x01, 0x99, 0x01, 0xcd, 0x00, 0xcd, 0x00,              //80xcd, 0x00, 0xcd, 0x00, 0x99, 0x01, 0x99, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0xcd, 0x00};                 //9//在定时器中断当中调用
void set_num(char num)
{//AI2C_Write_One_Byte(0x80, PCA9685_CH0_ON_L_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH0_ON_H_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH0_OFF_L_reg, number[num*14]);I2C_Write_One_Byte(0x80, PCA9685_CH0_OFF_H_reg, number[num*14+1]);//199-0 cd-1//delay_ms(500);//BI2C_Write_One_Byte(0x80, PCA9685_CH1_ON_L_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH1_ON_H_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH1_OFF_L_reg, number[num*14+2]);I2C_Write_One_Byte(0x80, PCA9685_CH1_OFF_H_reg, number[num*14+3]);//199-0 cd-1//delay_ms(500);//CI2C_Write_One_Byte(0x80, PCA9685_CH2_ON_L_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH2_ON_H_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH2_OFF_L_reg, number[num*14+4]);I2C_Write_One_Byte(0x80, PCA9685_CH2_OFF_H_reg, number[num*14+5]);//199-0 cd-1//delay_ms(500);//DI2C_Write_One_Byte(0x80, PCA9685_CH3_ON_L_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH3_ON_H_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH3_OFF_L_reg, number[num*14+6]);I2C_Write_One_Byte(0x80, PCA9685_CH3_OFF_H_reg, number[num*14+7]);//199-0 cd-1//delay_ms(500);//EI2C_Write_One_Byte(0x80, PCA9685_CH4_ON_L_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH4_ON_H_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH4_OFF_L_reg, number[num*14+8]);I2C_Write_One_Byte(0x80, PCA9685_CH4_OFF_H_reg, number[num*14+9]);//199-0 cd-1//delay_ms(500);//FI2C_Write_One_Byte(0x80, PCA9685_CH5_ON_L_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH5_ON_H_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH5_OFF_L_reg, number[num*14+10]);I2C_Write_One_Byte(0x80, PCA9685_CH5_OFF_H_reg, number[num*14+11]);//199-0 cd-1//delay_ms(500);//GI2C_Write_One_Byte(0x80, PCA9685_CH6_ON_L_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH6_ON_H_reg, 0x00);I2C_Write_One_Byte(0x80, PCA9685_CH6_OFF_L_reg, number[num*14+12]);I2C_Write_One_Byte(0x80, PCA9685_CH6_OFF_H_reg, number[num*14+13]);//199-0 cd-1
}

stm32 esp8266 MG90S 机械数码管相关推荐

  1. 古董万年历升级WiFi授时 STM32+ESP8266

    [小制作]古董万年历升级WiFi授时 STM32+ESP8266 故事,还得从一只蝙蝠说起... 先来看一下前后对比 硬件方面 升级之前 升级之后 功能方面 调用序列图-这里只放个大概 详细的还得结合 ...

  2. 【STM32实战】机械臂快递分拣系统(二)——机械臂控制程序(上位机)编写

    [STM32实战]机械臂快递分拣系统(二)--机械臂控制程序(上位机)编写 前言 题目分析 蓝牙模块的使用 上位机程序的编写 连接阿里云 测试 前言 近期回校上最后一门课,刚好是做机械臂有关的题目,所 ...

  3. STM32 ESP8266和Java服务器透传模式下的双向通信

    系列文章: ESP8266的AP模式与STA模式简单测试 简单的Java服务器和客户端的通信 STM32 ESP8266和Java服务器透传模式下的双向通信 jsp向servlet传输数据 Servl ...

  4. STM32+ESP8266连接电脑Qt网络上位机——QT篇

    本文简单介绍下手写网络调试器并连接ESP8266模块 上篇:  STM32+ESP8266连接电脑Qt网络上位机--准备工作 目录 一.部分Qt代码及实现过程 二.实现过程--使用ESP8266连接上 ...

  5. STM32+ESP8266使用MQTTAT固件连接云

    最近在做毕设,其中想把STM32连接ESP8266来连接云平台.一开始是想直接编写一个使用MQTT协议上云的代码来完成的,但因为没有物联网的知识,想直接移植别人写好的又很难放进我自己的代码里,导致进度 ...

  6. stm32 esp8266 ota升级-自建mqtt和文件服务器全量升级

    stm32 esp8266 ota系列文章: stm32 esp8266 ota-快速搭建web服务器之docker安装openresty stm32 esp8266 ota升级-tcp模拟http ...

  7. STM32+ESP8266+MQTT微信小程序SoftAP一键配网接入腾讯物联网平台

    STM32+ESP8266+MQTT微信小程序SoftAP一键配网接入腾讯物联网平台   Wi-Fi 配网,指由外部向 Wi-Fi 设备提供 SSID 和密码(PSW),让 Wi-Fi 设备可以连接指 ...

  8. stm32+esp8266 GET请求心知天气的简单方法

    文章目录 前言 一.ESP8266调试 二.代码部分 1.esp8266部分 2.单片机代码部分 总结 前言 因为之前学习stm32+esp8266请求心知天气时看的不是很懂,然后在成功调试出来之后发 ...

  9. 【开源】手机APP通过IoT点亮LED灯(STM32+ESP8266+阿里云+MQTT+Android)

    (STM32+ESP8266+阿里云+MQTT+Android) 本项目利用Android Studio编写了连接阿里云和MQTT的APP,并在UI界面简单设计了标题,连接按钮,点灯按钮,灭灯按钮.如 ...

最新文章

  1. 专访4秒源码商城CTO陈杰:扎根互联网的“不安的心”
  2. Ubuntu 屏幕亮度调整
  3. final—前后端分离的网站
  4. 连接Oracle时ORA-12541 TNS 无监听程序
  5. linux抓包命令不用root用户,linux中非root用户使用wireshark进行抓包
  6. knn k-近邻 学习笔记
  7. 利用 MATLAB 和 DCRAW 处理数码相机 RAW 文件的完整流程
  8. 手机html5测试苹果八,怎么简单质检你的iPhone手机以及真假判断!
  9. html:optionscollection 默认值,关于html:options collection= /的使用
  10. Python进行各项统计检验
  11. IDC发布最新中国AI云服务市场报告,百度智能云连续三次排名第一
  12. WBS:工作分解结构(Work Breakdown Structure)
  13. 数学用计算机开方,开方(数学术语)_百度百科
  14. 怎么下载lce_icesword下载
  15. 如何设计淘宝天猫这种成功而有价值大数据可视化?
  16. python 爬取 强智科技教务系统(湖南)
  17. 用Vue-cli从头搭建项目
  18. 《Hadoop》之踽踽独行(一)大数据概述
  19. 我的世界java版如何装mod_我的世界MOD安装详解教程 全方位介绍MOD
  20. 笔记本电脑同时连接内外网亲测有效

热门文章

  1. php禁止f12调试,网站如何禁用f12 禁止调试代码
  2. 根据百度地图API自定义切换地图类型为卫星或普通
  3. 100天精通Python丨办公效率篇 —— 12、Python自动化操作 office-word(word转pdf、转docx、段落、表格、标题、页面、格式)
  4. python函数**什么意思_python中函数的参数是什么意思
  5. 撸了隔壁的网,满足一下窝的偷窥癖
  6. PHP邮件功能无法完成电子邮件的发送
  7. GHNN调试运行部分报错解决
  8. 我的Linux学习之旅
  9. 将Vue通过nginx部署到阿里云服务器上
  10. 安徽科技学院 信网学院网络文化节 曾伟