anschrammh 2022-09-12 18:41:44 +02:00
commit 61c6383f0c
14 changed files with 154 additions and 34 deletions

4
.gitignore vendored
View File

@ -36,5 +36,5 @@
*.bin
credentials.h
!schematic/KiCad/ATMEGA328PU_lowPower_weather_station/*
src/app/*
!src/app/*.ino
src/tests/*
!src/tests/*.ino

112
README.md
View File

@ -1,8 +1,108 @@
# ATMEGA328PU_lowPower_weather_station
An ATMEGA328PU and NRF24L01+ based weather station operating on a single 18650 li-ion cell and a solar panel.
Sensors :
* Temperature
* Humidity
* Pressure
* Sunlight
## What is it ?
An ATMEGA328PU and NRF24L01+ based weather station operating on a single 18650 li-ion battery (or equivalent) and a solar panel.<br />
On [this page](/Pages/station.html) is displayed the data collected by this very unit !
**Check the LICENSE.md file at the root of this project for more information.**
![](http://82.64.196.164/images/git/weather_station_under.jpg)
## What are the functionalities ?
The station is equipped with the following sensors and functionalities :
* Temperature (BMP280 and HTU21)
* Humidity (HTU21)
* Compensated humidity (HTU21)
* Pressure (BMP280)
* Sunlight (LDR)
* Battery level indication (ATMEGA's 10 bit ADC)
## Power consumption :
* Around **60µA** during sleep.
* Around a **13mA** spike during data transmission and **4mA** during sensor data collection.
* The solar panel is enough to even charge the battery, it should thus never need to be replaced or recharged externally.
## Project folder architecture :
``` json
/
|_src This folder contains all the C/C++ file sources.
| \_app This folder contains the main app and it's dependencies.
| |_libs This folder contains all the required 3rd party libraries that should be put in "Arduino\libraries" folder in order for the app to compile.
| |_test This folder contains a test program which was used to test the dependencies.
|
|_schematic This folder contains all the files associated with the schematic
| \_KiCad This folder contains the KiCad files associated with the project.
| |_ATMEGA328PU_lowPower_weather_station.pdf Which is the most recent schematic exported as a pdf for quick viewing.
|
|_documentation This folder may one day contain the associated documentation if needed.
|
|_.gitignore
|_LICENSE.md
|_README.md The content of this page
```
## Getting started :
1. Clone this repository : git clone http://web-directories.tk/git/Th3maz1ng/ATMEGA328PU_lowPower_weather_station.git
2. Go to **"src\libs"** folder of this project and copy and paste its content in your "Arduino\libraries" folder.
3. Open the app.ino file with the Arduino IDE and select the "Arduino Pro or Pro Mini" board with processor : (Atmega 3.3V 8 Mhz).
4. Compile and Upload !
5. To receive the data sent by the station, you can check this other [project](/git/Th3maz1ng/ESP8266_dual_NRF24l01_gateway) which is the receiver end.
## Configuration options :
You may change some settings present in the ***definition.h*** file.
Set **SLEEP_4_SEC_INTERVAL** which corresponds to the time interval between each data transmission in 4 seconds increments. 1 minute by default corresponds to a value of 15.
Set **SERIAL_DEBUG_ENABLED** to **1** to get debug output on the serial console.
Set **SERIAL_BAUD_RATE** to the desired baudrate for debugging.
Set **ADC_QUANTUM** to adjust the quantum if your VREF is not the same as mine.<br />
To do so, measure which voltage does the VCC pin of your Arduino board output and divide it by 1024 (10 bit ADC resolution).
Set **VOLTAGE_DIV_COEFF** to something different if you changed the voltage divider resistor values.
Set **RADIO_CHANNEL** to the NRF's RF channel (between 0 and 124). **Do not forget to set the receiver station up on the same channel**
Set **RADIO_NODE_ADDRESS** to change it's 5 byte address if you feel like it. **Do not forget to set the receiver station up on the same address**
Set **RADIO_PA_LEVEL** to adjust the transmit power level if needed (higher the power, higher the current consumption)
Set **ENABLE_LNA** to true or false to enable or disable the Low Noise Amplifier on the NRF modules if it has one.
## The hardware :
Here is a list of the parts used to build the station with a link to where you can buy them :
* [Solar panel : 72x72](https://fr.aliexpress.com/item/4001240640418.html?spm=a2g0s.9042311.0.0.27426c3741mIVH)
* [NRF24L01](https://fr.aliexpress.com/item/32976054389.html?spm=a2g0o.cart.0.0.657d3c00t37c7e&mp=1)
* [TC4056 (1 cell lipo charge/discharge protection)](https://fr.aliexpress.com/item/4000522397541.html?spm=a2g0o.productlist.0.0.175b30dfajsyO5&algo_pvid=203adaed-55ba-4678-a3e4-3aafcad89952&algo_exp_id=203adaed-55ba-4678-a3e4-3aafcad89952-1)
* [BMP280 pressure sensor](https://fr.aliexpress.com/item/32228095913.html?spm=a2g0s.9042311.0.0.27426c3741mIVH)
* [SHT/HTU 21 humidity sensor](https://fr.aliexpress.com/item/32787282185.html?spm=a2g0s.9042311.0.0.27426c3741mIVH)
* [ATMEGA328PU board](https://fr.aliexpress.com/item/4000190780977.html?spm=a2g0o.store_pc_allProduct.8148356.4.66547f0dNb2qkV)
* [3.3V LDO for the power rail : RT9013-33PB](https://fr.aliexpress.com/item/4001097171645.html?spm=a2g0o.productlist.0.0.48aa7800HoFD4h&algo_pvid=454c2fa4-a1a9-4ec2-9398-00d598a20b67&algo_exp_id=454c2fa4-a1a9-4ec2-9398-00d598a20b67-0)
* [LDR type : 5528](https://fr.aliexpress.com/item/32623615207.html?spm=a2g0o.productlist.0.0.41a66ceaAE4l8B&algo_pvid=b7699cb3-9564-4a0e-bfb2-cf66f2917b04&algo_exp_id=b7699cb3-9564-4a0e-bfb2-cf66f2917b04-0)
* [Small junction box](https://www.amazon.com/LeMotech-Dustproof-Waterproof-Electrical-85mmx85mmx50mm/dp/B075X14RVH/ref=sr_1_2?dchild=1&keywords=junction+box+3.4+3.4+2&qid=1626903891&sr=8-2)
***If you have any questions, do not hesitate to contact me at : bugreport[at]laposte[dot]net***
## Finally here are some pictures of the PCB and device :
PCB top view :
![](http://82.64.196.164/images/git/weather_station_pcb_top.jpg)
PCB back view :
![](http://82.64.196.164/images/git/weather_station_pcb_back.jpg)
Device's internals :
![](http://82.64.196.164/images/git/weather_station_open.jpg)
Device's internals with the PCB removed :
![](http://82.64.196.164/images/git/weather_station_box.jpg)
Device form factor :
![](http://82.64.196.164/images/git/weather_station_top.jpg)
Device's LDR and solar panel :
![](http://82.64.196.164/images/git/weather_station_back_solar_panel.jpg)
Device's antenna and SHT/HTU 21 cover :
![](http://82.64.196.164/images/git/weather_station_front.jpg)

Binary file not shown.

View File

@ -1,6 +1,6 @@
update=22/05/2015 07:44:53
update=13/06/2021 10:07:06
version=1
last_client=kicad
last_client=eeschema
[general]
version=1
RootSch=
@ -31,3 +31,13 @@ NetIExt=net
version=1
LibDir=
[eeschema/libraries]
[schematic_editor]
version=1
PageLayoutDescrFile=
PlotDirectoryName=
SubpartIdSeparator=0
SubpartFirstId=65
NetFmtName=
SpiceAjustPassiveValues=0
LabSize=50
ERC_TestSimilarLabels=1

View File

@ -5,10 +5,10 @@ EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date ""
Rev ""
Comp ""
Title "ATMEGA328PU Low Power Weather Station"
Date "2021-06-13"
Rev "1.0"
Comp "www.web-directories.tk"
Comment1 ""
Comment2 ""
Comment3 ""

View File

@ -4,9 +4,9 @@ EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date ""
Rev ""
Title "ATMEGA328PU Low Power Weather Station"
Date "2021-06-13"
Rev "1.0"
Comp ""
Comment1 ""
Comment2 ""
@ -501,7 +501,7 @@ $EndComp
Text GLabel 2150 4800 0 50 Input ~ 0
~LDR_V_SENS_EN
Text GLabel 2150 4950 0 50 Input ~ 0
~BAT_V_SENS_EN
BAT_V_SENS_EN
Wire Wire Line
2150 4800 2600 4800
Wire Wire Line
@ -601,7 +601,7 @@ Wire Wire Line
Wire Wire Line
7900 4850 8100 4850
Text GLabel 7700 4850 0 50 Input ~ 0
~BAT_V_SENS_EN
BAT_V_SENS_EN
Wire Wire Line
6900 5950 6900 6050
Wire Wire Line

View File

@ -14,7 +14,7 @@ uint8_t WSPeripherals::init()
pinMode(_boardConfig.BATVSensEnable, OUTPUT);
digitalWrite(_boardConfig.BATVSensEnable, LOW);
//Unused pins are set as inputs with internal pullup inable to reduce power consumption during sleep
//Unused pins are set as inputs with internal pullup enabled to reduce power consumption during sleep
pinMode(0,INPUT_PULLUP);
//pinMode(1,INPUT_PULLUP); TX pin for serial
pinMode(6,INPUT_PULLUP);
@ -113,9 +113,9 @@ void WSPeripherals::_3V3PowerRail(State state)
const RF24 &WSPeripherals::getRadio(){return _NRF;}
void WSPeripherals::applyRadioConfig(uint8_t channel, uint8_t paLevel, rf24_datarate_e datarate)
void WSPeripherals::applyRadioConfig(uint8_t channel, uint8_t paLevel, bool enableLNA, rf24_datarate_e datarate)
{
_NRF.setChannel(channel);
_NRF.setPALevel(paLevel);
_NRF.setPALevel(paLevel, enableLNA);
_NRF.setDataRate(datarate);
}

View File

@ -44,7 +44,7 @@ class WSPeripherals
/*
* Before calling this method, externalPeripherals(ON) and initExternalPeripherals() must be called respectively
*/
void applyRadioConfig(uint8_t channel = RADIO_CHANNEL, uint8_t paLevel = RADIO_PA_LEVEL, rf24_datarate_e datarate = RADIO_DATARATE);
void applyRadioConfig(uint8_t channel = RADIO_CHANNEL, uint8_t paLevel = RADIO_PA_LEVEL, bool enableLNA = ENABLE_LNA, rf24_datarate_e datarate = RADIO_DATARATE);
const RF24 &getRadio();
protected:

