数码之家

 找回密码
 立即注册
搜索
查看: 8873|回复: 55

[Arduino] 仿制落叶风彩屏天气万年历时钟,可手机配网。。。求助

[复制链接]
发表于 2019-12-29 15:16:01 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 28674500 于 2019-12-30 16:18 编辑

本人是一个完全不懂Arduino的人,为了使彩屏天气万年历时钟可以使用手机配网,足足问了度娘三天。。。
本程序仅做测试,有问题我也不会修复,目前自己测试正常。刷入后,手机会搜素到一个热点:TANG_CLOCK,密码:88888888
连接后自动弹出WiFi配网界面,选择第一个输入WiFi密码即可。
程序有BUG。刷完程序正常用手机配网,接收时间天气正常,如果重启家里WiFi,中间隔一段时间没有WiFi,程序会中断显示[HTTP] GET... failed, error: connection refused。重启WiFi模块,需要重新配网才正常。意思就是:重启自家WiFi需要重启彩屏天气万年历时钟并重新用手机配网。
。。。。。。。。。。。。哪位大神帮忙修改一下。。。。。。。。。。。
参考了以下几位大神的贴子:
[综合] 仿制坛友落叶风《自动授时128*64LED彩屏天气万年历时钟》(2月27日更新)
[STM] 制作自动授时128*64LED彩屏天气万年历时钟(最新版开源)
[STM] (2月26日再次更新)自动授时128*64LED彩屏天气万年历时钟主程序更新及制作...
英文地址:https://github.com/tzapu/WiFiManager/tree/development
翻译中文地址:https://www.kutu66.com//GitHub/article_126804
工作原理
  • 当ESP启动时,它将设置为站模式,并尝试连接到以前保存的访问点
  • 如果( 或者未保存以前的网络) 不成功,它将ESP移动到接入点模式并启动一个DNS和服务器端( 默认 ip 192.168.4.1 )
  • 在浏览器( 电脑,电话,平板电脑) 连接到新创建的访问点时使用任何启用的wifi设备
  • 由于受住门户和DNS服务器,你可以获得'加入网络'类型的弹出式或者获取任何你尝试访问的域。
  • 选择扫描点之一,输入密码,单击保存
  • ESP将尝试连接。 如果成功,它将控制权放弃到你的应用程序。 如果没有,重新连接到AP并重新配置。

TANG_CLOCK.rar (2.16 KB, 下载次数: 30)

