ATMEGA328P控制器上的自主气象站,电池由无线遥感器供电

改善房间温度调节器,这是我之前写的 ,我打算用无线温度传感器来补充它,以测量室外空气温度,组装电池供电的温度调节器,并用另一对无线电模块替换RF 433MHz发射器-接收器模块,该模块具有更长的通信范围,且供电电压不超过超过3V。 在解决这些问题的过程中,出现了一个自动气象站,下面将对此进行讨论。



气象站由两个节点组成,为简单起见,我们将其称为分析仪和温度计。 节点之间的通信-无线,无线。


分析仪基于ATMEGA328P控制器,可测量室内的温度和湿度(温度和湿度传感器DHT22)以及分析仪的电源电压,该电压由两节AA 1.5V电池提供。 控制器从LoRa接收器接收信号,该接收器通过空气从温度计(远程传感器)接收信息。 来自控制器的信息显示在诺基亚5110的LCD上。


温度计也安装在ATMEGA328P控制器上,用于测量室外温度(温度传感器DS18B20)和远程单元的电源电压,该远程单元由两节1.5 V AA电池组组成,该单元的LoRa变送器将温度和电源电压传输到分析仪。


温度计的ATMEGA328P控制器和LoRa变送器进入睡眠模式,以节省测量后的电池电量并发送信息。 仅在温度测量期间以编程方式施加DS18B20传感器的电源电压。 温度计的测量和发送数据需要大约一分钟的时间。


在相同的工作睡眠模式下,分析仪也可以工作。 控制器和接收器分析仪的持续时间要比一分钟多几秒钟。 这样做是为了放心地接收来自温度计的信号-毕竟,温度计和分析仪的操作不同步。 然后将ATMEGA328P和LoRa接收器置于睡眠模式达14分钟,然后唤醒并开始下一个周期。 DHT22仅在测量期间提供电源。


为了编程ATMEGA328P控制器的睡眠模式,使用了LowPower.h库。


随着电池放电,电池上的电压值降低。



ATMEGA328P控制器的工作电压下限为1.8V。 同时,执行了保险丝ATMEGA328P的出厂设置以监视2.7V的电源电压阈值,因此有必要将保险丝的出厂设置更改为1.8V的监视阈值,以确保由废电池供电时控制器的运行。


内部控制器发生器可能无法以3 MHz或更低的电源电压以16 MHz的频率启动。 两种控制器均使用2.7 ... 2.8 V降低的电源电压使用16 MHz石英,因此我没有将16 MHz石英更改为8 MHz。



要组装设备,您将需要一些组件,这些组件的列表及其在速卖通网站价格上的估计成本显示在表中。


组成部分价格,美元
分析仪
ATMEGA328P-PU控制器1,59
温湿度传感器DHT222,34
LoRa Ra-01发送器3.95
诺基亚5110液晶屏1.91
面包板(安装)板,安装线,AA电池,16 MHz石英谐振器,电阻器等。4.00
体温计
ATMEGA328P-PU控制器1,59
DS18B20温度传感器0.63
LoRa Ra-01发送器3.95
开发板(玻璃纤维),安装线,AA电池,16 MHz石英谐振器,电阻器等。4.00
总计(大约):24

分析仪




分析仪的大脑是ATMEGA328P控制器。 它从DHT22传感器接收信号,并通过SPI协议与LoRa接收器和NOKIA 5110显示器进行通信。



互联网上有很多关于DHT22精度低的投诉。 如今有另一种选择:更现代的温度和湿度传感器HTU21(GY21) ,(Vcc = 3 ... 5 V), Si7021 ,(Vcc = 1.9 ... 3.6 V), SHT21 ,(Vcc = 2.1 .... 3.6 V)。


我使用DHT22,因为我的传感器样品的湿度读数与市售的LaCrosse WS-9024IT温湿度计之间的差异不超过8个单位,这对于家用而言是可以接受的。 如果DHT22电源电压低于3V,则湿度读数之间的差异会大大增加。 这是可以理解的,因为DHT22的电源电压应在3 ... 5V之内。 总结一下-在这些情况下,理想的情况是Si7021传感器适合分析仪电路


