【NodeMCU实时天气时钟温湿度项目 9】为项目增加智能配网功能(和风天气版)

        今天是第九专题,主要介绍智能配网的方法途径和具体实现。在项目开发和调试阶段,设置 WIFI 连接信息,通常是在项目中修改源程序代码完成的。项目调试完成后,客户应用环境中如何实现WIFI连接信息(ssid 和 password)的配置呢?

一、AP模式智能配网       

        所谓AP模式智能配网,就是 IOT 设备启动后,会优先从闪存(FALSH)中查找以前保存的 wifi 连接信息尝试联网,如果联网成功则正常启动项目程序。如果没有查找到以前保存的 wifi 连接信息,或者虽然查到 wifi 连接信息但是无法联网成功,那么 IOT设备将自动配置生成一个 AP 热点,通过 PC或手机等其他智能连接到这个AP热点,借此将设备所在环境的路由器 SSID和Password发送到 IOT 设备。IOT 设备接收到 wifi 账号和密码之后,将从 AP 模式切换回 Station 模式,然后用过手机发送下来的 SSID 和 Password 连接所在环境的路由器,尝试实现联网功能。

二、添加智能配网 WiFiManager 功能库

        添加库方法。打开 PlatformIO 界面,选择 Libraries 图标,在搜索栏内输入 WiFiManager,在查询结果中选择 WiFiManager by tzapu 库,添加到项目中。

三、官方示例使用代码说明

        以下代码主要来自于该库示例程序 AutoConnect.ino ,增加了几行调试信息串口显示代码。请将其全部内容复制到任一新项目的 main.cpp 中,编译上传到开发板,尝试使用 PC 或手机等其他智能设备连接到 AP 热点(“AutoConnectAP”),对 wifi 连接信息进行配置。

