资料介绍
描述
只需发短信即可连接到这个智能恒温器,无需额外的仪表板或平台。
了解电报机器人
Telegram 提供了一组超级有用的 API ,您可以在项目中使用。
您可以在 Arduino 板上托管一个机器人,并使用一个名为 Telegram Bot的简单库与它聊天。您可以通过 Arduino 桌面 IDE 中的库管理器安装此库,或者通过在Arduino Web 编辑器上导入 .Zip 文件来安装此库。
您可以在此处了解有关如何在 MKR1000 上管理 Telegram Bot 的所有 信息。在本教程 中,我们将跳过这一步,但您将看到如何在最终代码中实现 Telegram 机器人。
时间管理
这个恒温器允许你编程一整周并循环它。
为此,恒温器发出 UDP 调用并使用接收到的数据来设置实时时钟 (RTC)。
安装 RTCZero 和WiFi101库 并上传此草图以测试此功能。
#include
#include
#include
#include
RTCZero rtc;
WiFiUDP Udp; // A UDP instance to let us send and receive packets over UDP
// Initialize Wifi connection to the router
char ssid[] = "xxxx"; // your network SSID (name)
char pass[] = "yyyy"; // your network key
WiFiSSLClient client;
unsigned long epoch;
unsigned int localPort = 2390; // local port to listen for UDP packets
IPAddress timeServer(129, 6, 15, 28); // time.nist.gov NTP server
const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
void setup() {
Serial.begin(115200);
// attempt to connect to Wifi network:
Serial.print("Connecting Wifi: ");
Serial.println(ssid);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("WiFi connected");
rtc.begin();
GetCurrentTime();
}
void loop() {
Serial.print("Unix time = ");
Serial.println(rtc.getEpoch());
// Print date...
Serial.print(rtc.getDay());
Serial.print("/");
Serial.print(rtc.getMonth());
Serial.print("/");
Serial.print(rtc.getYear());
Serial.print("\t");
// ...and time
print2digits(rtc.getHours());
Serial.print(":");
print2digits(rtc.getMinutes());
Serial.print(":");
print2digits(rtc.getSeconds());
Serial.println();
delay(1000);
}
void print2digits(int number) {
if (number < 10) {
Serial.print("0");
}
Serial.print(number);
}
void GetCurrentTime() {
int numberOfTries = 0, maxTries = 6;
do {
epoch = readLinuxEpochUsingNTP();
numberOfTries++;
}
while ((epoch == 0) || (numberOfTries > maxTries));
if (numberOfTries > maxTries) {
Serial.print("NTP unreachable!!");
while (1);
}
else {
Serial.print("Epoch received: ");
Serial.println(epoch);
rtc.setEpoch(epoch);
Serial.println();
}
}
unsigned long readLinuxEpochUsingNTP()
{
Udp.begin(localPort);
sendNTPpacket(timeServer); // send an NTP packet to a time server
// wait to see if a reply is available
delay(1000);
if ( Udp.parsePacket() ) {
Serial.println("NTP time received");
// We've received a packet, read the data from it
Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer
//the timestamp starts at byte 40 of the received packet and is four bytes,
// or two words, long. First, esxtract the two words:
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// combine the four bytes (two words) into a long integer
// this is NTP time (seconds since Jan 1 1900):
unsigned long secsSince1900 = highWord << 16 | lowWord;
// now convert NTP time into everyday time:
// Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
const unsigned long seventyYears = 2208988800UL;
// subtract seventy years:
Udp.stop();
return (secsSince1900 - seventyYears);
}
else {
Udp.stop();
return 0;
}
}
// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress & address)
{
// set all bytes in the buffer to 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
packetBuffer[0] = 0b11100011; // LI, Version, Mode
packetBuffer[1] = 0; // Stratum, or type of clock
packetBuffer[2] = 6; // Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123); //NTP requests are to port 123
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}
保存设置
当然你不希望你的恒温器在每次关闭时都忘记它的设置:)
为避免此问题,您可以使用FlashStorage库将数据存储在威廉希尔官方网站 板的闪存中。
在这种特殊情况下,我们使用此功能来存储 7 天 7*24 小时的结构,以及所需温度的值。
上传此示例以测试此功能。
/*
Store and retrieve an integer value in Flash memory.
The value is increased each time the board is restarted.
This example code is in the public domain.
Written 30 Apr 2015 by Cristian Maglie
*/
#include
// Reserve a portion of flash memory to store an "int" variable
// and call it "my_flash_store".
FlashStorage(my_flash_store, int);
// Note: the area of flash memory reserved for the variable is
// lost every time the sketch is uploaded on the board.
void setup() {
SERIAL_PORT_MONITOR.begin(9600);
int number;
// Read the content of "my_flash_store" and assign it to "number"
number = my_flash_store.read();
// Print the current number on the serial monitor
SERIAL_PORT_MONITOR.println(number);
// Save into "my_flash_store" the number increased by 1 for the
// next run of the sketch
my_flash_store.write(number + 1);
}
void loop() {
// Do nothing...
}
从传感器读取值
在这个项目中,我们使用可以检测湿度和温度的 DHT 传感器。这个传感器有自己的库,你可以 在这里下载。
由于草图实现了许多功能,我们将其组织在不同的选项卡中,以下这些代码片段指的是传感器。
在 Config 选项卡中,我们声明传感器的类:
//#define USE_fahrenheit true // Uncomment this to use Fahrenheit insted of Celsius
class Sensor {
public:
Sensor(void);
void begin();
bool ReadSensors();
float GetTemp();
float GetHumidity();
private:
float t;
float f;
float h;
};
extern Sensor DHTSensor;
在另一个选项卡中,我们定义了传感器类:
#include "DHT.h"
#include "config.h"
DHT dht(DHTPIN, DHTTYPE);
Sensor::Sensor(void) {
}
bool Sensor::ReadSensors() {
h = dht.readHumidity();
t = dht.readTemperature(); // Read temperature as Celsius (the default)
f = dht.readTemperature(true); // Read temperature as Fahrenheit (isFahrenheit = true)
if (isnan(h) || isnan(t) || isnan(f)) { // Check if any reads failed and exit early (to try again).
Serial.println("Failed to read from DHT sensor!");
return false;
}
return true;
}
void Sensor::begin() {
dht.begin();
}
float Sensor::GetTemp() {
#ifdef USE_fahrenheit
return f;
#else
return t;
#endif
}
float Sensor::GetHumidity() {
return h;
}
硬件组件和库
现在您可以开始连接恒温器了。考虑到 LCD 显示器需要GFX和 ST7735库,而 DHT 传感器需要 DHT-sensor-library。
- 智能恒温器开源项目
- 温差恒温器开源硬件
- 使用螺栓的恒温器
- 模块化WiFi智能恒温器的构建
- Arduino供电恒温器和风扇控制器 0次下载
- 蓝牙控制恒温器
- 智能恒温器开源案例
- 迷你恒温器开源分享
- 恒温器开源分享
- 如何使用固态继电器驱动恒温器
- 恒温器TH32开源分享
- 恒温器Lm358 tl494 21 clima开源项目
- 烙铁恒温器威廉希尔官方网站 图 34次下载
- 恒温器控制威廉希尔官方网站 原理图免费下载 11次下载
- 2017全球WiFi恒温器市场发展现状及趋势研究 4次下载
- 使用MOSFET作为恒温加热器 1154次阅读
- 如何制作一个通过本地WiFi网络浏览器进行控制的恒温器 1873次阅读
- 恒温加热器的工作原理_恒温加热器保养 1.8w次阅读
- 智能家居安全隐患有哪些_智能家居不为人知的恐怖一面_使用智能家居应注意什么 4260次阅读
- 恒温电烙铁及焊接知识 3147次阅读
- 用NE555设计的恒温控制器的方案 7769次阅读
- 电子恒温器 4168次阅读
- 用于植物的土壤加热器 3770次阅读
- 小型恒温控制器 2519次阅读
- 鱼缸电子恒温器威廉希尔官方网站 图 3403次阅读
- 双线遥控交流电子恒温器威廉希尔官方网站 图 2168次阅读
- 三线电子恒温器威廉希尔官方网站 图 6041次阅读
- 智能恒温控制威廉希尔官方网站 3363次阅读
- 实用的恒温控制器威廉希尔官方网站 图 3932次阅读
- 家用恒温控制器威廉希尔官方网站 图 4268次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成威廉希尔官方网站 应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口威廉希尔官方网站 图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字威廉希尔官方网站 基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动威廉希尔官方网站 设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6威廉希尔官方网站 仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多