完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
以下草图生成消息“'getHours'未在此范围内声明”。该草图是从一个 Instructables 项目下载的,没有人发现这个问题。我相信可能是我缺少一个 ESP8266 库,但无法弄清楚它是哪一个。作为新手,我希望我已经正确地做到了这一点并在正确的地方提出了问题。
任何指导将不胜感激。 #include #include #include #include ESP8266WiFiMulti wifiMulti; // 创建 ESP8266WiFiMulti 类的实例,称为 'wifiMulti' WiFiUDP UDP; IP地址时间服务器IP;// time.nist.gov NTP 服务器地址 const char* NTPServerName = "time.nist.gov"; 常量整数 NTP_PACKET_SIZE = 48;// NTP 时间戳在消息 字节的前 48 个字节中 NTPBuffer[NTP_PACKET_SIZE]; // 用于保存传入和传出数据包的缓冲区 Servo myservo; // 创建伺服对象来控制伺服 // 在大多数板上可以创建十二个伺服对象 int pos = 0; // 存储伺服位置的变量 void setup() { myservo.attach(5); // 将 5 号引脚上的伺服系统又名 D1 连接到伺服对象上 // 默认情况下打开盖子 Serial.println("opening the lid"); for (pos = 95; pos >= 0; pos -= 1) { // 从 95 度变为 0 度 myservo.write(pos); // 告诉伺服去变量'pos' delay(15) 中的位置;// 等待 15 毫秒让舵机到达位置 } Serial.begin(115200); // 启动串口通信向计算机发送消息 delay(10); Serial.println("\r\n"); 开始WiFi();// 尝试连接到一些给定的接入点。然后等待连接 startUDP(); if(!WiFi.hostByName(NTPServerName, timeServerIP)) { // 获取NTP服务器的IP地址 Serial.println("DNS lookup failed. Rebooting."); 序列号.flush(); ESP.重置(); } Serial.print("时间服务器IP:\t"); Serial.println(timeServerIP); Serial.println("\r\n正在发送 NTP 请求..."); 发送NTP数据包(时间服务器IP); } 无符号长间隔NTP = 60000; // 每分钟请求NTP时间 unsigned long prevNTP = 0; 无符号长 lastNTPResponse = millis(); uint32_t timeUNIX = 0; 无符号长 prevActualTime = 0; void loop() { unsigned long currentMillis = millis(); if (currentMillis - prevNTP > intervalNTP) { // 如果自上次 NTP 请求以来已经过了一分钟 prevNTP = currentMillis; Serial.println("\r\n正在发送 NTP 请求..."); 发送NTP数据包(时间服务器IP);// 发送 NTP 请求 } uint32_t 时间 = getTime(); // 检查 NTP 响应是否已到达并获取 (UNIX) 时间 if (time) { // 如果已收到新的时间戳 timeUNIX = time; Serial.print("NTP 响应:\t"); Serial.println(timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse) > 3600000) { Serial.println(“距离上次 NTP 响应超过 1 小时。正在重启。”); 序列号.flush(); ESP.重置(); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t easternTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (actualTime != prevActualTime && timeUNIX != 0) { // 如果自上次打印以来已经过了一秒 prevActualTime = actualTime; Serial.printf("\rUTC 时间:\t%d:%d:%d ", getHours(actualTime), getMinutes(actualTime), getSeconds(actualTime)); Serial.printf("\rEST (-5):\t%d:%d:%d ", getHours(东部时间), getMinutes(东部时间), getSeconds(东部时间)); 序列号.println(); } // 7:30am if(getHours(easternTime) == 7 && getMinutes(easternTime) == 30 && getSeconds(easternTime) == 0){ //打开盖子 Serial.println("opening the lid"); for (pos = 95; pos >= 0; pos -= 1) { // 从 95 度变为 0 度 myservo.write(pos); // 告诉伺服去变量'pos' delay(15) 中的位置;// 等待 15 毫秒让伺服器到达位置 } } // 午夜 if(getHours(easternTime) == 59 && getMinutes(easternTime) == 0 && getSeconds(easternTime) == 0){ // 关闭盖子 Serial. println("合上盖子"); for (pos = 0; pos <= 95; pos += 1) { // 从 0 度到 95 度 // 步长为 1 度 myservo.write(pos); // 告诉伺服去变量'pos' delay(15) 中的位置; // 测试 if(getHours(easternTime) == 12 && getMinutes(easternTime) == 45 && getSeconds(easternTime) == 0){ // 合上盖子 Serial.println("closing the lid"); for (pos = 0; pos <= 95; pos += 1) { // 从 0 度到 95 度 // 步长为 1 度 myservo.write(pos); // 告诉伺服去变量'pos' delay(15) 中的位置;// 等待 15 毫秒让舵机到达位置 } // 打开盖子 Serial.println("opening the lid"); for (pos = 95; pos >= 0; pos -= 1) { // 从 95 度到 0 度 myservo.write(pos); 延迟(15);// 等待 15 毫秒让伺服器到达位置 } } */ } void startWiFi() { // 尝试连接到一些给定的接入点。然后等待连接 wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); // 添加要连接的 Wi-Fi 网络 //wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); //wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); Serial.println("正在连接"); while (wifiMulti.run() != WL_CONNECTED) { // 等待 Wi-Fi 连接 delay(250); 序列号.print('.'); } Serial.println("\r\n" ); Serial.print("连接到"); Serial.println(WiFi.SSID()); // 告诉我们连接到哪个网络 Serial.print("IP address:\t"); Serial.print(WiFi.localIP()); // 将ESP8266的IP地址发送给电脑 Serial.println("\r\n"); } void startUDP() { Serial.println("Starting UDP"); UDP.开始(123);// 开始监听端口 123 上的 UDP 消息 Serial.print("Local port:\t"); Serial.println(UDP.localPort()); 序列号.println(); } uint32_t getTime() { if (UDP.parsePacket() == 0) { // 如果没有响应(还) 返回 0; } UDP.read(NTPBuffer, NTP_PACKET_SIZE); // 将 4 个时间戳字节组合成一个 32 位数字 uint32_t NTPTime = (NTPBuffer[40] << 24) | (NTPBuffer[41] << 16) | (NTPBuffer[42] << 8) | NTP缓冲区[43]; // 将 NTP 时间转换为 UNIX 时间戳: // Unix 时间从 1970 年 1 月 1 日开始。NTP 时间为 2208988800 秒: const uint32_t seventyYears = 2208988800UL; // 减去七十年: uint32_t UNIXTime = NTPTime - seventyYears; 返回 UNIX 时间; } void sendNTPpacket(IPAddress& address) { memset(NTPBuffer, 0, NTP_PACKET_SIZE); // 将缓冲区中的所有字节设置为 0 // 初始化形成 NTP 请求所需的值 NTPBuffer[0] = 0b11100011; // LI, Version, Mode // 发送请求时间戳的数据包: UDP.beginPacket(地址, 123); // NTP 请求到端口 123 UDP.write(NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket(); } 当您没有在设置函数之前声明变量时会发生此错误。https://forum.arduino.cc/t/solved-varia ... tup/471208 我看不到 getHours 的任何声明。 由于这是在 NTP 功能的上下文中使用的,因此 getHours 可能引用了包含在 NTPClient 库中但未包含的函数。 如果 NTPClientLib 尚未安装,则应通过库管理器安装,然后应将 #include 添加到代码顶部以及其他包含 感谢您的回复,告诉我还有多少东西要学,但是我永远不会弄清楚图书馆的要求; NTPClientlib 没有安装,所以我已经成功安装了。 然后,我将 #include 添加为草图包含部分的第一行。 当我编译时,我得到与以前相同的错误。 |
|
相关推荐
1个回答
|
|
这个错误消息是因为代码中使用了一个函数名为“getHours”,但编译器无法找到它的定义。可能是由于缺少某个库文件或者代码中的语法错误。检查代码中是否有任何拼写错误或者作为对象成员的函数名称是否已正确引用。如果这些都没有问题,可以尝试搜索与此错误相关的ESP8266库并安装它。
|
|
|
|
只有小组成员才能发言,加入小组>>
920 浏览 1 评论
552浏览 6评论
461浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
446浏览 5评论
447浏览 4评论
417浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 22:03 , Processed in 0.726537 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号