Compare commits

..

29 commits
nrf2.5 ... main

Author SHA1 Message Date
rbaron
5214f904f1
Merge pull request #214 from ryanrolds/rolds/msec_sleep
Adjusting sleep durations to be milliseconds. Needed for FCC 15b testing.
2024-09-06 09:08:33 +02:00
Ryan R. Olds
20693143ae Fixing build failure 2024-09-05 13:27:16 -07:00
Ryan R. Olds
2e5f89b228 Adjusting code 2024-09-03 16:25:14 -07:00
Ryan R. Olds
2dc7144de1 Switching sleep to to msec. Will aid FCC 15b testing 2024-09-03 16:23:28 -07:00
rbaron
5f671b0170
Merge pull request #207 from seime/debug_log_photo
Log photo adc value, not soil adc
2024-06-04 19:02:55 +02:00
Arne Seime
21dd14d7f3 Remove obsolete logging of soil voltage (always 0) 2024-06-04 16:55:30 +02:00
rbaron
f8c28cebd6
Merge pull request #208 from mrred2k/main
Add link to new case from Printables to README.md
2024-06-04 09:19:08 +02:00
rbaron
8ef2b5b748
Update README.md
- Parasite -> b-parasite
- Link directly to English website instead of german
2024-06-04 09:08:42 +02:00
mrred2k
4e0f3911bd Added a new case 2024-06-03 21:30:17 +02:00
Arne Seime
20d98d02a0 Log photo adc value, not soil adc 2024-06-03 10:21:51 +02:00
rbaron
ccdbaaf142
Merge pull request #194 from mrred2k/main
Include Printables link to 3D printable holder in README.md
2024-04-30 08:02:30 +02:00
mrred2k
57cf5aa0e5 Fixed Typos, deleted model 2024-04-29 21:18:27 +02:00
rbaron
e7e4b77eef
Merge pull request #188 from jrhbcn/main
Report battery percentage in BLE BTHOME_V2 protocol
2024-04-20 13:49:11 +02:00
jrhbcn
dc02480da9
Update encoding.c to fix formatting errors 2024-04-20 13:41:03 +02:00
jrhbcn
4796bfab5f
Update encoding.c
Changes in BTHOME_V2 protocol:
- Reduce resolution of humidity and moisture to 1 byte
- Add battery percentage
2024-04-20 13:10:36 +02:00
rbaron
e62521d2ae
Merge pull request #177 from ScottG489/patch-1
Small typo fix in BLE sample README
2024-03-07 19:15:37 +01:00
rbaron
16c4d23c47
Merge pull request #182 from oleo65/change-d1-component-part-no
Change d1 component part no
2024-03-04 19:07:17 +01:00
Ole Odendahl
15920b1ae4
Reflected changes to D1 in kicad files. 2024-02-25 16:03:26 +01:00
Ole Odendahl
d26eab5825
Updated BOM to changed inventory of JLCPCB.
Changed D1 to equivalent component.
2024-02-25 15:57:46 +01:00
rbaron
c7aaf5b388
Merge pull request #180 from jhbruhn/patch-1 2024-02-14 23:05:36 +01:00
Jan-Henrik Bruhn
905978e8c9
Only read positive voltages in adc.c
The ADC sometimes responds with negative voltages read on the ADC input due to noise. This can lead to very high illuminance readings at night (4095 << 4 to be exact due to two's complement :) ).
This commit caps ADC readings at 0.
2024-02-14 11:59:14 +01:00
Scott Giminiani
4c0fe9b4c6
Small typo fix in BLE sample README 2024-01-07 09:20:30 -08:00
rbaron
dd373ea235
Merge pull request #176 from victorhooi/patch-1
Fix broken link for ALS-PT19 datasheet
2024-01-01 22:53:51 +01:00
Victor Hooi
25a5941777
Fix broken link for ALS-PT19 datasheet 2024-01-01 23:02:42 +11:00
rbaron
37ea3a1062
Merge pull request #165 from rbaron/nrf2.5
Update to nRF Connect SDK 2.5
2023-11-08 08:33:01 +01:00
rbaron
d3ddd089bd
Merge pull request #166 from rbaron/nrf52833-flashfix
Fix nRF52833 flash partitions
2023-11-08 08:32:27 +01:00
rbaron
28c2809b04 Fix nRF52833 flash partitions
The nRF52833 has only 512 kB of flash. The .dts file was incorrect, as a
product of having it forked from the nRF52840 .dts files, which has 1 MB
of flash.

The new, correct partitions are closely related to the
[nrf52833dk](ec52722861/boards/arm/nrf52833dk_nrf52833/nrf52833dk_nrf52833.dts (L215)).
2023-11-07 21:32:09 +01:00
mrred2k
5d2b648b22 Added the link to the holder
Added the 3d Printed holder from printables. Also available in "case"
2023-08-29 11:30:49 +02:00
mrred2k
da1642514a Created a holder for 10 b-parasides
Created a simple 3d printable holder for dealing with a bigger number of b-parasides.
2023-08-29 11:22:59 +02:00
13 changed files with 57 additions and 59 deletions

View file

@ -86,7 +86,7 @@ jobs:
sample-dir: code/nrf-connect/samples/ble sample-dir: code/nrf-connect/samples/ble
board: bparasite_${{ matrix.soc }} board: bparasite_${{ matrix.soc }}
revision: ${{ matrix.revision }} revision: ${{ matrix.revision }}
cmake-extra: -DCONFIG_PRST_BLE_ENCODING_BTHOME_V2=y -DCONFIG_PRST_SLEEP_DURATION_SEC=1 -DCONFIG_PRSTLIB_LOG_LEVEL_DBG=y cmake-extra: -DCONFIG_PRST_BLE_ENCODING_BTHOME_V2=y -DCONFIG_PRST_SLEEP_DURATION_MSEC=1000 -DCONFIG_PRSTLIB_LOG_LEVEL_DBG=y
output-bin: ble_${{ matrix.soc }}_${{ matrix.revision }}_debug.hex output-bin: ble_${{ matrix.soc }}_${{ matrix.revision }}_debug.hex
build-zigbee: build-zigbee:

View file

@ -10,7 +10,7 @@ b-parasite is an open source soil moisture and ambient temperature/humidity/ligh
# Features # Features
* Capacitive Soil moisture sensor - see [this blog post](https://rbaron.net/blog/2021/04/05/How-capacitive-soil-moisture-sensors-work.html), [this Twitter thread](https://twitter.com/rbaron_/status/1367182806368071685), and [this post](https://wemakethings.net/2012/09/26/capacitance_measurement/) for nice resources on how they work * Capacitive Soil moisture sensor - see [this blog post](https://rbaron.net/blog/2021/04/05/How-capacitive-soil-moisture-sensors-work.html), [this Twitter thread](https://twitter.com/rbaron_/status/1367182806368071685), and [this post](https://wemakethings.net/2012/09/26/capacitance_measurement/) for nice resources on how they work
* Air temperature and humidity sensor using a [Sensirion's SHTC3](https://www.sensirion.com/en/environmental-sensors/humidity-sensors/digital-humidity-sensor-shtc3-our-new-standard-for-consumer-electronics/) * Air temperature and humidity sensor using a [Sensirion's SHTC3](https://www.sensirion.com/en/environmental-sensors/humidity-sensors/digital-humidity-sensor-shtc3-our-new-standard-for-consumer-electronics/)
* Light sensor using an [ALS-PT19](https://everlighteurope.com/ambient-light-sensors/7/ALSPT19315CL177TR8.html) phototransistor * Light sensor using an [ALS-PT19](https://en.everlight.com/wp-content/plugins/ItemRelationship/product_files/pdf/ALS-PT19-315C-L177-TR8_V8.pdf) phototransistor
* Powered by a common CR2032 coin cell, potentially for over two years * Powered by a common CR2032 coin cell, potentially for over two years
* Support for [nRF52840](https://www.nordicsemi.com/products/nrf52840) and [nRF52833](https://www.nordicsemi.com/products/nrf52833) modules * Support for [nRF52840](https://www.nordicsemi.com/products/nrf52840) and [nRF52833](https://www.nordicsemi.com/products/nrf52833) modules
* Open hardware and open source design * Open hardware and open source design
@ -49,6 +49,12 @@ We have three different 3D-printable cases:
1. Original snap-on case - [case/Top.stl](./case/Top.stl), [case/Bottom.stl](./case/Bottom.stl) 1. Original snap-on case - [case/Top.stl](./case/Top.stl), [case/Bottom.stl](./case/Bottom.stl)
2. High airflow - [case/b_parasite_case_high_airflow.stl](./case/b_parasite_case_high_airflow.stl) 2. High airflow - [case/b_parasite_case_high_airflow.stl](./case/b_parasite_case_high_airflow.stl)
3. Mushroom-style - available on [Printables](https://www.printables.com/model/456571-mushroomcap-for-b-parasite-soil-moisture-sensor) 3. Mushroom-style - available on [Printables](https://www.printables.com/model/456571-mushroomcap-for-b-parasite-soil-moisture-sensor)
4. b-parasite Hat - available on [Printables](https://www.printables.com/model/901220-waterproof-case-for-b-parasite-soil-moisture-air-s)
# Accessories
Designs and hardware to help you, when building your own:
1. Desk holder for b-parasites [Printables](https://www.printables.com/de/model/566974-b-parasite-holder)
# License # License
The hardware and associated design files are released under the [Creative Commons CC BY-SA 4.0 license](https://creativecommons.org/licenses/by-sa/4.0/). The hardware and associated design files are released under the [Creative Commons CC BY-SA 4.0 license](https://creativecommons.org/licenses/by-sa/4.0/).

View file

@ -139,7 +139,6 @@
&flash0 { &flash0 {
partitions { partitions {
compatible = "fixed-partitions"; compatible = "fixed-partitions";
#address-cells = <1>; #address-cells = <1>;
@ -147,33 +146,23 @@
boot_partition: partition@0 { boot_partition: partition@0 {
label = "mcuboot"; label = "mcuboot";
reg = <0x00000000 0x0000C000>; reg = <0x000000000 0xC000>;
}; };
slot0_partition: partition@c000 { slot0_partition: partition@c000 {
label = "image-0"; label = "image-0";
reg = <0x0000C000 0x00067000>; reg = <0x0000C000 0x32000>;
}; };
slot1_partition: partition@73000 { slot1_partition: partition@3e000 {
label = "image-1"; label = "image-1";
reg = <0x00073000 0x00067000>; reg = <0x0003E000 0x32000>;
}; };
scratch_partition: partition@da000 { scratch_partition: partition@70000 {
label = "image-scratch"; label = "image-scratch";
reg = <0x000da000 0x0001e000>; reg = <0x00070000 0xA000>;
}; };
storage_partition: partition@7a000 {
/*
* The flash starting at 0x000f8000 and ending at
* 0x000fffff is reserved for use by the application.
*/
/*
* Storage partition will be used by FCB/LittleFS/NVS
* if enabled.
*/
storage_partition: partition@f8000 {
label = "storage"; label = "storage";
reg = <0x000f8000 0x00008000>; reg = <0x0007A000 0x00006000>;
}; };
}; };
}; };

View file

@ -108,6 +108,7 @@ static int read_adc_spec(const struct adc_dt_spec* spec, prst_adc_read_t* out) {
int32_t val_mv = buf; int32_t val_mv = buf;
RET_IF_ERR(adc_raw_to_millivolts_dt(spec, &val_mv)); RET_IF_ERR(adc_raw_to_millivolts_dt(spec, &val_mv));
val_mv = MAX(0, val_mv);
out->raw = buf; out->raw = buf;
out->millivolts = val_mv; out->millivolts = val_mv;

View file

@ -16,10 +16,9 @@ int prst_sensors_read_all(prst_sensors_t *sensors) {
LOG_DBG("Batt: %d mV (%.2f%%)", sensors->batt.adc_read.millivolts, LOG_DBG("Batt: %d mV (%.2f%%)", sensors->batt.adc_read.millivolts,
100 * sensors->batt.percentage); 100 * sensors->batt.percentage);
LOG_DBG("Soil: %.0f %% (%d mV)", 100 * sensors->soil.percentage, LOG_DBG("Soil: %.0f %%", 100 * sensors->soil.percentage);
sensors->soil.adc_read.millivolts);
LOG_DBG("Photo: %u lx (%d mV)", sensors->photo.brightness, LOG_DBG("Photo: %u lx (%d mV)", sensors->photo.brightness,
sensors->soil.adc_read.millivolts); sensors->photo.adc_read.millivolts);
LOG_DBG("Temp: %f oC", sensors->shtc3.temp_c); LOG_DBG("Temp: %f oC", sensors->shtc3.temp_c);
LOG_DBG("Humi: %.0f %%", 100 * sensors->shtc3.rel_humi); LOG_DBG("Humi: %.0f %%", 100 * sensors->shtc3.rel_humi);
LOG_DBG("--------------------------------------------------"); LOG_DBG("--------------------------------------------------");

View file

@ -2,13 +2,13 @@
source "Kconfig.zephyr" source "Kconfig.zephyr"
rsource "../../prstlib/Kconfig" rsource "../../prstlib/Kconfig"
config PRST_SLEEP_DURATION_SEC config PRST_SLEEP_DURATION_MSEC
int "Sleep duration in seconds" int "Sleep duration in milliseconds"
default 600 default 600000
config PRST_BLE_ADV_DURATION_SEC config PRST_BLE_ADV_DURATION_MSEC
int "Advertising duration in seconds" int "Advertising duration in milliseconds"
default 1 default 1000
config PRST_BLE_MIN_ADV_INTERVAL config PRST_BLE_MIN_ADV_INTERVAL
int "Minimum advertising interval in milliseconds" int "Minimum advertising interval in milliseconds"

View file

@ -1,5 +1,5 @@
# Bluetooth Low Energy (BLE) # Bluetooth Low Energy (BLE)
In this saple, b-parasite sensors are periodically read and broadcast using Bluetooth Low Energy (BLE) dvertising packets. In this sample, b-parasite sensors are periodically read and broadcast using Bluetooth Low Energy (BLE) dvertising packets.
## Configuration ## Configuration
Available configurations and their default values are in [`Kconfig`](./Kconfig). They are set in [`prj.conf`](./prj.conf). Here are some notable examples. Available configurations and their default values are in [`Kconfig`](./Kconfig). They are set in [`prj.conf`](./prj.conf). Here are some notable examples.
@ -8,7 +8,7 @@ Available configurations and their default values are in [`Kconfig`](./Kconfig).
To save energy, the board spends most of the time in a "deep sleep" state, in which most peripherals and radio are completely turned off. The period of sleep is controlled by the `PRST_SLEEP_DURATION_SEC` config. To save energy, the board spends most of the time in a "deep sleep" state, in which most peripherals and radio are completely turned off. The period of sleep is controlled by the `PRST_SLEEP_DURATION_SEC` config.
### Advertising Duration ### Advertising Duration
When it wakes up, the sample reads all sensors and keep broadcasting advertising packets for `PRST_BLE_ADV_DURATION_SEC` before going back to sleep. When it wakes up, the sample reads all sensors and keep broadcasting advertising packets for `PRST_BLE_ADV_DURATION_MSEC` before going back to sleep.
### Advertising Packet Encoding ### Advertising Packet Encoding
There are different ways to encode the sensor data in a BLE advertising packet. There are different ways to encode the sensor data in a BLE advertising packet.
@ -52,4 +52,4 @@ If for example we lower the connection interval to the SDK defaults (`[100, 150]
![Broadcasting with 100ms current consumption](./media/power-profile/broadcasting-100.png) ![Broadcasting with 100ms current consumption](./media/power-profile/broadcasting-100.png)
With a `200 mAh` CR2032 battery, we can use [this spreadsheet](https://docs.google.com/spreadsheets/d/157JQiX20bGkTrlbvWbWRrs_WViL3MgVZffSCWRR7uAI/edit#gid=0) to estimate the battery life to over two years. Note that this is a simplified model and results in practice may vary. With a `200 mAh` CR2032 battery, we can use [this spreadsheet](https://docs.google.com/spreadsheets/d/157JQiX20bGkTrlbvWbWRrs_WViL3MgVZffSCWRR7uAI/edit#gid=0) to estimate the battery life to over two years. Note that this is a simplified model and results in practice may vary.

View file

@ -21,7 +21,7 @@ CONFIG_ASSERT=y
# Application config - see all options in Kconfig. # Application config - see all options in Kconfig.
# CONFIG_PRST_BLE_ENCODING_BTHOME_V2=y # CONFIG_PRST_BLE_ENCODING_BTHOME_V2=y
# CONFIG_PRST_SLEEP_DURATION_SEC=1 # CONFIG_PRST_SLEEP_DURATION_MSEC=1000
# prstlib config - ser all options in prstlib/Kconfig. # prstlib config - ser all options in prstlib/Kconfig.
# CONFIG_PRSTLIB_LOG_LEVEL_DBG=y # CONFIG_PRSTLIB_LOG_LEVEL_DBG=y

View file

@ -104,33 +104,36 @@ int prst_ble_encode_service_data(const prst_sensors_t* sensors,
out[4] = temp_val & 0xff; out[4] = temp_val & 0xff;
out[5] = temp_val >> 8; out[5] = temp_val >> 8;
// Humidity. // Humidity.
out[6] = 0x03; out[6] = 0x2E;
// Value. Factor 0.01, over 100%. // Value. Factor 1 over 100%.
uint16_t humi_val = 10000 * sensors->shtc3.rel_humi; uint8_t humi_val = 100 * sensors->shtc3.rel_humi + 0.5f;
out[7] = humi_val & 0xff; out[7] = humi_val;
out[8] = humi_val >> 8;
// Illuminance. // Illuminance.
out[9] = 0x05; out[8] = 0x05;
// Value. Factor of 0.01. // Value. Factor of 0.01.
uint32_t lux_val = sensors->photo.brightness * 100; uint32_t lux_val = sensors->photo.brightness * 100;
out[10] = lux_val & 0xff; out[9] = lux_val & 0xff;
out[11] = (lux_val >> 8) & 0xff; out[10] = (lux_val >> 8) & 0xff;
out[12] = (lux_val >> 16) & 0xff; out[11] = (lux_val >> 16) & 0xff;
// Battery voltage. // Battery voltage.
out[13] = 0x0c; out[12] = 0x0c;
// Value. Factor of 0.001. // Value. Factor of 0.001.
uint16_t batt_val = sensors->batt.adc_read.millivolts; uint16_t batt_val = sensors->batt.adc_read.millivolts;
out[14] = batt_val & 0xff; out[13] = batt_val & 0xff;
out[15] = batt_val >> 8; out[14] = batt_val >> 8;
// Soil moisture. // Soil moisture.
out[16] = 0x14; out[15] = 0x2F;
// Factor of 0.01, so we need to multiply our the value in 100% by 1/0.01 = 100. // Factor of 1 over 100%
uint16_t soil_val = 10000 * sensors->soil.percentage; uint8_t soil_val = 100 * sensors->soil.percentage + 0.5f;
out[17] = soil_val & 0xff; out[16] = soil_val;
out[18] = soil_val >> 8; // Battery percentage.
out[17] = 0x01;
// Value. Factor 1 over 100%
uint8_t batt_percentage_val = 100 * sensors->batt.percentage + 0.5f;
out[18] = batt_percentage_val;
#endif // Encoding protocols #endif // Encoding protocols
LOG_HEXDUMP_DBG(out, out_len, "Encoded BLE adv: "); LOG_HEXDUMP_DBG(out, out_len, "Encoded BLE adv: ");
return 0; return 0;
} }

View file

@ -26,7 +26,7 @@ static int prst_loop(prst_sensors_t *sensors) {
RET_IF_ERR(prst_sensors_read_all(sensors)); RET_IF_ERR(prst_sensors_read_all(sensors));
RET_IF_ERR(prst_ble_adv_set_data(sensors)); RET_IF_ERR(prst_ble_adv_set_data(sensors));
RET_IF_ERR(prst_ble_adv_start()); RET_IF_ERR(prst_ble_adv_start());
k_sleep(K_SECONDS(CONFIG_PRST_BLE_ADV_DURATION_SEC)); k_msleep(CONFIG_PRST_BLE_ADV_DURATION_MSEC);
RET_IF_ERR(prst_ble_adv_stop()); RET_IF_ERR(prst_ble_adv_stop());
return 0; return 0;
} }
@ -37,6 +37,6 @@ int main(void) {
prst_sensors_t sensors; prst_sensors_t sensors;
while (true) { while (true) {
__ASSERT(!prst_loop(&sensors), "Error in prst_loop()"); __ASSERT(!prst_loop(&sensors), "Error in prst_loop()");
k_sleep(K_SECONDS(CONFIG_PRST_SLEEP_DURATION_SEC)); k_msleep(CONFIG_PRST_SLEEP_DURATION_MSEC);
} }
} }

View file

@ -3,7 +3,7 @@ Comment,Designator,Footprint,LCSC
"1n","C1","Capacitor_SMD:C_0402_1005Metric","C1523" "1n","C1","Capacitor_SMD:C_0402_1005Metric","C1523"
"100n","C2","Capacitor_SMD:C_0402_1005Metric","C1525" "100n","C2","Capacitor_SMD:C_0402_1005Metric","C1525"
"12p","C3,C4","Capacitor_SMD:C_0402_1005Metric","C1547" "12p","C3,C4","Capacitor_SMD:C_0402_1005Metric","C1547"
"LL4148","D1","Diode_SMD:D_MiniMELF","C9808" "LL4148","D1","Diode_SMD:D_MiniMELF","C3011166"
"LED","D2","LED_SMD:LED_0603_1608Metric","C2286" "LED","D2","LED_SMD:LED_0603_1608Metric","C2286"
"MMBT3906","Q1","Package_TO_SOT_SMD:SOT-23","C2910191" "MMBT3906","Q1","Package_TO_SOT_SMD:SOT-23","C2910191"
"Q_Photo_NPN","Q4","snapeda:TR8","C146233" "Q_Photo_NPN","Q4","snapeda:TR8","C146233"

1 Comment Designator Footprint LCSC
3 1n C1 Capacitor_SMD:C_0402_1005Metric C1523
4 100n C2 Capacitor_SMD:C_0402_1005Metric C1525
5 12p C3,C4 Capacitor_SMD:C_0402_1005Metric C1547
6 LL4148 D1 Diode_SMD:D_MiniMELF C9808 C3011166
7 LED D2 LED_SMD:LED_0603_1608Metric C2286
8 MMBT3906 Q1 Package_TO_SOT_SMD:SOT-23 C2910191
9 Q_Photo_NPN Q4 snapeda:TR8 C146233

View file

@ -1027,7 +1027,7 @@
(at 66.742 55.536 180) (at 66.742 55.536 180)
(descr "Diode Mini-MELF") (descr "Diode Mini-MELF")
(tags "Diode Mini-MELF") (tags "Diode Mini-MELF")
(property "LCSC" "C9808") (property "LCSC" "C3011166")
(property "Sheetfile" "parasite.kicad_sch") (property "Sheetfile" "parasite.kicad_sch")
(property "Sheetname" "") (property "Sheetname" "")
(property "ki_description" "100V 0.15A standard switching diode, MiniMELF") (property "ki_description" "100V 0.15A standard switching diode, MiniMELF")

View file

@ -1963,10 +1963,10 @@
(property "Footprint" "Diode_SMD:D_MiniMELF" (at 63.5 111.125 0) (property "Footprint" "Diode_SMD:D_MiniMELF" (at 63.5 111.125 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(property "Datasheet" "http://www.vishay.com/docs/85557/ll4148.pdf" (at 63.5 115.57 0) (property "Datasheet" "https://datasheet.lcsc.com/lcsc/2205131645_JUXING-LL4148_C3011166.pdf" (at 63.5 115.57 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(property "LCSC" "C9808" (at 63.5 115.57 0) (property "LCSC" "C3011166" (at 63.5 115.57 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(pin "1" (uuid b7ede69c-719d-4a3e-977e-6b4e4c5e39dd)) (pin "1" (uuid b7ede69c-719d-4a3e-977e-6b4e4c5e39dd))