Untuk membuat semacam sensor nirkabel yang mengandung barometer, termometer, hygrometer atau semua dalam satu botol, didukung oleh 220V tidak menjadi masalah. Tetapi untuk menghidupkan perangkat seperti itu dari baterai atau akumulator sudah lebih menarik. Nah, jika itu adalah baterai lithium disc (tablet) - umumnya keren, karena perangkat akan berubah menjadi sangat kompak.
Satu-satunya kendala untuk menggunakan "pil" adalah kapasitasnya yang kecil. Tetapi bahkan di antara "tablet" ada spesimen yang sangat cocok, misalnya CR2450, dengan kapasitas yang diklaim 550-610 mAh.Karena pada saat pembuatan perangkat saya sudah memiliki sensor suhu dan kelembaban indoor dan outdoor yang siap pakai, saya memutuskan untuk membuat sensor pencahayaan berdasarkan BH1750 dan meletakkannya di balkon, selain itu dilengkapi dengan sensor suhu DS18B20.Karena semua jendela saya menghadap ke selatan, sensor suhu dan kelembaban luar ruangan sangat dipengaruhi oleh sinar matahari, efek ini harus dikompensasi oleh data cuaca yang diterima dari Internet, di masa depan, saya berencana untuk menggunakan informasi tentang tingkat pencahayaan untuk menghitung kompensasi.Untuk meminimalkan energi yang dikonsumsi oleh sensor, diputuskan:1. Menolak untuk menggunakan Arduinki yang sudah jadi dan menggunakan mikrokontroler ATmega 328P-PU dengan kuarsa 8 MHz secara langsung. Saya menolak untuk menggunakan generator RC internal, karena karena perubahan signifikan pada suhu eksternal, frekuensi operasi tidak stabil.2. Gunakan pustaka LowPower dan aktifkan mode hemat daya LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF) untuk controller3. Beri daya sensor DS18B20 dari output digital mikrokontroler dan nyalakan segera sebelum pengukuran.4. Berikan daya langsung pada modul radio dan BH1750, menggunakan mode hemat energi, radio.powerDown () dan Light.configure (BH1750_ONE_TIME_HIGH_RES_MODE), masing-masing.Dipersenjatai dengan programmer USBasp,
Saya meminta sekring di controller dan, tentu saja, bootloader. Saya membuat prototipe, membuat sketsa tes dan mengukur arus yang dikonsumsi: dalam mode tidur ternyata 14 μA, dalam mode pengambilan bacaan dari sensor - 3-4 mA, dalam mode pengiriman data melalui nRF24 ke stasiun cuaca - 16-18 mA. Mengingat fakta bahwa saya memutuskan untuk mengambil bacaan dari sensor sekali setiap 3 menit, dan mengirimkan setiap 10 menit - sensor ini sangat ekonomis.Untuk pembuatan perangkat akhir digunakan sepotong papan tempat memotong roti dan kawat MGTF. Hasilnya adalah apa yang terjadi:
Untuk memantau status baterai, kami menggunakan fitur bawaan ATmega, yang dijelaskan dengan baik dalam artikel ini .Proses flashing bootloader dan sekering tercakup secara rinci di sini dan di sini .Gagasan umum untuk membuat sensor otonom dipinjam di situs web maniacbug .Sensor sudah berbohong (dan berfungsi) untuk bulan kedua di balkon di ambang jendela, mengirimkan data dengan benar. Kontrol daya melaporkan bahwa selama waktu ini tegangan sumber berkurang dari 3.05V ketika pertama kali dinyalakan ke 2.98V. Namun, pada siang hari, ketika matahari menghangatkan balkon, tegangan bisa naik hingga 3.00V. Saya menantikan cuaca dingin, mari kita lihat bagaimana baterai yang dipilih akan menunjukkan dirinya pada suhu rendah.Dengan durasi mode tidur yang dipilih, ternyata sensor hanya terjaga 492-495 detik dalam 24 jam.Perangkat ini lengkap, tetapi sayangnya sejauh ini tanpa kasing, saya tidak dapat menemukan yang cocok

