IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 2021-11-10 -> 正文阅读

[嵌入式]2021-11-10

基于 ESP8266-12F 墨水屏天气时钟模块驱动记录

在这里插入图片描述


前言

偶然看上一块开源的 4.2 英寸墨水屏天气时钟 PCB,但其不提供源码,那就考虑自己 DIY 固件了。由于首次接触 8266 ,在制作的过程中,遇到了一些小问题。就想着把其中涉及的一些模块驱动方法做个整理,含各模块驱动源码。


一、内容概述

  • SHT20 温湿度传感器驱动
  • 联网获取室外温度和天气
  • 联网获取网络时间
  • 网络连接状态提示
  • 电源电压检测与板载 LED

二、代码分析

1.温湿度传感器 SHT20

由于硬件电路已固定,使用 Arduino 框架编程时。原本的sht20的驱动库因为接口A4,A5为固定接口无法继续使用。参考sht20的数据手册,在网上找到了一个软件 IIC 的库 ,通过写入对应的地址和命令,自行驱动 sht20,当然,得到的数据还需要以一定的公式转换为实际的温湿度,可参考数据手册。具体的温湿度获取代码如下所示:
#include "brzo_i2c.h"                  //IIC库

#define   dev_addr      0x40           // sht20命令宏,具体参考手册
#define   T_code        0xF3
#define   RH_code       0xF5
#define   add_w         0x80
#define   add_r         0x81
#define   user_code_w   0xE6
#define   user_code_r   0xE7
#define   RST_code      0xFE

unsigned char trig_T[2]={T_code};       // 温度测量命令      
unsigned char trig_RH[2]={RH_code};     // 湿度测量命令
unsigned char ReadBuf[2];               // 温度或湿度数据缓存

char sda = 13;                          // sht20 数据总线
char scl = 14;                          // sht20 时钟总线

//===================SHT20初始化==================
void sht20Init(void)
{
  brzo_i2c_setup(sda,scl,500);          // 500是超时时间
}

//===================获取SHT20温度==================
float sht20GetTemp(void)
{
  sht20Init();
  brzo_i2c_start_transaction(dev_addr,100);     // brz的库需要填入7位地址,通信速率100KHz
  brzo_i2c_write(trig_T,1,true);                // 重复start信号为true;否则会通信不稳定
  brzo_i2c_end_transaction();
  delay(85);                                    // 温度测量完成时间:85ms
  brzo_i2c_start_transaction(dev_addr,100);
  brzo_i2c_read (ReadBuf,2 ,true);              // 直接读设备地址内存即可
  brzo_i2c_end_transaction();
  uint temp =(ReadBuf[0]<<8)|ReadBuf[1]; 
  float res = (temp*175.72)/65536-46.85; 
  return res;    
}
//===================获取SHT20湿度==================
float sht20GetHumi(void)
{
  brzo_i2c_start_transaction(dev_addr,100);     // brz的库需要填入7位地址,通信速率100KHz
  brzo_i2c_write(trig_RH,1,true);               // 重复start信号为true;否则会通信不稳定
  brzo_i2c_end_transaction();
  delay(29);                                    // 湿度测量完成时间:29ms
  brzo_i2c_start_transaction(dev_addr,100);
  brzo_i2c_read (ReadBuf,2 ,true);              // 直接读设备地址内存即可
  brzo_i2c_end_transaction();
  uint temp =(ReadBuf[0]<<8)|ReadBuf[1]; 
  float res = (temp*125)/65536-6;
  return res;    
}

2.获取心知天气

考虑到初学者,具体说明一下吧。首先,需要注册一个心知天气的登陆账号,然后申请一个私钥 reqUserKey ,配合自己想要获取信息的城市,构建出完整的网址。其次,利用 Arduino 库方法就能够轻松地获取天气信息了。参考代码如下:

#include <ESP8266_Seniverse.h>     //心知天气库

WeatherNow     WN;                 // 创建心知天气的对象
//===================初始化信息==================
void initWeather()
{
   // 心知天气请求所需信息
  const char* reqUserKey = "你的私钥";           // 私钥
  const char* reqLocation = "beijing";           // 城市,如北京
  const char* reqUnit = "c";                     // 摄氏(c),华氏(f)
  WN.config(reqUserKey, reqLocation, reqUnit);
}