#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino// needed for library
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManagervoid setup()
{// put your setup code here, to run once:Serial.begin(115200);// WiFiManager// Local intialization. Once its business is done, there is no need to keep it aroundWiFiManager wifiManager;// reset saved settings// wifiManager.resetSettings();// set custom ip for portal// wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0));// fetches ssid and pass from eeprom and tries to connect// if it does not connect it starts an access point with the specified name// here  "AutoConnectAP"// and goes into a blocking loop awaiting configurationwifiManager.autoConnect("AutoConnectAP");// or use this for auto generated name ESP + ChipID// wifiManager.autoConnect();// if you get here you have connected to the WiFiSerial.println("connected...yeey :)");// WiFi连接成功后将通过串口监视器输出连接成功信息Serial.println("");Serial.print("ESP8266 Connected to ");Serial.println(WiFi.SSID()); // WiFi名称Serial.print("IP address:\t");Serial.println(WiFi.localIP()); // IP}void loop()
{// put your main code here, to run repeatedly:
}

  四、为天气时钟项目增加智能配网功能

        为项目增加智能配网功能非常简单方便,仅需要几行代码就可以实现。
        (1)添加 WiFiManager 功能库,详见上面第二部分内容。
        (2)在 main.cpp 包含必要的头文件,即以下 3 个头文件 。

// needed for library
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager

        (3)在 setup{ } 函数中声明一个 WiFiManager 实例,运行 autoConnect 函数。

  // 自动配网功能的实现代码WiFiManager wifiManager;wifiManager.autoConnect("AutoConnectAP");

        (4)(可选)增加调试信息,在串口监视器输出连接成功后的信息。

  // WiFi连接成功后将通过串口监视器输出连接成功信息Serial.println("");Serial.print("ESP8266 Connected to ");Serial.println(WiFi.SSID()); // WiFi名称Serial.print("IP address:\t");Serial.println(WiFi.localIP()); // IP

五、增加智能配网功能后的 main.cpp       

#include <Arduino.h>// 连接wifi用的库
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>// needed for library
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager// TFT 屏幕驱动库
#include <TFT_eSPI.h>// 解析JSON数据用的库
#include <ArduinoJson.h>// 解压GZIP的JSON数据用的库
#include <ArduinoUZlib.h>// 构造函数,实例化 TFT 屏幕对象
TFT_eSPI tft = TFT_eSPI();// 程序用到的字库文件,后面会详细说明
#include "hefeng-min-40px.h"
#include "weather_font20.h"
#include "weather_font16.h"// 网络时钟的刷新频率
unsigned long last_ntp = 0;
const long interval_ntp = 1000; // 网络时钟的刷新频率(毫秒)// 今日天气的刷新频率
unsigned long last_weather = 0;
const long interval_weather = 1000 * 60 * 5; // 今日天气的刷新频率(毫秒),每300秒更新一次// 明日天气的刷新频率
unsigned long last_tmr_weather = 0;
const long interval_tmr_weather = 1000 * 60 * 60; // 明天天气的刷新频率(毫秒),每3600秒更新一次// 温湿度传感器的刷新频率
unsigned long last_sht = 0;
const long interval_sht = 3000; // 温湿度传感器的刷新频率(毫秒),每3000毫秒更新一次// 来自和风天气的密钥
const String key = "aebf03d0af********8b0ed0ca5";// 您的城市ID
const String cityid = "101120110";#include "sht30.h"
#include "ntptime.h"
#include "weather_hefeng.h"void setup()
{Serial.begin(115200);tft.init();tft.setSwapBytes(true);tft.setRotation(0);tft.fillScreen(TFT_BLACK);tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.setTextSize(2);// 自动配网功能的实现代码WiFiManager wifiManager;wifiManager.autoConnect("AutoConnectAP");// WiFi连接成功后将通过串口监视器输出连接成功信息Serial.println("");Serial.print("ESP8266 Connected to ");Serial.println(WiFi.SSID()); // WiFi名称Serial.print("IP address:\t");Serial.println(WiFi.localIP()); // IP// 设定屏幕的基本tft.println("");tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.println("");// 今日天气tft.println("Get Today weather");get_now_Weather();get_tmr_Weather();tft.setTextSize(1);tft.println("");tft.setTextSize(2);// 对时tft.println("Get NTP Time");initNtp();// 温湿度传感器tft.println("");tft.println("load Sensor Data..");sht30_setup();tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.println("");tft.println("start...");delay(500);tft.fillScreen(TFT_BLACK);
}void loop()
{// 获取单片机启动至今的毫秒数unsigned long currentMillis = millis();// 显示当前日期,星期几,农历// update ntp 时间if (last_ntp == 0 || currentMillis - last_ntp >= interval_ntp){last_ntp = currentMillis;loopNtp();tft.loadFont(weather_font16);tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.drawString(dt.localDate + "  " + weekOfDate1(dt.year, dt.month, dt.day) + " " + outputLunarDate(dt.year, dt.month, dt.day), 0, 0);tft.unloadFont();tft.setTextSize(5);tft.setTextColor(TFT_GREEN, TFT_BLACK, true);tft.drawString(dt.localTime, 0, 30);}// 今日天气if (last_weather == 0 || currentMillis - last_weather >= interval_weather){if (last_weather > 0){get_now_Weather();}last_weather = currentMillis;// 擦除指定区域tft.fillRect(55, 90, 240, 40, TFT_BLACK);tft.setTextColor(TFT_YELLOW, TFT_BLACK, true);tft.loadFont(hefeng40);tft.drawString(icon(wd.now_icon), 10, 90);tft.unloadFont();tft.loadFont(weather_font20);tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.drawString(String(wd.now_temp) + "° " + wd.now_text, 55, 90);tft.drawString(wd.now_windDir + "" + String(wd.now_windScale) + "级 " + wd.now_windSpeed + "KM/H", 55, 110);tft.drawLine(0, 140, 240, 140, TFT_WHITE);}// 明日天气if (last_tmr_weather == 0 || currentMillis - last_tmr_weather > interval_tmr_weather){if (last_tmr_weather > 0){get_tmr_Weather();}last_tmr_weather = currentMillis;// 擦除指定区域tft.fillRect(55, 150, 240, 40, TFT_BLACK);tft.loadFont(hefeng40);tft.setTextColor(TFT_YELLOW, TFT_BLACK, true);tft.drawString(icon(wtd[1].iconDay), 10, 150);tft.unloadFont();tft.loadFont(weather_font20);tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.drawString("明天 " + String(wtd[1].tempMin) + "° - " + String(wtd[1].tempMax) + "°", 55, 150);tft.drawString(wtd[1].textDay + ", " + "风力" + wtd[1].windScaleDay + "级", 55, 170);// 这条线其实没必要重新绘制tft.drawLine(0, 200, 240, 200, TFT_WHITE);}// 温湿度传感器的数据if (last_sht == 0 || currentMillis - last_sht > interval_sht){last_sht = currentMillis;sht30();tft.loadFont(weather_font20);tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.drawString("室温:", 0, 210);tft.setTextColor(TFT_GREEN, TFT_BLACK, true);tft.drawString(String(sht_data.temperature) + "C ", 40, 210);tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.drawString("湿度", 120, 210);tft.setTextColor(TFT_GREEN, TFT_BLACK, true);tft.drawString(String(sht_data.humidity) + "%  ", 170, 210); }
}

六、项目源代码下载

        百度网盘下载链接:WeatherClock_example_9,  提取码:rvks
        友情提示:请务必将 const String key 修改成您自己申请的和风天气API密钥。

        如您需要了解其它专题的内容,请点击下面的链接。
        第一专题内容,请参考:连接点亮SPI-TFT屏幕和UI布局设计
        第二专题内容,请参考:WIFI模式设置及连接
        第三专题内容,请参考:连接SHT30传感器,获取并显示当前环境温湿度数据(I2C)
        第四专题内容,请参考:通过NTPClient库获取实时网络时间并显示在TFT屏幕上
        第五专题内容,请参考:获取关于城市天气实况和天气预报的JSON信息(心知天气版)
        第六专题内容,请参考:解析天气信息JSON数据并显示在 TFT 屏幕上(心知天气版)
        第七专题内容,请参考:和风天气API返回JSON数据信息的解压缩实现
        第八专题内容,请参考:解析和风天气信息压缩JSON数据并显示在 TFT 屏幕上

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

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

相关文章

【基础详解】快速入门入门 SQLite数据可

简介 SQLite 是一个开源的嵌入式关系数据库&#xff0c;实现了自给自足的、无服务器的、配置无需的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库系统不同&#xff0c;比如 MySQL、PostgreSQL 等&#xff0c;SQLite 不需要在系统中设置…

Unity功能——设置Camera,实现玩家被攻击后晃动效果

一、方法说明&#xff1a; 来源&#xff1a;siki学院&#xff1a;Unity项目捕鱼达人&#xff0c;功能学习记录&#xff1b; 效果摘要&#xff1a;通过调整相机移动&#xff0c;视觉感觉玩家面板剧烈晃动&#xff0c;实现被boss攻击时的震动效果。 使用场景说明&#xff1a; …

通过继承React.Component创建React组件-5

在React中&#xff0c;V16版本之前有三种方式创建组件&#xff08;createClass() 被删除了)&#xff0c;之后只有两种方式创建组件。这两种方式的组件创建方式效果基本相同&#xff0c;但还是有一些区别&#xff0c;这两种方法在体如下&#xff1a; 本节先了解下用extnds Reac…

Java | Leetcode Java题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; class Solution {public boolean hasPathSum(TreeNode root, int sum) {if (root null) {return false;}if (root.left null && root.right null) {return sum root.val;}return hasPathSum(root.left, sum - root.val) || has…

国内快速下载hugging face大模型的方法

由于众所周知的原因&#xff0c;从hugging face下载大模型比较困难&#xff0c;幸好国内有人做了镜像站&#xff0c;可以通过国内的镜像站进行快速下载&#xff0c;以下是配置方法。 我的系统是ubuntu 22&#xff0c;这里记录的方法只对debian/ubuntu有效。 git-lfs/INSTALLI…

信息系统项目管理师0130:工具与技术(8项目整合管理—8.7监控项目工作—8.7.2工具与技术)

点击查看专栏目录 文章目录 8.7.2 工具与技术8.7.2 工具与技术 专家判断监控项目工作过程中,应征求具备如下领域相关专业知识或接受过相关培训的个人或小组的意见,涉及的领域包括:挣值分析;数据的解释和情境化;持续时间和成本的估算技术;趋势分析;关于项目所在的行业以及…

【LSTM】LSTM cell的门结构学习笔记

文章目录 1. LSTM cell2. 门结构3. 门的公式4. 门的参数5. 重点关系厘清 1. LSTM cell 如文章 LSTM网络与参数学习笔记 中介绍, LSTM cell指的是一个包含隐藏层所有神经元的结构.但是LSTM门控单元的公式如何理解、门和LSTM cell神经元如何对应、门函数的参数维度、不同时间步不…

鸿蒙 DevEco Studio 3.1 Release 下载sdk报错的解决办法

鸿蒙 解决下载SDK报错的解决方法 最近在学习鸿蒙开发&#xff0c;以后也会记录一些关于鸿蒙相关的问题和解决方法&#xff0c;希望能帮助到大家。 总的来说一般有下面这样的报错 报错一&#xff1a; Components to install: - ArkTS 3.2.12.5 - System-image-phone 3.1.0.3…

leecode 1206|跳表的设计

跳表 跳表&#xff0c;一种链表数据结构&#xff0c;其增删改茶的效率能和平衡树相媲美 leecode1206 可以看上面的那个动画&#xff0c;动画效果很贴切。 我简单讲讲它的机制吧&#xff0c;每个节点不单单是一个&#xff0c;测试好几层&#xff0c;然后同一层的节点和统一节点…

Tomcat部署项目的方式

目录 1、Tomcat发布项目的方式 方式1&#xff1a; 直接把项目发布到webapps目录下 方式2&#xff1a;项目发布到ROOT目录 方式3&#xff1a;虚拟路径方式发布项目 方式4&#xff1a;(推荐)虚拟路径&#xff0c;另外的方式&#xff01; 方式5&#xff1a;发布多个网站 1、…

掩码生成蒸馏——知识蒸馏

摘要 https://arxiv.org/pdf/2205.01529 知识蒸馏已成功应用于各种任务。当前的蒸馏算法通常通过模仿教师的输出来提高学生的性能。本文表明&#xff0c;教师还可以通过指导学生的特征恢复来提高学生的表示能力。从这一观点出发&#xff0c;我们提出了掩码生成蒸馏&#xff08…

【字典树(前缀树) 异或 离线查询】1707. 与数组中元素的最大异或值

本文涉及知识点 字典树&#xff08;前缀树&#xff09; 位运算 异或 离线查询 LeetCode1707. 与数组中元素的最大异或值 给你一个由非负整数组成的数组 nums 。另有一个查询数组 queries &#xff0c;其中 queries[i] [xi, mi] 。 第 i 个查询的答案是 xi 和任何 nums 数组…

C++ | Leetcode C++题解之第97题交错字符串

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isInterleave(string s1, string s2, string s3) {auto f vector <int> (s2.size() 1, false);int n s1.size(), m s2.size(), t s3.size();if (n m ! t) {return false;}f[0] true;for (int i …

264 基于matlab的自适应语音盲分离

基于matlab的自适应语音盲分离&#xff0c;当a和b同时对着传声器A,B说话且传声器靠得很近时&#xff0c;传声器A,B会同时接受到a和b的声音&#xff0c;即a和b产生了混叠干扰&#xff0c;此时通过自适应语音盲分离系统可以将a,b的声音分离开&#xff0c;使得一个信道只有一个人的…

2024.05.25学习记录

1、面经复习&#xff1a; JS异步进阶、vue-react-diff、vue-router模式、requestldleCallback、React Fiber 2、代码随想录刷题、动态规划 3、组件库使用storybook

python抽取pdf中的参考文献

想将一份 pdf 论文中的所有参考文献都提取出来&#xff0c;去掉不必要的换行&#xff0c;放入一个 text 文件&#xff0c;方便复制。其引用是 ieee 格式的&#xff0c;形如&#xff1a; 想要只在引用序号&#xff08;如 [3]&#xff09;前换行&#xff0c;其它换行都去掉&…

VTK 数据处理:特征边提取

VTK 数据处理&#xff1a;特征边提取 VTK 数据处理&#xff1a;特征边提取原理实例 1&#xff1a;边界边提取实例 2&#xff1a;模型特征边提取实例 3&#xff1a;利用 vtkFeatureEdges 提取的边界补洞实例 4&#xff1a;利用 vtkFillHolesFilter 补洞 VTK 数据处理&#xff1a…

OC属性关键字和单例模式

OC的属性关键字和单例模式 文章目录 OC的属性关键字和单例模式单例模式基本创建重写allocWithZone方法的同时使用dispatch_once 属性和属性关键字property和synthesize&#xff0c;dynamic属性关键字atomic和nonatomicstrong和weakreadonly和readwritestrong和copy 单例模式 单…

MySQL--存储引擎

一、存储引擎介绍 1.介绍 存储引擎相当于Linux的文件系统&#xff0c;以插件的模式存在&#xff0c;是作用在表的一种属性 2.MySQL中的存储引擎类型 InnoDB、MyISAM、CSV、Memory 3.InnoDB核心特性的介绍 聚簇索引、事务、MVCC多版本并发控制、行级锁、外键、AHI、主从复制特…