penambahan 03/20/2016.6 , . -24, 2,5280V.
( ) 4 + .
Sumber#include <LowPower.h>
#include <SPI.h>
#include <RF24Network.h>
#include <RF24.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <BH1750.h>
class AVG {
#define DEPTH_AVG 10
private :
int depth;
long *mas;
int cur;
boolean first;
public :
boolean fDebug;
AVG(int d)
{
if( d == 0 || d > DEPTH_AVG)depth = DEPTH_AVG;
else depth = d;
mas = (long *)malloc(sizeof(long)*depth);
first = true;
cur = 0;
fDebug = false;
}
void Set(long x)
{
if( first )
{
for( int i=0; i<depth; i++ )mas[i] = x;
cur = 0;
}
else
{
mas[cur++] = x;
if( cur >= depth ) cur = 0;
}
first = false;
}
long Get()
{
long x=0;
for( int i=0; i<depth; i++ )
{
x+=mas[i];
}
x/=depth;
return(x);
}
};
#define pinPowerSensor 4
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
BH1750 Light;
RF24 radio( 9, 10);
RF24Network network(radio);
uint16_t this_node = 02;
uint16_t main_node = 0;
const int Chanel = 11;
int ReadCount;
int iSend = 3;
int WaitCount = 24;
bool allowSend = false;
AVG vAVG(3);
AVG tAVG(3);
AVG lAVG(3);
struct StreetMeteoSensor
{
char ID[5];
unsigned long UpTime;
int T;
long L;
int V;
};
struct StreetMeteoSensor sensor;
RF24NetworkHeader header(main_node, 'I');
#define DEBUG_MODE 0
void setup(void)
{
if (DEBUG_MODE)
{
Serial.begin(115200);
Serial.println("-- START --");
WaitCount = 5;
}
for (int i = 1; i < 15; i++)
{
pinMode(i, OUTPUT);
digitalWrite(i,LOW);
}
digitalWrite(pinPowerSensor,HIGH);
char ID[5] = "LTS1";
memcpy(sensor.ID, ID, 5);
ReadCount = iSend;
SPI.begin();
delay(500);
radio.begin();
network.begin( Chanel, this_node );
sensors.begin();
Light.begin(BH1750_ONE_TIME_HIGH_RES_MODE);
delay(500);
radio.powerDown();
digitalWrite(pinPowerSensor,LOW);
Light.configure(BH1750_POWER_DOWN);
if (DEBUG_MODE) Serial.println("-- End SETUP --");
}
void loop(void)
{
if (DEBUG_MODE) Serial.println("data read...");
Light.configure(BH1750_POWER_ON);
Light.configure(BH1750_ONE_TIME_HIGH_RES_MODE);
digitalWrite(pinPowerSensor,HIGH);
sensors.setResolution(TEMP_9_BIT);
delay(250);
sensors.requestTemperatures();
int T = sensors.getTempCByIndex(0);
digitalWrite(pinPowerSensor,LOW);
long L = Light.readLightLevel();
int V = readVcc();
int tt = tAVG.Get();
int vv = vAVG.Get();
long ll = lAVG.Get();
if (L > 0 || ll > 0 || T < tt-2 || T > tt+2 || V < vv-100)
{
tAVG.Set(T);
lAVG.Set(L);
vAVG.Set(V);
allowSend = true;
if (ll == 0 && L > 0)
lAVG.Set(L);
}
ReadCount++;
if (DEBUG_MODE)
{
Serial.print("T= ");
Serial.print(tAVG.Get());
Serial.print(": ");
Serial.print(T);
Serial.print("; L= ");
Serial.print(lAVG.Get());
Serial.print(": ");
Serial.print(L);
Serial.print("; V= ");
Serial.print(vAVG.Get());
Serial.print(": ");
Serial.print(V);
Serial.print("; ReadCount= ");
Serial.println(ReadCount);
}
if ( ReadCount >= iSend && allowSend )
{
ReadCount = 0;
allowSend = false;
radio.powerUp();
delay(50);
sensor.T = tAVG.Get();
sensor.L = lAVG.Get();
sensor.V = vAVG.Get();
sensor.UpTime = millis()/1000;
network.write(header,&sensor,sizeof(sensor));
radio.powerDown();
}
sleep();
}
void sleep()
{
if (DEBUG_MODE) {Serial.println("----- SLEEP -----");Serial.flush();}
for (int i = 0; i < WaitCount; i++)
{
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
}
int readVcc()
{
int result;
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(75);
ADCSRA |= _BV(ADSC);
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
if (DEBUG_MODE) {Serial.print("result=");Serial.println(result);}
result = 1125300L / result;
return result;
}