//===================获取天气信息==================
void getWeatherData()
{
  if(WN.update())
  {  
    Serial.println(F("======Weahter Info======"));
    Serial.print("服务器响应码: ");
    Serial.println(WN.getServerCode());     // 获取服务器响应码
    Serial.print(F("天气 "));
    Serial.print(WN.getWeatherText());      // 获取当前天气(字符串格式)
    Serial.print(F(" "));
    Serial.println(WN.getWeatherCode());    // 获取当前天气(整数格式)
    Serial.print(F("温度: "));
    Serial.println(WN.getDegree());         // 获取当前温度数值
    Serial.print(F("最近更新: "));
    Serial.println(WN.getLastUpdate());     // 获取服务器更新天气信息时间
    Serial.println(F("========================"));   
    Out_Temp = int(WN.getDegree());       
    Out_weather = int(WN.getWeatherCode());   
  } 
}

3.获取网络时间

这部分的原理是:通过苏宁授时网址,得到网络时间的相关Json信息,然后通过解析相关信息,得到具体的网络时间。参考代码如下:

#include <ESP8266HTTPClient.h>          //网络时间库

HTTPClient http;                        // 网络时间对象
String GetUrl;                          // 网络时间网址
String response;                        // 返回网络时间

String ymd;                             //年-月-日
String hms;                             //时-分-秒

//===================初始化==================
void internetTimeInit(void)
{
  // 连接苏宁网站的授时网页
  GetUrl = "http://quan.suning.com/getSysTime.do";
  http.setTimeout(5000);
  http.begin(GetUrl);
}

//===================获取网络时间==================
void getRealTime(void)
{
  const size_t cap = JSON_OBJECT_SIZE(2)+30;    // 2条内容+30余量RAM
  DynamicJsonDocument doc(cap);                 // json解析  
  int httpCode = http.GET();
  if (httpCode > 0){
    Serial.printf("[HTTP] GET... code: %d\n", httpCode);
    if (httpCode == HTTP_CODE_OK) {
    //读取响应内容
      response = http.getString();
      deserializeJson(doc,response);                        //解析json信息
      ymd = (doc["sysTime2"].as<String>()).substring(0,10); //得到年月日
      hms = (doc["sysTime2"].as<String>()).substring(11,19);//得到时分秒
    }
  }
  http.end();
}

4.获取网络连接状态

为了判断时钟的实时联网状态,需要进行网络连接状态的获取。这部分是利用 WiFi 库函数实现的,具体可以参考Google;CF是网络连接标志位,相关判断代码如下:

#include <ESP8266WiFi.h>          // wifi库

void internetState(void)
{
  if(WiFi.status()==3){
    CF = 1;                       // 返回值0-6,只有3才表示网络为连接状态
  }
}

5.电压检测与板载 LED

ESP8266-12F 的 ADC 接口对应 Arduino 中的 A0 口,ADC 的输入电压是 0-1V。板载 LED 的接口连接到了 GPIO2,其余的就没什么好说的了。


6.墨水屏驱动

微雪 4.2 寸屏的官方资料提供了一些例程,但是不够详细。并且部分代码写的过于复杂,如数据的显示。微雪的方法是将数据拆分成百位、十位等,然后再通过字符变量写入RAM,我对此进行了改进,通过引入 C 库函数 c_str 将字符串转换成字符,可以直接用字符串的方式写入变量。此处记录一下我的改进方法,对比官方的看看效果,参考代码如下:

6.1 官方代码

  char time_string[] = {'0', '0', ':', '0', '0', '\0'};
  time_string[0] = time_now_s / 60 / 10 + '0';
  time_string[1] = time_now_s / 60 % 10 + '0';
  time_string[3] = time_now_s % 60 / 10 + '0';
  time_string[4] = time_now_s % 60 % 10 + '0';

  paint.SetWidth(32);
  paint.SetHeight(96);
  paint.SetRotate(ROTATE_270);

  paint.Clear(UNCOLORED);
  paint.DrawStringAt(0, 4, time_string, &Font24, COLORED);
  epd.SetFrameMemory(paint.GetImage(), 80, 72, paint.GetWidth(), paint.GetHeight());
  epd.DisplayFrame();

6.2 改进代码

  String T_str = "Room-T: "+ String(Room_Temp) + " C";
  paint.Clear(UNCOLORED);                                         
  paint.DrawStringAt(0, 0, T_str.c_str(), &Font12, COLORED);
  epd.SetPartialWindow(paint.GetImage(), 2*STEP, 18*STEP, paint.GetWidth(), paint.GetHeight());
  epd.DisplayFrame();

# 总结 主要对制作墨水屏天气时钟的部分模块驱动方法做了一些简要记录,算是完整项目的总结吧,希望能够帮到有需要的伙伴。
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-01 14:06:15  更:2022-01-01 14:07:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 3:36:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码