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.**
+
+
+
+## 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 :
+
+
+PCB back view :
+
+
+Device's internals :
+
+
+Device's internals with the PCB removed :
+
+
+Device form factor :
+
+
+Device's LDR and solar panel :
+
+
+Device's antenna and SHT/HTU 21 cover :
+
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
*/