以下是我修改的代码,需要安装WiFiManager库:
  1. #include <ESP8266WiFi.h>         
  2. #include <DNSServer.h>
  3. #include <ESP8266WebServer.h>
  4. #include <WiFiManager.h>        
  5. #include <ESP8266WiFiMulti.h>
  6. #include <ESP8266HTTPClient.h>
  7. #define USE_SERIAL Serial

  8. ESP8266WiFiMulti WiFiMulti;
  9. String stringOne, stringTwo, stringThree,stringnew;
  10. int jisu,congxindu;
  11. void setup() {
  12.     USE_SERIAL.begin(115200);
  13.    // USE_SERIAL.setDebugOutput(true);

  14.     USE_SERIAL.println();
  15.     USE_SERIAL.println();
  16.     USE_SERIAL.println();

  17.     for(uint8_t t = 4; t > 0; t--) {
  18.         USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
  19.         USE_SERIAL.flush();
  20.         delay(1000);
  21.     }
  22.     WiFiManager wifiManager;
  23.     wifiManager.autoConnect("TANG_CLOCK", "88888888");

  24.     USE_SERIAL.println("connected...yeey :)");
  25. }

  26. void loop() {
  27.    int i,lastStringLength;
  28.   int ListItem,ListItemend;
  29.   int ListItem2,ListItemend2;
  30.   String string1="[Timetianqi1] 今天天气实况:";
  31.   String string2,string3;
  32.     // wait for WiFi connection
  33.     jisu++;
  34.     if(jisu>360)jisu=0;//天气每30分钟一次,时钟每5秒一次
  35.     //USE_SERIAL.println(jisu);
  36.   if((WiFiMulti.run() == WL_CONNECTED)) {
  37.         HTTPClient http;
  38.         USE_SERIAL.print("[HTTP] begin...\n");
  39.         // configure traged server and url
  40.        if(jisu==3 || congxindu==1)
  41.        {//天气接收
  42.          http.begin("http://i.tianqi.com/index.php?c=code&a=getcode&id=3&py=huidong1");
  43.        }
  44.       else
  45.      {//提取时间
  46.       if(jisu==2)
  47.        {//用于提取当前天气参数
  48.          http.begin("http://i.tianqi.com/index.php?c=code&a=getcode&id=102&py=huidong1");
  49.        }
  50.        else
  51.        {
  52.         http.begin("http://quan.suning.com/getSysTime.do");//苏宁的时间api
  53.        }
  54.       }
  55.       
  56.         USE_SERIAL.print("[HTTP] GET...\n");
  57.         // start connection and send HTTP header
  58.         int httpCode = http.GET();

  59.         // httpCode will be negative on error
  60.         if(httpCode > 0) {
  61.             // HTTP header has been send and Server response header has been handled
  62.             USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);
  63.             // file found at server
  64.             if(httpCode == HTTP_CODE_OK) {
  65.                 String payload = http.getString();
  66.                 //USE_SERIAL.println(payload);
  67.                
  68.                  if(jisu==3 || congxindu==1)
  69.                  {//天气接收
  70.                 //以下为接收到的天气,进行组合文字,文字如下:今天天气实况:晴,最低温度:10℃,最高温度:20℃,气温:14℃;风向/风力:
  71.                 //西南风 1级;湿度:65%,紫外线强度:中等。明天:晴转多云,12℃/22℃。后天:多云,12℃/22℃。
  72.                 //USE_SERIAL.println(lastStringLength);
  73.                  lastStringLength=payload.length();
  74.                     if(lastStringLength>900)//字数需大于1000才行,如小于这值,报错
  75.                     {
  76.                        ListItem =0;
  77.                        ListItemend =0;
  78.                        ListItem = payload.indexOf("今天天气", ListItem + 1);
  79.                        ListItemend = payload.indexOf("</div>", ListItem + 1);
  80.                        ListItemend = payload.indexOf("</div>", ListItemend + 1);
  81.                        string2=payload.substring(ListItem, ListItemend);
  82.                        ListItem2= string2.indexOf(">", ListItem2 + 1);
  83.                        ListItem2= string2.indexOf(">", ListItem2 + 1);
  84.                        string3=string2.substring(ListItem2+1);
  85.                        string1=string1+string3+";风向/风力:";  
  86.                        ListItem = payload.indexOf("<div class="wtwind"", ListItem + 1);
  87.                        ListItemend = payload.indexOf("</div>", ListItem + 1);
  88.                        string2=payload.substring(ListItem+20, ListItemend);
  89.                        string1=string1+string2+";最高温度:";  
  90.                        ListItem = payload.indexOf("<div class="wttemp">", ListItem + 1);
  91.                        ListItemend = payload.indexOf("</div>", ListItem + 1);
  92.                        string2=payload.substring(ListItem+39, ListItemend);
  93.                        ListItemend2=string2.indexOf("<", 0);
  94.                        string3=string2.substring(0,ListItemend2);
  95.                        string1=string1+string3+";最低温度:";
  96.                        ListItem2= string2.indexOf(">",ListItemend2);
  97.                        ListItem2= string2.indexOf(">", ListItem2 + 1);
  98.                        ListItemend2=string2.indexOf("<", ListItem2+1);
  99.                        string3=string2.substring(ListItem2+1,ListItemend2);
  100.                        string1=string1+string3+";"+stringnew+" 明天:";
  101.                        
  102.                        
  103.                    //明天天气
  104.                       ListItem = payload.indexOf("明天天气", ListItem + 1);
  105.                       ListItemend = payload.indexOf("</div>", ListItem + 1);
  106.                       ListItemend = payload.indexOf("</div>", ListItemend + 1);
  107.                       string2=payload.substring(ListItem, ListItemend);
  108.                       ListItem2 =string2.indexOf("">", 0);
  109.                       string3=string2.substring(ListItem2+2);
  110.                       string1=string1+string3+",";
  111.                       ListItem = payload.indexOf("<div class="wtwind">", ListItem + 1);
  112.                       ListItemend = payload.indexOf("</div>", ListItem + 1);
  113.                       string2=payload.substring(ListItem+20, ListItemend);
  114.                       string1=string1+string2+",";
  115.                       ListItem = payload.indexOf("<div class="wttemp">", ListItem + 1);
  116.                       ListItemend = payload.indexOf("</div>", ListItem + 1);
  117.                       string2=payload.substring(ListItem+39, ListItemend);
  118.                       ListItem2= string2.indexOf("">",0);
  119.                       ListItemend2=string2.indexOf("</", ListItem2+1);
  120.                       string3=string2.substring(ListItem2+2,ListItemend2);
  121.                       string1=string1+string3+"/";
  122.                       ListItemend2=string2.indexOf("</", 0);
  123.                       string3=string2.substring(0,ListItemend2);
  124.                       string1=string1+string3+"。 后天:";
  125.                      
  126.                        //后天天气
  127.                       ListItem = payload.indexOf("后天天气", ListItem + 1);
  128.                       ListItemend = payload.indexOf("</div>", ListItem + 1);
  129.                       ListItemend = payload.indexOf("</div>", ListItemend + 1);
  130.                       string2=payload.substring(ListItem, ListItemend);
  131.                       ListItem2 =string2.indexOf("">", 0);
  132.                       string3=string2.substring(ListItem2+2);
  133.                       string1=string1+string3+",";
  134.                       ListItem = payload.indexOf("<div class="wtwind">", ListItem + 1);
  135.                       ListItemend = payload.indexOf("</div>", ListItem + 1);
  136.                       string2=payload.substring(ListItem+20, ListItemend);
  137.                       string1=string1+string2+",";
  138.                       ListItem = payload.indexOf("<div class="wttemp">", ListItem + 1);
  139.                       ListItemend = payload.indexOf("</div>", ListItem + 1);
  140.                       string2=payload.substring(ListItem+39, ListItemend);
  141.                       ListItem2= string2.indexOf("">",0);
  142.                       ListItemend2=string2.indexOf("</", ListItem2+1);
  143.                       string3=string2.substring(ListItem2+2,ListItemend2);
  144.                       string1=string1+string3+"/";
  145.                       ListItemend2=string2.indexOf("</", 0);
  146.                       string3=string2.substring(0,ListItemend2);
  147.                       string1=string1+string3+"。           **";
  148.                       USE_SERIAL.println(string1);//发送数据
  149.                     }
  150.                     else
  151.                     {
  152.                      string1="[Timetianqi1] 天气接收出错!           **";
  153.                     USE_SERIAL.println(string1);//发送数据
  154.                     }
  155.                     congxindu=0;
  156.                  }
  157.                  else
  158.                  {
  159.                    if(jisu==2 )
  160.                     {//组合当前天气参数
  161.                       lastStringLength=payload.length();
  162.                       ListItem =0;
  163.                       ListItemend =0;
  164.                       ListItem = payload.indexOf("<h4><b>", ListItem + 1);
  165.                       ListItemend = payload.indexOf("</b><i>℃</i>", ListItemend + 1);
  166.                       string2="气温:"+payload.substring(ListItem+7, ListItemend)+"℃;";
  167.                       ListItem = payload.indexOf("相对湿度", ListItem + 1);
  168.                       ListItemend = payload.indexOf("%</em>", ListItemend + 1);
  169.                       string2=string2+payload.substring(ListItem, ListItemend)+"%;";
  170.                       ListItem = payload.indexOf("紫外线指数", ListItem + 1);
  171.                       ListItemend = payload.indexOf("</span>", ListItemend + 1);
  172.                       stringnew=string2+payload.substring(ListItem, ListItemend)+"。";
  173.                     }
  174.                     else
  175.                     {//组合时间
  176.                       ListItem2=0;
  177.                      ListItemend2=0;
  178.                      ListItem2 =payload.indexOf("sysTime1");
  179.                      string2=payload.substring(ListItem2);
  180.                      string3=string2.substring(11,15)+'-';//年
  181.                      string3=string3+string2.substring(15,17)+'-';//月
  182.                      string3=string3+string2.substring(17,19)+" 0 ";//日
  183.                      string3=string3+string2.substring(19,21)+":"+string2.substring(21,23)+":"+string2.substring(23,25)+"**";
  184.                      string3="[Timetianqi2] "+string3;
  185.                      USE_SERIAL.println(string3);
  186.                     }
  187.   
  188.                  }            
  189.             }
  190.             
  191.         }
  192.         else
  193.         {
  194.             USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
  195.             if(jisu==3)
  196.             {
  197.             congxindu=1;
  198.             }
  199.         }

  200.         http.end();
  201.     }

  202.     delay(5000);
  203.    
  204. }
复制代码
以下是一些制作的图片
3dd9f4f36d6c4f168ef9335d67a5a4a.jpg
5元打回来的板,一共5张
4d5cda98e8c12c905c112e5c3bfe7c6.jpg
脱焊
4da95941ad5d73f3e9f5f0091a052ad.jpg
f62c3e9f273d904f4e3272d7de24ebb.jpg

8c3e535d8f08c3aa41ec558e124fdfc.jpg

039b8bd50e1262c583b1d8ebb3e81f1.jpg

c14f6cb0516ec17e932fbc48362b5af.jpg
刚好发现S7的壳子很硬,用它做一个框框
082a2d53a61644a8d6ae4a4d67c5f4d.jpg

7cb45fd071ccdfa2f864d688413193e.jpg
12v转5V的充电板
df6777028180cfc79c3d3dd9bab3837.jpg

7dee180abcb3e139dcdfe09f1d0c8f9.jpg

68708a11c8b407a07e72145a61a8b39.jpg
环境亮度很足的时候测试0.7-0.8安左右
315f3ce13e90b9384bbb154af1f3bb7.jpg
环境亮度不足的时候测试0.3-0.4安左右
c0519d5f8e74c49c1030e9e995a5160.jpg


温湿度传感器和光敏电阻
c48e458b64a95316f21d5f40d69a4d7.jpg
再发一个之前做的创意旋转时钟
04933c03133785ce3a713235d4b5ce8.jpg

a7d6ec373ebcae27f1afb4a5e337370.jpg
end





补充内容 (2020-1-1 09:56):
楼下有更新代码

打赏

参与人数 5家元 +138 收起 理由
love香 + 10 熱心助人
wenxueroom + 20 动手能力棒棒哒
stdzlqz + 20 優秀文章
csnyj001 + 18 原創內容
家睦 + 70

查看全部打赏

发表于 2019-12-29 20:25:49 来自手机浏览器 | 显示全部楼层
大神厉害
回复 支持 反对

使用道具 举报

发表于 2019-12-29 21:10:25 | 显示全部楼层
WIFI 时钟 感觉不错啊:loveliness:
回复 支持 反对

使用道具 举报

发表于 2019-12-29 21:31:07 | 显示全部楼层
很喜欢你的作品
回复 支持 1 反对 0

使用道具 举报

发表于 2019-12-29 22:09:50 | 显示全部楼层
作品很丰富,数码之家有你更精彩,感谢分享。
回复 支持 反对

使用道具 举报

发表于 2019-12-31 01:11:47 来自手机浏览器 | 显示全部楼层
那个库我好像用过,正常啊,就算断网,重启,密码都在,重新刷固件都在,不用配网
回复 支持 反对

使用道具 举报

发表于 2019-12-31 08:57:46 | 显示全部楼层
很不错的改进!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-1 10:01:59 | 显示全部楼层
又问了两天的度娘。。。。。。。
更新了以下的代码
基于安信可的AirKiss技术,通过手机连接家里WiFi,使用APP广播WiFi账号和密码来让ESP8266配网。
压缩包有使用说明和安卓APP
自己测试,有问题欢迎留言。
weatherCLOCK.rar (645.58 KB, 下载次数: 43)
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-1 14:42:51 | 显示全部楼层
有成品吗,自己小白一个。
回复 支持 反对

使用道具 举报

发表于 2020-1-2 00:13:00 | 显示全部楼层
WIFI 时钟 感觉不错啊
回复 支持 反对

使用道具 举报

发表于 2020-1-2 09:43:40 | 显示全部楼层
问题解决了?可以给个外联吗?M币不够用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-2 14:23:02 | 显示全部楼层
wgha8 发表于 2020-1-1 14:42
有成品吗,自己小白一个。

焊好的主板要吗?自己配P3全彩板就能用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-2 14:33:39 | 显示全部楼层
酷玩小子 发表于 2020-1-2 09:43
问题解决了?可以给个外联吗?M币不够用

到我服务器下载
http://tangg.iok.la:81/index.php ... =1&sid=FE8fe4cQ
回复 支持 反对

使用道具 举报

发表于 2020-1-2 15:40:03 | 显示全部楼层
我下载了程序了,你上传的程序是做电子钟所用到的所有程序最新的集合是吧?
回复 支持 反对

使用道具 举报

发表于 2020-1-2 17:41:14 来自手机浏览器 | 显示全部楼层
楼主服务器怎么弄的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-3 09:36:04 | 显示全部楼层
社會忒墟僞 发表于 2020-1-2 17:41
楼主服务器怎么弄的

N1刷的linux系统,安装可道云
回复 支持 反对

使用道具 举报

发表于 2020-1-3 10:47:17 | 显示全部楼层
我感觉这个原因是由于时钟程序里有一个给ESP8266复位的语句引起的,8266的reset脚复位后,内部保存的wifi连接信息就会丢失。所以我感觉楼主这样处理的可能还会有这BUG。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-3 14:08:54 | 显示全部楼层
本帖最后由 28674500 于 2020-1-3 16:38 编辑

2019-01-03更新
使用WiFimanager库,用手机浏览器配网
刷写程序前,请修改自己天气地址
刷完程序,手机打开WiFi,搜索一个ESP开头的WiFi,无密码,连接后自动跳转到配网页面(如未跳转打开手机浏览器输192.168.4.1)
点击第一个,输入WiFi密码,即可。
如果中途WiFi信号没有了,一直等待WiFi出现,直到WiFi出现并连接。
如果不出现(更改了WiFi名或者换了路由器),请手动重启,按上面步奏重新配网。
mydigittimetanqi20200103.rar (2.7 KB, 下载次数: 28)
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-3 14:55:41 | 显示全部楼层
28674500 发表于 2020-1-3 14:08
2019-01-03更新
使用WiFimanager库,用手机浏览器配网
刷写程序前,请修改自己天气地址

解决了吗?这个WIFI没有一段时间能重新连接吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-3 16:39:49 | 显示全部楼层
yanglqq 发表于 2020-1-3 14:55
解决了吗?这个WIFI没有一段时间能重新连接吗?

解决了,即使WiFi断了,也会自动重新连接
下载下面的20200103这个
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-28 17:22 , Processed in 0.202800 second(s), 16 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表