From e2cf4a029e35b6dc24e7006520427d9acd46529a Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 13 Jun 2021 10:10:59 +0200 Subject: [PATCH 01/28] Added the PDF of the schematic --- .../ATMEGA328PU_lowPower_weather_station.pdf | Bin 0 -> 46962 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 schematic/ATMEGA328PU_lowPower_weather_station.pdf diff --git a/schematic/ATMEGA328PU_lowPower_weather_station.pdf b/schematic/ATMEGA328PU_lowPower_weather_station.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6a7c3ea910b3a5e053227e434510487cb9d42e22 GIT binary patch literal 46962 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 Ku*j;)5&nPJkuhHY literal 0 HcmV?d00001 From f64c0980b8c1ae356c61187c039c4682ebdedc43 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 13 Jun 2021 10:13:17 +0200 Subject: [PATCH 02/28] Updated the schematic's title block --- .../ATMEGA328PU_lowPower_weather_station.pro | 14 ++++++++++++-- .../ATMEGA328PU_lowPower_weather_station.sch | 6 +++--- .../ATMEGA328PU_lowPower_weather_station.sch-bak | 4 ++-- 3 files changed, 17 insertions(+), 7 deletions(-) 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 83ef470..c5c920f 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 @@ -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 "" 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..83ef470 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 @@ -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 From 51b1608d90e33151f124e55acfeb562e6bdf712a Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 13 Jun 2021 18:49:48 +0200 Subject: [PATCH 03/28] Updated the test program description comment --- src/tests/tests.ino | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 */ From 23cb95fd4181ccf278bc363e25a5d37de276ca9e Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 13 Jun 2021 18:50:30 +0200 Subject: [PATCH 04/28] Updated the schematic --- .../ATMEGA328PU_lowPower_weather_station.pdf | Bin 46962 -> 47685 bytes .../ATMEGA328PU_lowPower_weather_station.sch | 2 +- ...MEGA328PU_lowPower_weather_station.sch-bak | 6 +++--- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/schematic/ATMEGA328PU_lowPower_weather_station.pdf b/schematic/ATMEGA328PU_lowPower_weather_station.pdf index 6a7c3ea910b3a5e053227e434510487cb9d42e22..4df349f49c16f9b9150a3a150ca539a554cc1055 100644 GIT binary patch delta 43085 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

)#4^+rhb`tEcPR^|X`KN8**PqRB%9eoqnr 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 Date: Mon, 14 Jun 2021 14:34:56 +0200 Subject: [PATCH 05/28] Updated the readme. --- README.md | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 348879d..72af75e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,33 @@ # 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 : + +![](http://82.64.196.164/images/git/weather_station_under.jpg) + +## What are the functionalities ? + +The station is equipped with the following sensors and as these functionalities : + +* Temperature (BMP280 and HTU21) +* Humidity (HTU21) +* Pressure (BMP280) +* Sunlight (LDR) +* Battery level indication (ATMEGA's ADC) + +## The hardware : + +**The main board** + +Top view : + +![](http://82.64.196.164/images/git/weather_station_pcb_back.jpg) + +Back view : + +![](http://82.64.196.164/images/git/weather_station_pcb_top.jpg) + + + + From 7746de07fe2d6f795fce664ad23f7d4b1d186c43 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Wed, 16 Jun 2021 21:36:53 +0200 Subject: [PATCH 06/28] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'README.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 72af75e..c81d27b 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ An ATMEGA328PU and NRF24L01+ based weather station operating on a single 18650 l ## What are the functionalities ? -The station is equipped with the following sensors and as these functionalities : +The station is equipped with the following sensors and has these functionalities : * Temperature (BMP280 and HTU21) * Humidity (HTU21) From 9362002b33e165d4ade3b4b8f3c20f2e63cb57b2 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 20 Jun 2021 21:09:00 +0200 Subject: [PATCH 07/28] Changed transmit power from PA_MIN to PA_LOW, minor changes in the app code and added some comments --- src/app/app.ino | 6 +++--- src/tests/definition.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/app.ino b/src/app/app.ino index 3242b83..21e03be 100644 --- a/src/app/app.ino +++ b/src/app/app.ino @@ -17,7 +17,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 +57,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 !"); diff --git a/src/tests/definition.h b/src/tests/definition.h index d84e336..c2e5f54 100644 --- a/src/tests/definition.h +++ b/src/tests/definition.h @@ -21,7 +21,7 @@ //NRF Radio config part #define RADIO_CHANNEL 108 #define RADIO_NODE_ADDRESS "WEST1" //Weather Station 1 -#define RADIO_PA_LEVEL RF24_PA_LOW +#define RADIO_PA_LEVEL RF24_PA_LOW //RF24_PA_MIN,RF24_PA_LOW,RF24_PA_HIGH,RF24_PA_MAX #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. From 8b274aba3049891ab99e39e532b6a75f4c3609a3 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sat, 17 Jul 2021 12:27:31 +0200 Subject: [PATCH 08/28] Updated the readme --- README.md | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c81d27b..12813fb 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,9 @@ ## What is it ? -An ATMEGA328PU and NRF24L01+ based weather station operating on a single 18650 li-ion battery (or equivalent) and a solar panel : +An ATMEGA328PU and NRF24L01+ based weather station operating on a single 18650 li-ion battery (or equivalent) and a solar panel. + +**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) @@ -14,12 +16,39 @@ The station is equipped with the following sensors and has these functionalities * Humidity (HTU21) * Pressure (BMP280) * Sunlight (LDR) -* Battery level indication (ATMEGA's ADC) +* Battery level indication (ATMEGA's 10 bit ADC) + +## 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 +| \_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 +``` ## The hardware : +Here is a list of the parts used to build the station with a link to the page of each products : +* [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) -**The main board** - +### This is what my board looks like : Top view : ![](http://82.64.196.164/images/git/weather_station_pcb_back.jpg) From 05ce57f1f46a3771b240e8088db76fabfb259392 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sat, 17 Jul 2021 12:59:36 +0200 Subject: [PATCH 09/28] Updated the readme --- README.md | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 12813fb..adde1a8 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,6 @@ An ATMEGA328PU and NRF24L01+ based weather station operating on a single 18650 l ![](http://82.64.196.164/images/git/weather_station_under.jpg) ## What are the functionalities ? - The station is equipped with the following sensors and has these functionalities : * Temperature (BMP280 and HTU21) @@ -18,7 +17,12 @@ The station is equipped with the following sensors and has these functionalities * Sunlight (LDR) * Battery level indication (ATMEGA's 10 bit ADC) -## Project folder architecture +## 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 charge the battery it should thus never need to be replaced or recharged. + +## Project folder architecture : ``` json / |_src This folder contains all the C/C++ file sources. @@ -36,6 +40,33 @@ The station is equipped with the following sensors and has these functionalities |_LICENSE.md |_README.md The content of this page ``` +## Getting started : +1. Clone this repository : git clone http://web-directories.cf/git/Th3maz1ng/ATMEGA328PU_lowPower_weather_station.git +2. Go to src/libs and copy and paste the content in your "Arduino\libraries" +3. Select the "Arduino Pro or Pro Mini" board with processor : (Atmega 3.3V 8 Mhz) +4. Compile and Upload ! +5. To receive the data emitted by the station, you can check this other [project](http://www.web-directories.cf/git/Th3maz1ng/ESP8266_dual_NRF24l01_gateway). + +## 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 accordingly** + +Set **RADIO_NODE_ADDRESS** to change it's 5 byte address if you feel like it. + +Set **RADIO_PA_LEVEL** to adjust the transmit power level if needed (higher power, higher current consumption) ## The hardware : Here is a list of the parts used to build the station with a link to the page of each products : From 8f775b7bf886f99dac050bf6b547e550993598f3 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sat, 17 Jul 2021 15:19:21 +0200 Subject: [PATCH 10/28] Updated the readme --- README.md | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index adde1a8..7f12c8b 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ The station is equipped with the following sensors and has these functionalities * Temperature (BMP280 and HTU21) * Humidity (HTU21) +* Compensated humidity (HTU21) * Pressure (BMP280) * Sunlight (LDR) * Battery level indication (ATMEGA's 10 bit ADC) @@ -42,10 +43,10 @@ The station is equipped with the following sensors and has these functionalities ``` ## Getting started : 1. Clone this repository : git clone http://web-directories.cf/git/Th3maz1ng/ATMEGA328PU_lowPower_weather_station.git -2. Go to src/libs and copy and paste the content in your "Arduino\libraries" -3. Select the "Arduino Pro or Pro Mini" board with processor : (Atmega 3.3V 8 Mhz) +2. Go to src/libs folder and copy and paste its content in your "Arduino\libraries" folder. +3. Open the app.ino file 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 emitted by the station, you can check this other [project](http://www.web-directories.cf/git/Th3maz1ng/ESP8266_dual_NRF24l01_gateway). +5. To receive the data sent by the station, you can check this other [project](http://www.web-directories.cf/git/Th3maz1ng/ESP8266_dual_NRF24l01_gateway) which is the receiver end. ## Configuration options : You may change some settings present in the ***definition.h*** file. @@ -62,7 +63,7 @@ To do so, measure which voltage does the VCC pin of your Arduino board output an 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 accordingly** +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. @@ -79,15 +80,26 @@ Here is a list of the parts used to build the station with a link to the page of * [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) -### This is what my board looks like : -Top view : - -![](http://82.64.196.164/images/git/weather_station_pcb_back.jpg) - -Back view : +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) From f8de11b8474c883bf54b963ecd48cab55c71989e Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sat, 17 Jul 2021 15:26:18 +0200 Subject: [PATCH 11/28] Updated the readme --- README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7f12c8b..aee6b1d 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ The station is equipped with the following sensors and has these functionalities ## 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 charge the battery it should thus never need to be replaced or recharged. +* The solar panel is enough to even charge the battery it should thus never need to be replaced or recharged. ## Project folder architecture : ``` json @@ -43,8 +43,8 @@ The station is equipped with the following sensors and has these functionalities ``` ## Getting started : 1. Clone this repository : git clone http://web-directories.cf/git/Th3maz1ng/ATMEGA328PU_lowPower_weather_station.git -2. Go to src/libs folder and copy and paste its content in your "Arduino\libraries" folder. -3. Open the app.ino file and select the "Arduino Pro or Pro Mini" board with processor : (Atmega 3.3V 8 Mhz). +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](http://www.web-directories.cf/git/Th3maz1ng/ESP8266_dual_NRF24l01_gateway) which is the receiver end. @@ -57,8 +57,7 @@ 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. - +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. @@ -70,7 +69,7 @@ Set **RADIO_NODE_ADDRESS** to change it's 5 byte address if you feel like it. Set **RADIO_PA_LEVEL** to adjust the transmit power level if needed (higher power, higher current consumption) ## The hardware : -Here is a list of the parts used to build the station with a link to the page of each products : +Here is a list of the parts used to build the station with a link to where you can buy it : * [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) From 2d86c6db278daabd3717b6813115d19b0ccef290 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sat, 17 Jul 2021 15:29:03 +0200 Subject: [PATCH 12/28] Updated the readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index aee6b1d..c3757e0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@ ## What is it ? -An ATMEGA328PU and NRF24L01+ based weather station operating on a single 18650 li-ion battery (or equivalent) and a solar panel. +An ATMEGA328PU and NRF24L01+ based weather station operating on a single 18650 li-ion battery (or equivalent) and a solar panel.
+On [this page](http://web-directories.tk/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.** From 4564006c94bf1a9f4f4b3903ab7c94e079fddd4d Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sat, 17 Jul 2021 22:59:19 +0200 Subject: [PATCH 13/28] Updated the .gitignore file --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From ba457838c38d8114c54df2bce03434114f6d8f09 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sat, 17 Jul 2021 23:00:17 +0200 Subject: [PATCH 14/28] Included the dependency files in the app folder --- src/app/BoardConfig.cpp | 18 ++++++ src/app/BoardConfig.h | 46 +++++++++++++++ src/app/WSPeripherals.cpp | 121 ++++++++++++++++++++++++++++++++++++++ src/app/WSPeripherals.h | 60 +++++++++++++++++++ src/app/definition.h | 61 +++++++++++++++++++ src/app/packet_format.h | 6 ++ 6 files changed, 312 insertions(+) create mode 100644 src/app/BoardConfig.cpp create mode 100644 src/app/BoardConfig.h create mode 100644 src/app/WSPeripherals.cpp create mode 100644 src/app/WSPeripherals.h create mode 100644 src/app/definition.h create mode 100644 src/app/packet_format.h diff --git a/src/app/BoardConfig.cpp b/src/app/BoardConfig.cpp new file mode 100644 index 0000000..2c137d8 --- /dev/null +++ b/src/app/BoardConfig.cpp @@ -0,0 +1,18 @@ +#include "BoardConfig.h" + +BoardConfig::BoardConfig( const Pin LDOEnable, + const Pin NRFCe, + const Pin NRFCs, + const Pin I2CSDA, + const Pin I2CSCL, + const Pin LDRVSensEnable, + const Pin BATVSensEnable, + const Pin MOSI, + const Pin MISO, + const Pin SCK, + const Pin BATAnalogVSens, + const Pin LDRAnalogVSens +):LDOEnable(LDOEnable), NRFCe(NRFCe), NRFCs(NRFCs), I2CSDA(I2CSDA), I2CSCL(I2CSCL), LDRVSensEnable(LDRVSensEnable), BATVSensEnable(BATVSensEnable), MOSI(MOSI), MISO(MISO), SCK(SCK), BATAnalogVSens(BATAnalogVSens), LDRAnalogVSens(LDRAnalogVSens) +{ + +} diff --git a/src/app/BoardConfig.h b/src/app/BoardConfig.h new file mode 100644 index 0000000..3cebdd0 --- /dev/null +++ b/src/app/BoardConfig.h @@ -0,0 +1,46 @@ +/** + * Author : Anatole SCHRAMM-HENRY + * Created the : 30/05/2021 + * This class encapsulates the various configuration values for the board like the Pin Mapping for instance. + */ +#ifndef BOARDCONFIG_H +#define BOARDCONFIG_H + +#include "definition.h" + +class BoardConfig +{ + public: + BoardConfig( + const Pin LDOEnable = D2_LDO_EN, + const Pin NRFCe = D3_NRF_CE, + const Pin NRFCs = D10_NRF_CS, + const Pin I2CSDA = A4_SDA, + const Pin I2CSCL = A5_SCL, + const Pin LDRVSensEnable = D4_LDR_V_SENS_EN, + const Pin BATVSensEnable = D5_BAT_V_SENS_EN, + const Pin MOSI = D11_MOSI, + const Pin MISO = D12_MISO, + const Pin SCK = D13_SCK, + const Pin BATAnalogVSens = A0_BAT_V_SENS, + const Pin LDRAnalogVSens = A1_LDR_V_SENS + ); + + const Pin LDOEnable; + const Pin NRFCe; + const Pin NRFCs; + const Pin I2CSDA; + const Pin I2CSCL; + const Pin LDRVSensEnable; + const Pin BATVSensEnable; + const Pin MOSI; + const Pin MISO; + const Pin SCK; + const Pin BATAnalogVSens; + const Pin LDRAnalogVSens; + + protected: + private: +}; + +#endif //BOARDCONFIG_H diff --git a/src/app/WSPeripherals.cpp b/src/app/WSPeripherals.cpp new file mode 100644 index 0000000..068ab2f --- /dev/null +++ b/src/app/WSPeripherals.cpp @@ -0,0 +1,121 @@ +#include "WSPeripherals.h" + +WSPeripherals::WSPeripherals(const BoardConfig &boardConfig): _boardConfig(boardConfig), _HTU21(HTU21D_RES_RH12_TEMP14), _NRF(boardConfig.NRFCe, boardConfig.NRFCs) +{} + +uint8_t WSPeripherals::init() +{ + uint8_t toReturn(0); + //We initialize used pins : + pinMode(_boardConfig.LDOEnable, OUTPUT); + _3V3PowerRail(OFF); + pinMode(_boardConfig.LDRVSensEnable, OUTPUT); + digitalWrite(_boardConfig.LDRVSensEnable, HIGH); //High means that it is disabled and low is active /!\/ + pinMode(_boardConfig.BATVSensEnable, OUTPUT); + digitalWrite(_boardConfig.BATVSensEnable, LOW); + + //Unused pins are set as inputs with internal pullup inable to reduce power consumption during sleep + pinMode(0,INPUT_PULLUP); + //pinMode(1,INPUT_PULLUP); TX pin for serial + pinMode(6,INPUT_PULLUP); + pinMode(7,INPUT_PULLUP); + pinMode(8,INPUT_PULLUP); + pinMode(9,INPUT_PULLUP); + pinMode(10,INPUT_PULLUP); + pinMode(11,INPUT_PULLUP); + pinMode(12,INPUT_PULLUP); + pinMode(A2,INPUT_PULLUP); + pinMode(A3,INPUT_PULLUP); + pinMode(A6,INPUT_PULLUP); + pinMode(A7,INPUT_PULLUP); + + //We check that every external devices are responding + _3V3PowerRail(ON); + toReturn |= _BMP280.begin(0x76); + toReturn |= _HTU21.begin() << 1; + toReturn |= _NRF.begin() << 2; + _3V3PowerRail(OFF); + return toReturn; +} + +uint8_t WSPeripherals::initExternalPeripherals() +{ + uint8_t toReturn(0); + + toReturn |= _BMP280.begin(0x76); + toReturn |= _HTU21.begin() << 1; + toReturn |= _NRF.begin() << 2; + + //We disable the I2C internal pullups : + digitalWrite(SDA, LOW); + digitalWrite(SCL, LOW); + + return toReturn; +} + +float WSPeripherals::batteryVoltage() +{ + //We close the voltage divider bridge and we do the measurement + digitalWrite(_boardConfig.BATVSensEnable, HIGH); + int rawBatteryValue = analogRead(_boardConfig.BATAnalogVSens); + digitalWrite(_boardConfig.BATVSensEnable, LOW); + + return float(rawBatteryValue) * ADC_QUANTUM * VOLTAGE_DIV_COEFF; +} + +int WSPeripherals::sunlightMeasurement() +{ + //We enable the voltage divider bridge and we do the measurement + digitalWrite(_boardConfig.LDRVSensEnable, LOW); + int rawSunlightMeasurement = analogRead(_boardConfig.LDRAnalogVSens); + digitalWrite(_boardConfig.LDRVSensEnable, HIGH); + + return rawSunlightMeasurement; +} + +void WSPeripherals::temperatureAndATMPressureFromBMP280(float *temperature, float *ATMPressure) +{ + if(!temperature && !ATMPressure)return; + + _BMP280.setSampling( Adafruit_BMP280::MODE_FORCED, + Adafruit_BMP280::SAMPLING_X16, + Adafruit_BMP280::SAMPLING_X16, + Adafruit_BMP280::FILTER_X16, + Adafruit_BMP280::STANDBY_MS_4000); + if(temperature) + *temperature = _BMP280.readTemperature(); + + if(ATMPressure) + *ATMPressure = _BMP280.readPressure(); +} + +float WSPeripherals::temperatureFromHTU21() +{ + return _HTU21.readTemperature(); +} + +float WSPeripherals::humidity() +{ + return _HTU21.readHumidity(); +} + +float WSPeripherals::compensatedHumidity() +{ + return _HTU21.readCompensatedHumidity(); +} + +void WSPeripherals::_3V3PowerRail(State state) +{ + digitalWrite(_boardConfig.LDOEnable, state); + if(state) //We let some time for the voltage to stabilize on the rail. + delay(10); +} + +const RF24 &WSPeripherals::getRadio(){return _NRF;} + +void WSPeripherals::applyRadioConfig(uint8_t channel, uint8_t paLevel, rf24_datarate_e datarate) +{ + _NRF.setChannel(channel); + _NRF.setPALevel(paLevel); + _NRF.setDataRate(datarate); +} diff --git a/src/app/WSPeripherals.h b/src/app/WSPeripherals.h new file mode 100644 index 0000000..212dd28 --- /dev/null +++ b/src/app/WSPeripherals.h @@ -0,0 +1,60 @@ +/** + * Author : Anatole SCHRAMM-HENRY + * Created the : 30/05/2021 + * This classe exposes all the methods necessary to init the WSPeripherals (Weather Station Peripherals) and + * to retrieve various data and measurements like battery voltage, Temperatures etc... + */ +#ifndef WSPERIPHERALS_H +#define WSPERIPHERALS_H + +#include +#include +#include +#include + +#include "BoardConfig.h" + +class WSPeripherals +{ + public: + enum State {OFF, ON}; + + WSPeripherals(const BoardConfig &boardConfig); + /* + * Returns 7 if all the external devices are working properly, or an other value if it is not the case. + */ + uint8_t init(); + /* + * After calling this methode , you need to execute initExternalPeripherals() to init the peripherals. + */ + void externalPeripherals(State state){_3V3PowerRail(state);} + + /* + * Used to init devices after each LDO powerup, external devices need to be turned one externalPeripherals(ON) before calling this function. + */ + uint8_t initExternalPeripherals(); + + float batteryVoltage(); + int sunlightMeasurement(); + void temperatureAndATMPressureFromBMP280(float *temperature = NULL, float *ATMPressure = NULL); + float temperatureFromHTU21(); + float humidity(); + float compensatedHumidity(); + + /* + * 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); + const RF24 &getRadio(); + + protected: + private: + void _3V3PowerRail(State state); + const BoardConfig &_boardConfig; + const Adafruit_BMP280 _BMP280; + const HTU21D _HTU21; + const RF24 _NRF; + +}; + +#endif //WSPERIPHERALS_H diff --git a/src/app/definition.h b/src/app/definition.h new file mode 100644 index 0000000..c2e5f54 --- /dev/null +++ b/src/app/definition.h @@ -0,0 +1,61 @@ +/** + * Author : Anatole SCHRAMM-HENRY + * Created the : 29/05/2021 + * This file contains all the config used by the other classes and sources files. + */ +#ifndef DEFINITION_H +#define DEFINITION_H + +#include +#include +#include "packet_format.h" + +//Serial debug config part +#define SERIAL_DEBUG_ENABLED 0 +#define SERIAL_BAUD_RATE 115200 + +//Battery config part +#define ADC_QUANTUM 0.00323632812 //ADC_VREF / ADC_RESOLUTION -> 3.314 and 10 bits (1024) in my case +#define VOLTAGE_DIV_COEFF 1.3125 //(R1 + R2)/R2 + +//NRF Radio config part +#define RADIO_CHANNEL 108 +#define RADIO_NODE_ADDRESS "WEST1" //Weather Station 1 +#define RADIO_PA_LEVEL RF24_PA_LOW //RF24_PA_MIN,RF24_PA_LOW,RF24_PA_HIGH,RF24_PA_MAX +#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. +#define SLEEP_4_SEC_INTERVAL 15 + +//Pin config part +typedef enum +{ + D2_LDO_EN = 2, + D3_NRF_CE = 3, + A4_SDA = A4, + A5_SCL = A5, + D4_LDR_V_SENS_EN = 4, + D5_BAT_V_SENS_EN = 5, + D10_NRF_CS = 10, + D11_MOSI = 11, + D12_MISO = 12, + D13_SCK = 13, + A0_BAT_V_SENS = A0, + A1_LDR_V_SENS = A1, +} Pin; + +//Payload structure +typedef struct +{ + uint16_t id; + HEADER_e header : 6; + unsigned int ldr : 10; + float battery; + float bmpTemp; + float bmpPress; + float humidity; + float compensatedHumidity; + float htuTemp; +} DataPacket __attribute__((__packed__)); + +#endif //DEFINITION_H diff --git a/src/app/packet_format.h b/src/app/packet_format.h new file mode 100644 index 0000000..5b35254 --- /dev/null +++ b/src/app/packet_format.h @@ -0,0 +1,6 @@ +#ifndef PACKET_FORMAT_H +#define PACKET_FORMAT_H + +enum HEADER_e {WEATHER_STATION = 0}; + +#endif //PACKET_FORMAT_H From d2d1e6b4a4037e8d7b5e62eac642dbb6655a0fbc Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sat, 17 Jul 2021 23:02:13 +0200 Subject: [PATCH 15/28] Removed the dependency files from the test folder --- src/tests/BoardConfig.cpp | 18 ------ src/tests/BoardConfig.h | 46 -------------- src/tests/WSPeripherals.cpp | 121 ------------------------------------ src/tests/WSPeripherals.h | 60 ------------------ src/tests/definition.h | 61 ------------------ src/tests/packet_format.h | 6 -- 6 files changed, 312 deletions(-) delete mode 100644 src/tests/BoardConfig.cpp delete mode 100644 src/tests/BoardConfig.h delete mode 100644 src/tests/WSPeripherals.cpp delete mode 100644 src/tests/WSPeripherals.h delete mode 100644 src/tests/definition.h delete mode 100644 src/tests/packet_format.h diff --git a/src/tests/BoardConfig.cpp b/src/tests/BoardConfig.cpp deleted file mode 100644 index 2c137d8..0000000 --- a/src/tests/BoardConfig.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "BoardConfig.h" - -BoardConfig::BoardConfig( const Pin LDOEnable, - const Pin NRFCe, - const Pin NRFCs, - const Pin I2CSDA, - const Pin I2CSCL, - const Pin LDRVSensEnable, - const Pin BATVSensEnable, - const Pin MOSI, - const Pin MISO, - const Pin SCK, - const Pin BATAnalogVSens, - const Pin LDRAnalogVSens -):LDOEnable(LDOEnable), NRFCe(NRFCe), NRFCs(NRFCs), I2CSDA(I2CSDA), I2CSCL(I2CSCL), LDRVSensEnable(LDRVSensEnable), BATVSensEnable(BATVSensEnable), MOSI(MOSI), MISO(MISO), SCK(SCK), BATAnalogVSens(BATAnalogVSens), LDRAnalogVSens(LDRAnalogVSens) -{ - -} diff --git a/src/tests/BoardConfig.h b/src/tests/BoardConfig.h deleted file mode 100644 index 3cebdd0..0000000 --- a/src/tests/BoardConfig.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Author : Anatole SCHRAMM-HENRY - * Created the : 30/05/2021 - * This class encapsulates the various configuration values for the board like the Pin Mapping for instance. - */ -#ifndef BOARDCONFIG_H -#define BOARDCONFIG_H - -#include "definition.h" - -class BoardConfig -{ - public: - BoardConfig( - const Pin LDOEnable = D2_LDO_EN, - const Pin NRFCe = D3_NRF_CE, - const Pin NRFCs = D10_NRF_CS, - const Pin I2CSDA = A4_SDA, - const Pin I2CSCL = A5_SCL, - const Pin LDRVSensEnable = D4_LDR_V_SENS_EN, - const Pin BATVSensEnable = D5_BAT_V_SENS_EN, - const Pin MOSI = D11_MOSI, - const Pin MISO = D12_MISO, - const Pin SCK = D13_SCK, - const Pin BATAnalogVSens = A0_BAT_V_SENS, - const Pin LDRAnalogVSens = A1_LDR_V_SENS - ); - - const Pin LDOEnable; - const Pin NRFCe; - const Pin NRFCs; - const Pin I2CSDA; - const Pin I2CSCL; - const Pin LDRVSensEnable; - const Pin BATVSensEnable; - const Pin MOSI; - const Pin MISO; - const Pin SCK; - const Pin BATAnalogVSens; - const Pin LDRAnalogVSens; - - protected: - private: -}; - -#endif //BOARDCONFIG_H diff --git a/src/tests/WSPeripherals.cpp b/src/tests/WSPeripherals.cpp deleted file mode 100644 index 068ab2f..0000000 --- a/src/tests/WSPeripherals.cpp +++ /dev/null @@ -1,121 +0,0 @@ -#include "WSPeripherals.h" - -WSPeripherals::WSPeripherals(const BoardConfig &boardConfig): _boardConfig(boardConfig), _HTU21(HTU21D_RES_RH12_TEMP14), _NRF(boardConfig.NRFCe, boardConfig.NRFCs) -{} - -uint8_t WSPeripherals::init() -{ - uint8_t toReturn(0); - //We initialize used pins : - pinMode(_boardConfig.LDOEnable, OUTPUT); - _3V3PowerRail(OFF); - pinMode(_boardConfig.LDRVSensEnable, OUTPUT); - digitalWrite(_boardConfig.LDRVSensEnable, HIGH); //High means that it is disabled and low is active /!\/ - pinMode(_boardConfig.BATVSensEnable, OUTPUT); - digitalWrite(_boardConfig.BATVSensEnable, LOW); - - //Unused pins are set as inputs with internal pullup inable to reduce power consumption during sleep - pinMode(0,INPUT_PULLUP); - //pinMode(1,INPUT_PULLUP); TX pin for serial - pinMode(6,INPUT_PULLUP); - pinMode(7,INPUT_PULLUP); - pinMode(8,INPUT_PULLUP); - pinMode(9,INPUT_PULLUP); - pinMode(10,INPUT_PULLUP); - pinMode(11,INPUT_PULLUP); - pinMode(12,INPUT_PULLUP); - pinMode(A2,INPUT_PULLUP); - pinMode(A3,INPUT_PULLUP); - pinMode(A6,INPUT_PULLUP); - pinMode(A7,INPUT_PULLUP); - - //We check that every external devices are responding - _3V3PowerRail(ON); - toReturn |= _BMP280.begin(0x76); - toReturn |= _HTU21.begin() << 1; - toReturn |= _NRF.begin() << 2; - _3V3PowerRail(OFF); - return toReturn; -} - -uint8_t WSPeripherals::initExternalPeripherals() -{ - uint8_t toReturn(0); - - toReturn |= _BMP280.begin(0x76); - toReturn |= _HTU21.begin() << 1; - toReturn |= _NRF.begin() << 2; - - //We disable the I2C internal pullups : - digitalWrite(SDA, LOW); - digitalWrite(SCL, LOW); - - return toReturn; -} - -float WSPeripherals::batteryVoltage() -{ - //We close the voltage divider bridge and we do the measurement - digitalWrite(_boardConfig.BATVSensEnable, HIGH); - int rawBatteryValue = analogRead(_boardConfig.BATAnalogVSens); - digitalWrite(_boardConfig.BATVSensEnable, LOW); - - return float(rawBatteryValue) * ADC_QUANTUM * VOLTAGE_DIV_COEFF; -} - -int WSPeripherals::sunlightMeasurement() -{ - //We enable the voltage divider bridge and we do the measurement - digitalWrite(_boardConfig.LDRVSensEnable, LOW); - int rawSunlightMeasurement = analogRead(_boardConfig.LDRAnalogVSens); - digitalWrite(_boardConfig.LDRVSensEnable, HIGH); - - return rawSunlightMeasurement; -} - -void WSPeripherals::temperatureAndATMPressureFromBMP280(float *temperature, float *ATMPressure) -{ - if(!temperature && !ATMPressure)return; - - _BMP280.setSampling( Adafruit_BMP280::MODE_FORCED, - Adafruit_BMP280::SAMPLING_X16, - Adafruit_BMP280::SAMPLING_X16, - Adafruit_BMP280::FILTER_X16, - Adafruit_BMP280::STANDBY_MS_4000); - if(temperature) - *temperature = _BMP280.readTemperature(); - - if(ATMPressure) - *ATMPressure = _BMP280.readPressure(); -} - -float WSPeripherals::temperatureFromHTU21() -{ - return _HTU21.readTemperature(); -} - -float WSPeripherals::humidity() -{ - return _HTU21.readHumidity(); -} - -float WSPeripherals::compensatedHumidity() -{ - return _HTU21.readCompensatedHumidity(); -} - -void WSPeripherals::_3V3PowerRail(State state) -{ - digitalWrite(_boardConfig.LDOEnable, state); - if(state) //We let some time for the voltage to stabilize on the rail. - delay(10); -} - -const RF24 &WSPeripherals::getRadio(){return _NRF;} - -void WSPeripherals::applyRadioConfig(uint8_t channel, uint8_t paLevel, rf24_datarate_e datarate) -{ - _NRF.setChannel(channel); - _NRF.setPALevel(paLevel); - _NRF.setDataRate(datarate); -} diff --git a/src/tests/WSPeripherals.h b/src/tests/WSPeripherals.h deleted file mode 100644 index 212dd28..0000000 --- a/src/tests/WSPeripherals.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Author : Anatole SCHRAMM-HENRY - * Created the : 30/05/2021 - * This classe exposes all the methods necessary to init the WSPeripherals (Weather Station Peripherals) and - * to retrieve various data and measurements like battery voltage, Temperatures etc... - */ -#ifndef WSPERIPHERALS_H -#define WSPERIPHERALS_H - -#include -#include -#include -#include - -#include "BoardConfig.h" - -class WSPeripherals -{ - public: - enum State {OFF, ON}; - - WSPeripherals(const BoardConfig &boardConfig); - /* - * Returns 7 if all the external devices are working properly, or an other value if it is not the case. - */ - uint8_t init(); - /* - * After calling this methode , you need to execute initExternalPeripherals() to init the peripherals. - */ - void externalPeripherals(State state){_3V3PowerRail(state);} - - /* - * Used to init devices after each LDO powerup, external devices need to be turned one externalPeripherals(ON) before calling this function. - */ - uint8_t initExternalPeripherals(); - - float batteryVoltage(); - int sunlightMeasurement(); - void temperatureAndATMPressureFromBMP280(float *temperature = NULL, float *ATMPressure = NULL); - float temperatureFromHTU21(); - float humidity(); - float compensatedHumidity(); - - /* - * 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); - const RF24 &getRadio(); - - protected: - private: - void _3V3PowerRail(State state); - const BoardConfig &_boardConfig; - const Adafruit_BMP280 _BMP280; - const HTU21D _HTU21; - const RF24 _NRF; - -}; - -#endif //WSPERIPHERALS_H diff --git a/src/tests/definition.h b/src/tests/definition.h deleted file mode 100644 index c2e5f54..0000000 --- a/src/tests/definition.h +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Author : Anatole SCHRAMM-HENRY - * Created the : 29/05/2021 - * This file contains all the config used by the other classes and sources files. - */ -#ifndef DEFINITION_H -#define DEFINITION_H - -#include -#include -#include "packet_format.h" - -//Serial debug config part -#define SERIAL_DEBUG_ENABLED 0 -#define SERIAL_BAUD_RATE 115200 - -//Battery config part -#define ADC_QUANTUM 0.00323632812 //ADC_VREF / ADC_RESOLUTION -> 3.314 and 10 bits (1024) in my case -#define VOLTAGE_DIV_COEFF 1.3125 //(R1 + R2)/R2 - -//NRF Radio config part -#define RADIO_CHANNEL 108 -#define RADIO_NODE_ADDRESS "WEST1" //Weather Station 1 -#define RADIO_PA_LEVEL RF24_PA_LOW //RF24_PA_MIN,RF24_PA_LOW,RF24_PA_HIGH,RF24_PA_MAX -#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. -#define SLEEP_4_SEC_INTERVAL 15 - -//Pin config part -typedef enum -{ - D2_LDO_EN = 2, - D3_NRF_CE = 3, - A4_SDA = A4, - A5_SCL = A5, - D4_LDR_V_SENS_EN = 4, - D5_BAT_V_SENS_EN = 5, - D10_NRF_CS = 10, - D11_MOSI = 11, - D12_MISO = 12, - D13_SCK = 13, - A0_BAT_V_SENS = A0, - A1_LDR_V_SENS = A1, -} Pin; - -//Payload structure -typedef struct -{ - uint16_t id; - HEADER_e header : 6; - unsigned int ldr : 10; - float battery; - float bmpTemp; - float bmpPress; - float humidity; - float compensatedHumidity; - float htuTemp; -} DataPacket __attribute__((__packed__)); - -#endif //DEFINITION_H diff --git a/src/tests/packet_format.h b/src/tests/packet_format.h deleted file mode 100644 index 5b35254..0000000 --- a/src/tests/packet_format.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef PACKET_FORMAT_H -#define PACKET_FORMAT_H - -enum HEADER_e {WEATHER_STATION = 0}; - -#endif //PACKET_FORMAT_H From cd9be883ca5d5e446e01e3b1bad8c7df56d81bbd Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Wed, 21 Jul 2021 23:15:58 +0200 Subject: [PATCH 16/28] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'README.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c3757e0..6392ccf 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ The station is equipped with the following sensors and has these functionalities | |_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 +|_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. | From 1854a60637d685ecae751a47b4ebd9e58db2d38f Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Wed, 21 Jul 2021 23:34:43 +0200 Subject: [PATCH 17/28] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'README.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6392ccf..f51418e 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ Here is a list of the parts used to build the station with a link to where you c * [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) -If you have any questions, do not hesitate to contact me at : bugreport[at]laposte[dot]net +***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 : From f794ad4ee1fc1554bb04a6b779a0f73454392379 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Wed, 21 Jul 2021 23:46:12 +0200 Subject: [PATCH 18/28] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'README.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f51418e..4805658 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ On [this page](http://web-directories.tk/Pages/station.html) is displayed the da ![](http://82.64.196.164/images/git/weather_station_under.jpg) ## What are the functionalities ? -The station is equipped with the following sensors and has these functionalities : +The station is equipped with the following sensors and functionalities : * Temperature (BMP280 and HTU21) * Humidity (HTU21) @@ -20,9 +20,9 @@ The station is equipped with the following sensors and has these functionalities * Battery level indication (ATMEGA's 10 bit ADC) ## Power consumption : -* Around **60µA** during sleep +* 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. +* The solar panel is enough to even charge the battery, it should thus never need to be replaced or recharged. ## Project folder architecture : ``` json @@ -79,6 +79,7 @@ Here is a list of the parts used to build the station with a link to where you c * [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*** From 8409be43e72d8025e9bb378ece2b5f43b17958e8 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sat, 31 Jul 2021 19:40:36 +0200 Subject: [PATCH 19/28] Corrected a typo in a comment --- src/app/WSPeripherals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/WSPeripherals.cpp b/src/app/WSPeripherals.cpp index 068ab2f..030369d 100644 --- a/src/app/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); From e648e727c4d7625971d03628a610d5a43358ba16 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Wed, 18 Aug 2021 10:51:00 +0200 Subject: [PATCH 20/28] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'README.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4805658..863daad 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## 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](http://web-directories.tk/Pages/station.html) is displayed the data collected by this very unit ! +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.** @@ -47,7 +47,7 @@ The station is equipped with the following sensors and functionalities : 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](http://www.web-directories.cf/git/Th3maz1ng/ESP8266_dual_NRF24l01_gateway) which is the receiver end. +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. From cc32fa0715180a45d14052683960587b2b4d5e83 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Wed, 18 Aug 2021 10:51:42 +0200 Subject: [PATCH 21/28] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'README.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 863daad..c77f590 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ The station is equipped with the following sensors and functionalities : |_README.md The content of this page ``` ## Getting started : -1. Clone this repository : git clone http://web-directories.cf/git/Th3maz1ng/ATMEGA328PU_lowPower_weather_station.git +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 ! From cb323f9a6d99e901e9ed4bd225c063bfafeaa522 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Fri, 20 Aug 2021 09:49:31 +0200 Subject: [PATCH 22/28] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'README.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c77f590..e70c609 100644 --- a/README.md +++ b/README.md @@ -65,9 +65,9 @@ Set **VOLTAGE_DIV_COEFF** to something different if you changed the voltage divi 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. +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 power, higher current consumption) +Set **RADIO_PA_LEVEL** to adjust the transmit power level if needed (higher the power, higher the current consumption) ## The hardware : Here is a list of the parts used to build the station with a link to where you can buy it : From 10c226cb8640d2021423600547c716395ae83814 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Fri, 20 Aug 2021 09:52:06 +0200 Subject: [PATCH 23/28] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'README.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e70c609..e104492 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ The station is equipped with the following sensors and functionalities : ## 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. +* 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 From 594fc0cdb235501517723702c86b2beed5b3cabf Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sat, 2 Oct 2021 18:17:32 +0200 Subject: [PATCH 24/28] Added the option to enable/disable the LNA (for the NRF modules that have one) --- src/app/WSPeripherals.cpp | 4 ++-- src/app/WSPeripherals.h | 2 +- src/app/definition.h | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/app/WSPeripherals.cpp b/src/app/WSPeripherals.cpp index 030369d..3fd0c1c 100644 --- a/src/app/WSPeripherals.cpp +++ b/src/app/WSPeripherals.cpp @@ -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/app/WSPeripherals.h b/src/app/WSPeripherals.h index 212dd28..39cb8ee 100644 --- a/src/app/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/definition.h b/src/app/definition.h index c2e5f54..d786510 100644 --- a/src/app/definition.h +++ b/src/app/definition.h @@ -22,9 +22,11 @@ #define RADIO_CHANNEL 108 #define RADIO_NODE_ADDRESS "WEST1" //Weather Station 1 #define RADIO_PA_LEVEL RF24_PA_LOW //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 From edfff1ea82fdefe30b3a6eec9d13a413cf48419e Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sat, 2 Oct 2021 18:21:26 +0200 Subject: [PATCH 25/28] Updated the README.md file --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4805658..be21ce6 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,8 @@ Set **RADIO_NODE_ADDRESS** to change it's 5 byte address if you feel like it. Set **RADIO_PA_LEVEL** to adjust the transmit power level if needed (higher power, higher 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 it : * [Solar panel : 72x72](https://fr.aliexpress.com/item/4001240640418.html?spm=a2g0s.9042311.0.0.27426c3741mIVH) From 33160a93725f3af3dfd340459b8dbb1ca89b7e01 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Tue, 16 Nov 2021 10:49:19 +0100 Subject: [PATCH 26/28] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'README.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e2916dc..a0a61ff 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ Set **RADIO_PA_LEVEL** to adjust the transmit power level if needed (higher the 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 it : +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) From 8fc4976ac88cd5da1e72fc07d1dd57bb35806f65 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Fri, 9 Sep 2022 09:57:04 +0200 Subject: [PATCH 27/28] Added app.ino file description as well as renamed the type of the payload for more clarity --- src/app/app.ino | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/app/app.ino b/src/app/app.ino index 21e03be..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() { @@ -87,7 +94,7 @@ void loop() sleepSlots++; } -void debugStruct(DataPacket *p) +void debugStruct(WeatherStationDataPacket *p) { Serial.println("##############DATA##############"); Serial.print("ID : "); From 2a822f5bceb702eeec12461116ef78014324a0f5 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Fri, 9 Sep 2022 09:58:17 +0200 Subject: [PATCH 28/28] Renamed the payload type + few minor changes --- src/app/definition.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/definition.h b/src/app/definition.h index d786510..3fa199d 100644 --- a/src/app/definition.h +++ b/src/app/definition.h @@ -19,9 +19,9 @@ #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 //RF24_PA_MIN,RF24_PA_LOW,RF24_PA_HIGH,RF24_PA_MAX +#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 @@ -58,6 +58,6 @@ typedef struct float humidity; float compensatedHumidity; float htuTemp; -} DataPacket __attribute__((__packed__)); +} __attribute__((__packed__)) WeatherStationDataPacket; #endif //DEFINITION_H