diff --git a/.gitignore b/.gitignore index 4a35222..6c23dc8 100644 --- a/.gitignore +++ b/.gitignore @@ -36,5 +36,5 @@ *.bin credentials.h !schematic/KiCad/ATMEGA328PU_lowPower_weather_station/* -src/app/* -!src/app/*.ino +src/tests/* +!src/tests/*.ino diff --git a/README.md b/README.md index 348879d..a0a61ff 100644 --- a/README.md +++ b/README.md @@ -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 \ No newline at end of file +## What is it ? + +An ATMEGA328PU and NRF24L01+ based weather station operating on a single 18650 li-ion battery (or equivalent) and a solar panel.
+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.
+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) diff --git a/schematic/ATMEGA328PU_lowPower_weather_station.pdf b/schematic/ATMEGA328PU_lowPower_weather_station.pdf new file mode 100644 index 0000000..4df349f Binary files /dev/null and b/schematic/ATMEGA328PU_lowPower_weather_station.pdf differ diff --git a/schematic/KiCad/ATMEGA328PU_lowPower_weather_station/ATMEGA328PU_lowPower_weather_station.pro b/schematic/KiCad/ATMEGA328PU_lowPower_weather_station/ATMEGA328PU_lowPower_weather_station.pro index 152769c..f9a71e5 100644 --- a/schematic/KiCad/ATMEGA328PU_lowPower_weather_station/ATMEGA328PU_lowPower_weather_station.pro +++ b/schematic/KiCad/ATMEGA328PU_lowPower_weather_station/ATMEGA328PU_lowPower_weather_station.pro @@ -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 diff --git a/schematic/KiCad/ATMEGA328PU_lowPower_weather_station/ATMEGA328PU_lowPower_weather_station.sch b/schematic/KiCad/ATMEGA328PU_lowPower_weather_station/ATMEGA328PU_lowPower_weather_station.sch index 9497e22..a0f197b 100644 --- a/schematic/KiCad/ATMEGA328PU_lowPower_weather_station/ATMEGA328PU_lowPower_weather_station.sch +++ b/schematic/KiCad/ATMEGA328PU_lowPower_weather_station/ATMEGA328PU_lowPower_weather_station.sch @@ -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 "" diff --git a/schematic/KiCad/ATMEGA328PU_lowPower_weather_station/ATMEGA328PU_lowPower_weather_station.sch-bak b/schematic/KiCad/ATMEGA328PU_lowPower_weather_station/ATMEGA328PU_lowPower_weather_station.sch-bak index f66cc07..c5c920f 100644 --- a/schematic/KiCad/ATMEGA328PU_lowPower_weather_station/ATMEGA328PU_lowPower_weather_station.sch-bak +++ b/schematic/KiCad/ATMEGA328PU_lowPower_weather_station/ATMEGA328PU_lowPower_weather_station.sch-bak @@ -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 diff --git a/src/tests/BoardConfig.cpp b/src/app/BoardConfig.cpp similarity index 100% rename from src/tests/BoardConfig.cpp rename to src/app/BoardConfig.cpp diff --git a/src/tests/BoardConfig.h b/src/app/BoardConfig.h similarity index 100% rename from src/tests/BoardConfig.h rename to src/app/BoardConfig.h diff --git a/src/tests/WSPeripherals.cpp b/src/app/WSPeripherals.cpp similarity index 94% rename from src/tests/WSPeripherals.cpp rename to src/app/WSPeripherals.cpp index 068ab2f..3fd0c1c 100644 --- a/src/tests/WSPeripherals.cpp +++ b/src/app/WSPeripherals.cpp @@ -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); } diff --git a/src/tests/WSPeripherals.h b/src/app/WSPeripherals.h similarity index 94% rename from src/tests/WSPeripherals.h rename to src/app/WSPeripherals.h index 212dd28..39cb8ee 100644 --- a/src/tests/WSPeripherals.h +++ b/src/app/WSPeripherals.h @@ -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: diff --git a/src/app/app.ino b/src/app/app.ino index 3242b83..dd56d52 100644 --- a/src/app/app.ino +++ b/src/app/app.ino @@ -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 : "); diff --git a/src/tests/definition.h b/src/app/definition.h similarity index 80% rename from src/tests/definition.h rename to src/app/definition.h index d84e336..3fa199d 100644 --- a/src/tests/definition.h +++ b/src/app/definition.h @@ -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 diff --git a/src/tests/packet_format.h b/src/app/packet_format.h similarity index 100% rename from src/tests/packet_format.h rename to src/app/packet_format.h diff --git a/src/tests/tests.ino b/src/tests/tests.ino index 8f5062d..355240c 100644 --- a/src/tests/tests.ino +++ b/src/tests/tests.ino @@ -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 */