View File

@ -1,3 +1,10 @@
/**
* Author : Anatole SCHRAMM-HENRY
* Created the : 30/05/2021
* This is the source file containing the main app.
* It defines all the logic which make the weather station work.
*/
#include "definition.h"
#include "BoardConfig.h"
#include "WSPeripherals.h"
@ -7,7 +14,7 @@ BoardConfig defaultBC;
WSPeripherals WSP(defaultBC);
uint8_t sleepSlots(0), rCode(0);
DataPacket payload;
WeatherStationDataPacket payload;
void setup()
{
@ -17,7 +24,7 @@ void setup()
#endif
rCode = WSP.init();
memset(&payload, 0, sizeof(payload));
memset(&payload, 0, sizeof payload);
#if SERIAL_DEBUG_ENABLED == 1
Serial.print("Payload size : ");Serial.println(sizeof payload);
debugStruct(&payload);
@ -57,10 +64,10 @@ void loop()
if(WSP.getRadio().isChipConnected())
{
WSP.applyRadioConfig();
//WSP.getRadio().setPayloadSize(sizeof payload); //Does not work
WSP.getRadio().setRetries(10,20);
WSP.getRadio().openWritingPipe((const uint8_t *)RADIO_NODE_ADDRESS);
//WSP.getRadio().setPayloadSize(sizeof payload);
bool result = WSP.getRadio().write(&payload, sizeof(payload));
bool result = WSP.getRadio().write(&payload, sizeof payload);
#if SERIAL_DEBUG_ENABLED == 1
if(result)
Serial.println("Payload sent !");
@ -87,7 +94,7 @@ void loop()
sleepSlots++;
}
void debugStruct(DataPacket *p)
void debugStruct(WeatherStationDataPacket *p)
{
Serial.println("##############DATA##############");
Serial.print("ID : ");

View File

@ -19,12 +19,14 @@
#define VOLTAGE_DIV_COEFF 1.3125 //(R1 + R2)/R2
//NRF Radio config part
#define RADIO_CHANNEL 108
#define RADIO_CHANNEL 108 //0-125
#define RADIO_NODE_ADDRESS "WEST1" //Weather Station 1
#define RADIO_PA_LEVEL RF24_PA_LOW
#define RADIO_PA_LEVEL RF24_PA_HIGH //RF24_PA_MIN,RF24_PA_LOW,RF24_PA_HIGH,RF24_PA_MAX
#define ENABLE_LNA false //true or false
#define RADIO_DATARATE RF24_250KBPS
//Sleep config part : in 4 second increments ie : 1 corresponds to 4s of sleep, and 15 correponds to 60 seconds of sleep.
//Sleep config part : in 4 second increments ie : 1 corresponds to 4s of sleep, and 15 correponds to 60 seconds of sleep.
//Max is 255 * 4s.
#define SLEEP_4_SEC_INTERVAL 15
//Pin config part
@ -56,6 +58,6 @@ typedef struct
float humidity;
float compensatedHumidity;
float htuTemp;
} DataPacket __attribute__((__packed__));
} __attribute__((__packed__)) WeatherStationDataPacket;
#endif //DEFINITION_H

View File

@ -1,10 +1,11 @@
/**
* Author : Anatole SCHRAMM-HENRY
* Created the : 29/05/2021
* This TEST program aims to verify all basic functions of the station like by displaying some values to a serial console :
* This TEST program aims to verify all the basic functions of the weather station by displaying all the sensors values to a serial console :
* - The battery level sensing
* - The light level with the LDR
* - The Temperature
* - The temperature of the BMP280
* - The temperature of the HTU21
* - The pressure
* - The humidity
*/