WiFi 时钟+本地温度

news2024/11/16 13:25:09

[ WiFi 时钟 ]         
[ WiFi 天气时钟 ]         
[ WiFi 时钟+本地温度 ]     

夏天到了,显示器上放一个时钟,顺便实时测量本地室温,看看空调工作是否正常也算是个实用制作。 

用到零件共 4 个:

        400孔面包板 ( 大号830孔的也行,不过粘在显示器上面显的有些突兀)

        NodeMCU     ( 其他的ESP8266应该也差不多,需要注意引脚排列 )

        0.96' OLED   ( SSD1306 )

        AHT20传感器  ( 手里有AHT10也可以,程序一样的 )

  

 上面已经给出连接示意图,仔细点看应该没什么难度。

不废话,直接上代码:( 修改SSID即可 )

#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(/*旋转0123*/U8G2_R0, /*reset=255*/U8X8_PIN_NONE, /*SCL*/D1, /*SDA*/D2);   

#include <Adafruit_AHT10.h>  
Adafruit_AHT10 aht; 

#include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
WiFiUDP   Udp;
NTPClient timeClient(Udp, "cn.pool.ntp.org");   // 哪个服务器稳定就用哪个,比如还可以选 ntp1.aliyun.com
time_t    currentDisplayTime;
String    Sync_status;
int       Sync_status_display_seconds;
String    HH;
String    MM;
String    Sec;  //SS变量名已被占用
String    t;
String    h;

void setup(){  
  aht.begin();
  
  u8g2.begin();
  u8g2.enableUTF8Print();                       // 启用中文显示,但库不全  
  u8g2.setContrast(0);
  u8g2.setFont(u8g2_font_ncenB14_tr);   

  u8g2.clearBuffer();     
  u8g2.setCursor( 0,32); u8g2.print("WiFi");  
  u8g2.sendBuffer();  
  WiFi.begin("SSID", "your_password");
  while(WiFi.status()!= WL_CONNECTED){delay(1000);u8g2.print(".");u8g2.sendBuffer();}
  Udp.begin(8888);                              // UDP 侦听端口,任意指定   
  u8g2.setCursor( 0,60); u8g2.print("Connected!");  
  u8g2.sendBuffer();
  delay(2000);
  
  setSyncProvider(getNtpTime);
  setSyncInterval(60);                          // NTP网络同步间隔时间,单位秒
} 

void loop(){
  if (now()!= currentDisplayTime){ 
    currentDisplayTime = now();
    prepare_data();
    refresh_OLED_display();
  }
}

void prepare_data(){
  sensors_event_t  aht_humidity, aht_temp;      // 定义两个结构体
  aht.getEvent(&aht_humidity, &aht_temp);       // 采集一次传感器,写入两个结构体
  t = String(aht_temp.temperature,1);
  h = String(aht_humidity.relative_humidity,0);
  
  int years = year(),months = month(),days = day(),hours = hour(),minutes = minute(),seconds = second(),weekdays = weekday();
  HH="";MM="";Sec="";
  if (hours   < 10)HH += 0; HH += hours;
  if (minutes < 10)MM += 0; MM += minutes;
  if (seconds < 10)Sec += 0; Sec += seconds;  
}

void refresh_OLED_display(){
  u8g2.clearBuffer();   
    u8g2.setCursor( 0,41); u8g2.setFont(u8g2_font_logisoso42_tr); u8g2.print(HH+":"+MM);
    u8g2.setCursor(54,29); u8g2.setFont(u8g2_font_unifont_t_chinese2);u8g2.print(Sec); 
    u8g2.drawHLine(0,43,128);  
    if(Sync_status_display_seconds > 0){
      Sync_status_display_seconds --;
      u8g2.setCursor(12,62); u8g2.setFont(u8g2_font_ncenB14_tr); u8g2.print(Sync_status);       
    }   
    else{
      u8g2.setCursor( 60,64); u8g2.print("C");   
      u8g2.setCursor(110,64); u8g2.print("%"); 
      u8g2.setCursor( 10,64); u8g2.setFont(u8g2_font_ncenB18_tr);u8g2.print(t);   
      u8g2.setCursor( 80,64); u8g2.setFont(u8g2_font_ncenB18_tr);u8g2.print(h);      
    }
  u8g2.sendBuffer();
}