在下面的图片中-气象站元素的引脚排列。



可以使用SinaProg实用程序读取和编辑Fusion以及包括ATMEGA328P在内的各种控制器。 如果您是第一次使用此程序,则尽管界面直观,但在安装应用程序后请勿尝试开始使用它。 首先阅读本文 ,其中在将Arduino UNO板用作引导加载程序时, HWman提供了必要的SinaProg附加组件。


我建议您首先阅读融合ATMEGA328P的出厂设置,并保存它们的值,以便在出现故障时返回到它们。 在我的控制器中,保险丝位的出厂设置为: LOW:0xFF,HIGH:0xDE,EXTENDED:0x05 (Vcc = 2.7V,BODLEVEL = 101)。 用于监视您要设置的1.8V阈值的新保险丝: LOW:0xFF,HIGH:0xDE,EXTENDED:0x06 (Vcc = 1.8V,BODLEVEL = 110)。


用于加载到ATMEGA328P中的分析仪草图在扰流板下方。


分析仪草图
```cpp
/ *
ATMEGA328P控制器上的自主气象站,电池由无线遥感器,分析仪供电
https://habr.com/cn/post/470381/
* /

#include <SPI.h>
#include <LoRa.h>

#include <DHT.h>
#define DHTPIN 3 //我们连接到哪个数字引脚
#define DHTTYPE DHT22 // DHT 22(AM2302),AM2321
DHT dht(DHTPIN,DHTTYPE);

浮锡= 0;
int Hin = 0;
浮动BatteryInLevel; //基本电池电压
字符串LoRaData,Tout_str,BatteryInLevel_str,BatteryOutLevel_str;

//睡觉
#include <LowPower.h>
#define PowerDHT(4)// DHT22电源引脚
unsigned int sleepCounter;

//诺基亚5110
#include <SPI.h>
#include <Adafruit_GFX.h> //https://esp8266.ru/forum/threads/esp8266-5110-nokia-lcd.1143/#post-16942
#include <Adafruit_PCD8544.h> //https://esp8266.ru/forum/threads/esp8266-5110-nokia-lcd.1143/#post-16942

//计时器
#include <SimpleTimer.h>
SimpleTimer计时器;

Adafruit_PCD8544显示= Adafruit_PCD8544(5、7、6);

无效sendSensor(){
digitalWrite(PowerDHT,1);
延误(2000);
Hin = dht.readHumidity();
锡= dht.readTemperature();

/ * if(isnan(Hin)|| isnan(Tin)){
// Serial.println(“无法从DHT传感器读取!”);
归还
} * /

digitalWrite(PowerDHT,0);

//电池电压测量:
AnalogReference(INTERNAL);
int sensorValue = AnalogRead(A4);
BatteryInLevel =(传感器值* 3.2 / 1024);
}

无效抽奖(){
display.clearDisplay();
//锡
{
display.setTextSize(2);
display.setCursor(8,0);
display.println(Tin,1); //小数点后一位
display.setCursor(68,0);
display.println(“ C”);
}
//欣
{
display.setTextSize(2);
display.setCursor(8,16);
display.println(String(Hin)+“%”);
}
// Tout
{
字符chr_Tout [12];

Tout_str.toCharArray(chr_Tout,5);
display.setTextSize(1);
display.setCursor(50,16);
display.println(String(chr_Tout)+“ C”);
}
//电池电量不足
{
char chr_BatteryOutLevel [12];

BatteryOutLevel_str.toCharArray(chr_BatteryOutLevel,4);
display.setTextSize(1);
display.setCursor(2,32);
display.println(“ BAT Out:” +字符串(chr_BatteryOutLevel)+“ V”);
}
//电池电量
{
display.setTextSize(1);
display.setCursor(2,40);
display.println(“ BAT In:„);
display.setCursor(56,40);
display.println(BatteryInLevel,1); //小数点后一位
display.setCursor(74,40);
display.println(“ V”);
}

display.display();
/ *
Serial.println(“ Tin:” +字符串(Tin)+“ * C”);
Serial.println(“ H​​in:” +字符串(Hin)+“%”);
Serial.println(“ Tout:” +字符串(Tout_str)+“ * C”);
Serial.println(“ BAT_In:” +字符串(BatteryInLevel)+“ V”);
Serial.println(“ BAT_Out:” +字符串(BatteryOutLevel_str)+“ V”);
Serial.println(“ ......”);
* /
}

void sleepDevice(){
// sleepCounter = 65-10分钟
// sleepCounter = 91-14分钟
for(sleepCounter = 91; sleepCounter> 0; sleepCounter--)// 91 !!!
{
LoRa.sleep();
LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
}
LoRa.sleep();
}

无效SignalReception(){
//尝试解析数据包
int packetSize = LoRa.parsePacket();
如果(packetSize){
//读取数据包
而(LoRa.available()){
LoRaData = LoRa.readString();
// Serial.println(“ Accepted:” +(LoRaData));
}
int pos1 = LoRaData.indexOf('#');
Tout_str = LoRaData.substring(0,pos1);
BatteryOutLevel_str = LoRaData.substring(pos1 + 1,LoRaData.length());
}
}

无效设置(){
//Serial.begin(9600);
pinMode(PowerDHT,输出);

//初始化并清除显示
display.begin();
display.clearDisplay();
display.display();
display.setContrast(60); //设置对比度

display.clearDisplay();
display.setTextSize(2);
display.setCursor(12,16);
display.println(“ >>>>>”); //开启时指示工作开始
display.display();

dht.begin();
sendSensor();
画();

while(!LoRa.begin(433E6)){
//Serial.println(“。”);
延误(500);
}
//同步字的范围在“ 0-0xFF”之间。
LoRa.setSyncWord(0xF3);
//Serial.println(wonLoRa初始化“);
timer.setInterval(20000,sendSensor);
timer.setInterval(5000,开奖);
timer.setInterval(65000,sleepDevice);
}

无效循环(){
SignalReception();
timer.run();
}
``''


为了与ATMEGA328P控制器一起使用,我将Arduino UNO板用作编程器。 Youtube 有一个很好的视频,介绍如何安装引导加载程序以及使用Arduino UNO板将草图下载到ATMEGA328控制器。


草图注释掉了输出到串行端口监视器(串行)的命令。 如有必要,请取消注释。


该周期开始于通过LoRa接收器收听广播并接收信息。 计时器设定收听时间-65秒。 此时,以5秒钟的时间更新NOKIA显示屏上的信息,以20秒钟的时间(3次)更新DHT22传感器通过控制器的模拟输入之一测量温度,湿度以及电池的电压水平。 DHT22的电源电压仅在测量期间以至少2秒的延迟施加,此时传感器仍在工作。 草图中ADC的输出按比例缩放为新电池的电压,即3.2V(1.6V x 2)。 空气的收听时间选择为略大于1分钟,以放心地从温度计接收一个数据包,该温度计在1分钟的传输时间内正常工作,但在下面的传输时间更长。 然后,在第62秒,控制器和接收器进入睡眠模式,该模式持续约14分钟,即 分析仪的“工作/睡眠”周期约为15分钟。 我注意到分析仪中的睡眠模式是一种强制措施,旨在显着减少能耗。


为了进行比较,下表显示了LaCrosse WS-9024IT温湿度计和该项目分析仪的特性。


参量君越WS-9024ITSadilTM
营养学2xAA,3B,Durasell2xAA,3V,GP Ultra +,1800 mAh
睡眠消耗350μA(10μA)
睡眠时间14分钟
运营消耗<200μA12-18毫安
工作时间约1分钟
工作/睡眠周期15分钟
营业时间大约2年约2.5个月

LaCrosse舞蹈的当前消耗量很大。 在表中,我给出了峰值测量值以显示消耗的顺序:不超过200微安。



我想用类似业余开发的结果来补充表格,但是我什么也没找到。 可能是因为大多数业余爱好者将信息从传感器输出到计算机,平板电脑,智能手机,或者在传输到网络上其中一项根本不存在节省电池寿命问题的服务的途中的信息。


LCD是导致分析仪睡眠(350μA)的主要因素。 如果将其关闭,则功耗将降至10μA。 当LoRa接收器从发射器接收信号时,会发生18 mA的峰值消耗,但该信号需要花费几微秒的时间。 与接收机处于监听模式的时间和消耗10 mA的时间相比,此时间非常短,因此在计算一组电池的工作时间时,我没有考虑此短期峰值。


计算工作时间。
平均电流消耗:10 mA / 15 + 0.35 mA = 1.0 mA,其中15是占空比。 工作时间:1800 mA *小时/ 1.0 mA = 1800小时(2.5个月)。
我将澄清:
-计算非常近似。
-LaCrosse的营业时间是根据我自己的经验得出的。 我已经使用此设备很长时间了。


体温计



寒冷天气下电池的容量和电压会大大降低 。 因此,为了不使电池和整个设备经受如此严格的测试,我只取出了房间外面的DS18B20温度传感器,并将设备和电池放在房间里。 DS18B20用细的三线电缆连接到主板。 我在我的串行气象站中发现了该解决方案-开发人员确信,在公寓中总会留有空隙来铺设直径为几毫米的电线。



ATMEGA328P温度计的保险丝与分析仪的保险丝相同。


温度计组件也建在ATMEGA328P控制器上。 它从DS18B20传感器接收信号,测量电源电压并控制LoRa变送器。



温度计草图在扰流板下方。


温度计素描
/*     ATMEGA328P        ,  https://habr.com/ru/post/470381/ */ #include <OneWire.h> OneWire ds(7); //pin 13, Atmega328P #include <SPI.h> #include <LoRa.h> #include <LowPower.h> #define PowerDS18B20 (6) //pin 12 (Atmega328P), e DS18B20 unsigned int sleepCounter; // ,    float Tout; // int i; //         (20   1 ) String messageTout; // LoRa- float batteryLevel; //   const int batteryPin = A0; // pin 23 (Atmega328P),        void Measurement () { //  byte data[2]; digitalWrite(PowerDS18B20, 1); ds.reset(); ds.write(0xCC); //     (1 ) ds.write(0x44); //    delay(700); ds.reset(); ds.write(0xCC); ds.write(0xBE); //      data[0] = ds.read(); data[1] = ds.read(); Tout = ((data[1] << 8) | data[0]) * 0.0625; // Serial.println("Tout= "+ String(Tout)); digitalWrite(PowerDS18B20, 0); //   : analogReference(INTERNAL); int sensorValue = analogRead(A0); batteryLevel = (sensorValue * 3.2 / 1024); // Serial.println("BAT= "+ String(batteryLevel)); } void SetSynchLoRa () { int counter = 0; while (!LoRa.begin(433E6) && counter < 10) { // Serial.print("."); counter++; delay(500); } LoRa.setTxPower(4); //  2-20  /* if (counter == 10) { // Serial.println("Failed to initialize ..."); }*/ LoRa.setSyncWord(0xF3); } void SendMessage () { //   (,  ) messageTout = String(Tout) + "#" + String(batteryLevel); // Serial.println(messageTout); delay(250); LoRa.beginPacket(); LoRa.print(messageTout); LoRa.endPacket(); } void setup() { //Serial.begin(9600); // Serial.println("Initializing ..."); pinMode(PowerDS18B20, OUTPUT); SetSynchLoRa (); } void loop() { //Serial.println(""); //Serial.println("i = " + String(i)); if (i >= 30) { // i >= 30 (1 ) —   (,  — 1 /1 ) for (sleepCounter = 5; sleepCounter > 0; sleepCounter--) { LoRa.sleep (); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); } Measurement (); SendMessage (); LoRa.sleep (); } else { //   1 ,  — 1 /2  Measurement (); SendMessage (); delay (1000); } i++; if (i >= 30) i = 30; //    } 

一对LoRa发射器-接收器可在1.5公里的距离内提供稳定的通信,并具有直接的可视性,并且在城市地区最长可达300 m,当然,最大或接近最大发射器功率:17-20 dB。 为了使公寓内保持稳定连接,仅需4 dB。


首先,接通电源后,温度计将在密集模式下运行一分钟。 它测量电池的温度,电压,并每2秒钟将其值在空中发送一次。 这是为了方便。 假设您在更换电池或进行调试时不必等待一分钟。 连接温度计和分析仪的电池后的最初几秒钟,来自传感器的信息将出现在分析仪的显示屏上。 自然,您应该抓紧时间,在两个节点上连接电池之间的时间不要超过一分钟。


然后,遥感器进入正常模式。 在测量并发送了比第一秒稍长的信息之后,控制器和发送器进入软件睡眠模式约1分钟。


计算工作时间。
平均电流消耗:14 mA / 60 + 0.005 mA = 0.24 mA,其中60为占空比。 工作时间:1800 mA *小时/ 0.24 mA = 7500小时(10个月)。
以前有关单组电池计算的工作时间准确性的澄清仍然有效。


和比较表。 它包含来自Internet的几个类似项目的结果。


参量君越WS-9024IT疯子avs24rusSadilTM
营养学2xAAA,3B,Durasell3V,CR2450 Renata,540毫安3V,CR2450,550-610毫安2xAA,3V,GP Ultra +,1800 mAh
睡眠消耗0.14 mA(?)14微安5微安
睡眠时间1分钟
运营消耗<700μA13.57毫安16-18 mA14毫安
工作时间0.027秒1秒
工作/睡眠周期1分钟10分钟1分钟
营业时间大约2年0。5年以上大约10个月

如果节点组装正确无误,则在显示屏上我们将看到以下图片:



从比较表中可以看出,业余设备的峰值功耗比工业LaCrosse的类似功能高一个数量级。 例如,远程传感器为14 mA对700μA,分析仪为10 ... 18 mA对200μA。 我认为,这种最大消耗量的显着差异是通过以下事实来解释的:业余电路中的控制器是使用Arduino IDE平台,繁重的功能和库以及在工业产品中进行编程的-最有可能使用一种低级语言或例如C语言++(顺便说一句,是Arduino的基本语言)或C(C)。 如果您使用这些语言,那么我相信您可以达到与工业品外观设计相当的消费量。 然而,这在HWman的出版物“ 为什么许多人不喜欢Arduino ”中非常有说服力地证明了这一点。 正如在视频中作者所言,在一种情况下,在Arduino IDE中执行最多一打的最简单草图(闪烁),正如作者在视频中所说的那样,“简单C”会导致26倍的性能损失。 简而言之,增加资源消耗是为了给程序员带来舒适感和一小部分的付出,其余的将由他在Arduino中对开发环境的“繁琐”功能来完成。 我希望您至少要精通和掌握C / C ++的基础知识,而C / C ++的功能是由Arduino IDE编译的。


结论


•与工业设计相比,组装的分析仪和温度计消耗的电流过多。


•第三个建议针对电路中的两个电池,然后自动解决以下问题:无需重新安装保险丝,控制器以16 MHz的频率工作,传感器DHT22,DS18B20远低于其电源电压下限。 后者很重要,因为电源电压不是直接提供给传感器,而是通过控制器引脚上的按键以编程方式提供,在该引脚上大约下降1V。


•使用具有4 dB可编程发射器功率的LoRa无线电模块,可以使用两节AA电池为模块供电,从而在公寓内建立稳定的连接。


相关连结


低能耗无线传感器组件
CR2450无线照明传感器
nRF52832上的无线温度,湿度和大气压传感器
无线体温计
将Arduino转变为成熟的AVRISP程序员
劳拉和睡眠
了解ATmega328P的配置位以及如何与外部石英晶体一起使用
AVR融合计算器
为什么很多人不喜欢Arduino
盛大电池测试
电池在寒冷中

Source: https://habr.com/ru/post/zh-CN470381/


All Articles