偶然在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. centos安装后两个启动项、_centos8的启动项配置
  2. spring8: di依赖注入--构造注入
  3. 数据集整理(ing)
  4. idea 设置单行注释样式(不在行首注释)
  5. 微服务难点剖析 | 服务拆的挺爽,问题是日志该怎么串联起来呢?
  6. android的应用组件,跟我学android-Android应用基本组件介绍(五)
  7. c语言数据类型、运算符和表达式
  8. 持续集成部署Jenkins工作笔记0020---20.在GitHub上创建WebHook
  9. optionMenu如何弹出
  10. BBS(仿博客园系统)项目01(项目分析、表结构设计、注册功能实现)
  11. poj 匈牙利二分匹配 模板 poj题目
  12. CCF NOI1097 数列
  13. ADS1112|MS1112|16位AD转换芯片|国产兼容PIN-TO-PIN。兼容替代无需修改软硬件
  14. 主分区、扩展分区、逻辑分区、活动分区
  15. Android 屏幕旋转流程分析
  16. VC++利用微软msxml3.dll创建xml文件
  17. mybatis报错:Error evaluating expression
  18. 阿里面试官鬼得很,问我为什么他们阿里要禁用Executors创建线程池?
  19. 单片机_第6章 单片机的定时/计数器
  20. Numpy中reshape的用法

热门文章

  1. 数字IC设计 - 使用VCS逻辑仿真工具
  2. Microsoft SQL Server 2000 简体中文企业版+SP4升级补丁
  3. 50W闭环控制Boost DC-DC变换器样机设计
  4. ECE认证机构怎么选?
  5. python中的mat的操作
  6. yum安装zabbix5.0并配置grafana模板【2W字超详细】
  7. 嵌入式系统概论-5-总线
  8. VS连接Linux服务器
  9. VS 杂项文件全面解决方法
  10. 【最新计算机、电子毕业设计 本科 大专 设计+源码】