time_t getNtpTime(){
  Sync_status_display_seconds = 5;
  if(timeClient.update()) Sync_status="Sync OK!";
  else Sync_status="Sync Failed!";
  return(timeClient.getEpochTime()+28800);   // GMT+8, 3600*8
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker配置nacos

1 拉取nacos镜像并启动 docker pull nacos/nacos-server 2 启动nacos命令 docker run -d --name nacos -p 8848:8848 -e PREFER_HOST_MODEhostname -e MODEstandalone nacos/nacos-server 至此&#xff0c;我们已经可以使用nacos服务&#xff0c;UI地址:http://:8848/nacos …

计算机体系结构基础知识介绍之高级分支预测(二)

一、标记混合预测器 分支预测的目的是根据历史信息来预测分支指令的跳转方向和目标地址&#xff0c;从而提高流水线的效率。不同的分支预测方法有不同的优缺点&#xff0c;因此有人提出了一种将多种预测方法结合起来的方案&#xff0c;混合预测器。这种方案可以根据不同的分支…

适合Docker的场景以及不适合的场景

文章来自&#xff1a;When to use and when not to use Docker和7 Cases When You Should Not Use Docker&#xff0c;以及互联网网上的一些零散内容。这篇文章只是基于我自己的理解&#xff0c;进行简单的概述。 适合的场景 你的团队不是一成不变的。 当有新的成员加入&#…

写作技巧:如何让你的文章充满生命力?

在写作中&#xff0c;让文章充满生命力是很重要的一点。如果一篇文章缺乏生命力&#xff0c;那么读者很难被吸引&#xff0c;也很难从中获得任何收获。那么&#xff0c;如何让你的文章充满生命力呢&#xff1f; 以下是几个建议&#xff1a; 1.真实感情&#xff1a;写作的时候要…

Django_视图中的request对象详解(八)

目录 Request 属性 方法 QueryDict 源码等资料获取方法 Request 当URLconf文件匹配到用户输入的路径后&#xff0c;会调用对应的view函数&#xff0c;并创建一个包含请求元数据的 HttpRequest 对象 传入该函数的第一个参数&#xff0c;常用request表示。 HttpRequest实…

为什么要学习使用C++软件常用分析工具?学会这些工具都有哪些好处?

目录 1、为什么要学习使用C软件常用分析工具&#xff1f; 2、C常用分析工具有哪些&#xff1f;都能处理哪些具体的问题&#xff1f; 2.1、SPY 2.2、Dependency Walker 2.3、GDIView 2.4、Process Explorer 2.5、Process Monitor 2.6、调试器Windbg 2.7、反汇编工具IDA…

Android 13 startActivity报错ActivityNotFoundException

最近遇到一个问题&#xff0c;就是在google pixel 4&#xff08;android 13&#xff09;的手机上startactivity的时候报错activity找不到&#xff0c;其他非13的是好的&#xff0c;这里对问题进行记录&#xff1a; 查阅google官方的文档&#xff0c;有这么一段话&#xff0c; …

前端mock数据的几种方式

前端mock数据的几种方式 前端在开发具体需求前&#xff0c;后端往往只提供接口文档&#xff0c;对于前端来说&#xff0c;最简单的方式就是把想要的数据写死在代码里进行开发&#xff0c;但这样的坏处就是和后端联调前还需要再把写死的数据从代码里删除&#xff0c;最好的方式…

开发中易犯错的事务问题

1.不指定rollbackFor 使用spring的声明式事务&#xff08;即Transactional注解&#xff09;时&#xff0c;如果不指定rollbackFor&#xff0c;那么当程序发生Error时&#xff0c;事务将不会回滚&#xff01;&#xff01;&#xff01;显然这将导致数据不一致&#xff01; 如下述…

spring8-getBean()方法使用

&#xff1b;&#xff1a;getBean使用&#xff0c;要传数据&#xff0c;一个是字符串&#xff0c; 就是文件里的UserService 而这里的UserService就是我们配置文件的id&#xff1a;&#xff0c;第一个API 第二个API可以传入一个字节码类型。 如果某一个容器存在多个&#xff…

windows系统如何部署nacos

1.安装nacos 去nacos github下载nacos最新稳定版本&#xff0c;我用的是nacos-server-2.2.3.zip&#xff0c;下载后解压 2.创建数据库 启动mysql&#xff0c;创建数据库nacos&#xff0c;数据库名字是从conf/application.properties文件获得的 把db这三行取消注释&#xff…

【Hello mysql】 mysql的约束

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;介绍mysql的约束 mysql的约束 表的约束空属性默认值列描述zerofill主键自增长唯一键外键总结 表的约束 为什么要有约束&#xff1f; 我们在收集一些数据的时候会要求该数据必须存在 比如说像是国家在登记公民信息的时候身…

实验二 常用网络命令

实验目的 了解常用网络命令及其使用方法。通过网络命令了解网络状态&#xff0c;并利用网络命令对网络进行简单的操作。 实验原理 1. 通过 ping 命令检测网络故障 &#xff08;1&#xff09;命令格式&#xff1a; ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v T…

conic-gradient

The conic-gradient() CSS function creates an image consisting of a gradient with color transitions rotated around a center point conic-gradient方法创建了一个由围绕中心点旋转渐变组成的图片 background: conic-gradient( red 6deg, orange 6deg 18deg, yellow…

位图|布隆过滤器模拟实现|STL源码剖析系列|手撕STL

今天博主给大家带来位图和布隆过滤器的模拟实现。 前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结&#xff0c;每一篇…

并发编程 - 利用Event Bus模式实现目录文件变化捕捉

文章目录 Pre需求CodeDirectoryTargetMonitorFileChangeEventFileChangeListener测试 Pre 并发编程 - Event Bus 设计模式 需求 JDK自1.7版本后提供了WatchService类&#xff0c;该类可以基于事件通知的方式监控文件或者目录的任何变化&#xff0c;文件的改变相当于每一个事件…

Java继承和多态

文章目录 继承继承概念继承的语法 super关键字super和this继承方式多态多态的概念多态实现条件 重写重写和重载的区别 继承 Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;事物之间可能会…

Linux 内核级通用内存池 —— kmalloc 体系

目录 kmalloc 内存池中都有哪些尺寸的内存块 kmalloc 内存池如何选取合适尺寸的内存块 kmalloc 内存池的整体架构 KMALLOC_RECLAIM 表示需要分配可以被回收的内存&#xff0c;RECLAIM 类型的内存页&#xff0c;不能移动&#xff0c;但是可以直接回收&#xff0c;比如文件缓存页…

【Linux】第一个Linux小程序——进度条

今天为大家带来一篇关于在Linux上编写的进度条小程序的博客。 正文 我们在日常生活中使用电子产品时&#xff0c;经常会遇到加载的过程&#xff0c;这时候这些加载界面总是会附带有一些进度条&#xff0c;这些进度条是加载进度的可视化图形&#xff0c;这篇文章我们就在Linux系…

基于云原生网关的全链路灰度实践

作者&#xff1a; 倪海峰&#xff08;海迩&#xff09; 前言 随着企业规模的不断扩大&#xff0c;传统单体应用已很难进一步支持业务的发展&#xff0c;业务的迭代速度已经难以满足业务的增长&#xff0c;此时企业会对应用系统做微服务化的改造&#xff0c;降低业务的耦合度&…