<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://revspace.nl/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bertrik+Sikken</id>
	<title>RevSpace - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://revspace.nl/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bertrik+Sikken"/>
	<link rel="alternate" type="text/html" href="https://revspace.nl/Special:Contributions/Bertrik_Sikken"/>
	<updated>2026-05-13T14:51:08Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Karaburan&amp;diff=35229</id>
		<title>Karaburan</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Karaburan&amp;diff=35229"/>
		<updated>2026-05-11T12:13:17Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* BT785 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
 |Name=Karaburan&lt;br /&gt;
 |Picture=karaburan.png&lt;br /&gt;
 |Omschrijving=Monitoring water quality&lt;br /&gt;
 |Status=In progress&lt;br /&gt;
 |Contact=bertrik&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Next steps ==&lt;br /&gt;
* &amp;lt;s&amp;gt;engage with PX4 community on getting a feel if this is useful to use and if so, how to get started&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;figure out how to duplicate an MQTT stream&amp;lt;/s&amp;gt; don&#039;t bother&lt;br /&gt;
* write python scripts&lt;br /&gt;
** &amp;lt;s&amp;gt;arduino turbidity&amp;lt;/s&amp;gt; don&#039;t bother&lt;br /&gt;
** &amp;lt;s&amp;gt;turbidity-to-mqtt&amp;lt;/s&amp;gt; maybe make this ROS module&lt;br /&gt;
** &amp;lt;s&amp;gt;HID-to-mqtt&amp;lt;/s&amp;gt; maybe make this ROS module&lt;br /&gt;
** position/velocity listener script: latitude, longitude, altitude, heading/bearing/track/whatever, velocity&lt;br /&gt;
* hook things into systemd / udev&lt;br /&gt;
* analoog in op de pi:&lt;br /&gt;
** https://elektronicavoorjou.nl/product/adc-pi/&lt;br /&gt;
** https://www.123materialen.com/products/zeer-nauwkeurige-ads1256-dac8552-ad-da-board-voor-raspberry-pi_1676153&lt;br /&gt;
** FreeJoy project&lt;br /&gt;
* UPS voor pi: https://elektronicavoorjou.nl/product/raspberry-pi-ups-hat/&lt;br /&gt;
* 1-wire stuff:&lt;br /&gt;
** 1-wire adapter emulation on an stm32: https://github.com/alitekin2fx/stm32_ds2480_emu&lt;br /&gt;
** owfs.org for easy interfacing with multiple 1-wire devices in a hierarchical way on linux&lt;br /&gt;
* Figure out the udev/hotplug mess, we probably need this because many of our peripherals use a serial port:&lt;br /&gt;
** in how many places can we store the udev renaming logic (config files)&lt;br /&gt;
** can we automate this, make it user friendlier, e.g. some kind of &amp;quot;insert device X now&amp;quot; script&lt;br /&gt;
&lt;br /&gt;
Check:&lt;br /&gt;
* https://www.rtvnoord.nl/natuur/1215705/vuilrobot-maakt-jachthaven-winschoten-schoon-beter-dan-met-een-schepnet&lt;br /&gt;
&lt;br /&gt;
=== USB HID as analog input ===&lt;br /&gt;
An stm32 based bluepill board can be flashed with firmware to allow its analog inputs to be exposed as USB HID sliders.&lt;br /&gt;
&lt;br /&gt;
Flashing the bluepill with openocd to the freejoy firmware:&lt;br /&gt;
* install openocd&lt;br /&gt;
  sudo apt install openocd&lt;br /&gt;
* connect an stlinkv2 to an stm32 bluepill, connect the stlinkv2 to USB&lt;br /&gt;
* flash the freejoy firmware as follows:&lt;br /&gt;
** download the firmware from https://github.com/FreeJoy-Team/FreeJoy&lt;br /&gt;
** create a symlink to the hex file called firmware.hex&lt;br /&gt;
** flash the firmware from the command line&lt;br /&gt;
  openocd -s /usr/share/openocd/scripts -f interface/stlink.cfg -f target/stm32f1x.cfg -c init -c &amp;quot;program firmware.hex verify reset exit&amp;quot;&lt;br /&gt;
* watch the kernel logs&lt;br /&gt;
  sudo dmesg -w&lt;br /&gt;
* connect the stm32 using a USB cable&lt;br /&gt;
* download the freejoy configurator from https://github.com/FreeJoy-Team/FreeJoyConfiguratorQt&lt;br /&gt;
* start the configurator and load the karaburan.cfg setting&lt;br /&gt;
* Write config to device -&amp;gt; it should reboot now and come up with the new settings&lt;br /&gt;
&lt;br /&gt;
Verify that it works:&lt;br /&gt;
* install the evtest package&lt;br /&gt;
* run&lt;br /&gt;
  evtest /dev/input/by-id/usb-FreeJoy_FreeJoy_v1.7.1-event-if00&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/vostrenkov/EazyJoy&lt;br /&gt;
&lt;br /&gt;
=== influxdb ===&lt;br /&gt;
See https://hub.docker.com/_/influxdb&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/karaburan/tree/master/influxdb&lt;br /&gt;
&lt;br /&gt;
=== ROS ===&lt;br /&gt;
Investigation:&lt;br /&gt;
* Use ROS 2, not the old ROS 1&lt;br /&gt;
* Cannot work comfortably with debian, works best with ubuntu&lt;br /&gt;
* Using gpsd:&lt;br /&gt;
** install ros-jazzy-desktop&lt;br /&gt;
** ros2 launch gpsd_client gpsd_client-launch.py&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Topics:&lt;br /&gt;
* air quality sensors&lt;br /&gt;
** ammonia&lt;br /&gt;
** NOx&lt;br /&gt;
* water chemical analysis&lt;br /&gt;
** nitrates&lt;br /&gt;
** ammonia&lt;br /&gt;
** dissolved oxygen&lt;br /&gt;
** sulfide/sulfate&lt;br /&gt;
** phosphates?&lt;br /&gt;
** salinity (chlorides?)&lt;br /&gt;
* water physical analysis&lt;br /&gt;
** temperature&lt;br /&gt;
** clarity/turbidity -&amp;gt; investigate standard ways of measuring/expressing this&lt;br /&gt;
** conductivity/total dissolved solids&lt;br /&gt;
** water properties by light reflection, hyperspectral/polarity&lt;br /&gt;
** depth?&lt;br /&gt;
* boat control&lt;br /&gt;
** trajectory -&amp;gt; steering&lt;br /&gt;
** idea: interface with the remote control, not with the boat&lt;br /&gt;
** idea: find a boat with easily hackable remote control protocol&lt;br /&gt;
** idea: can we get sensor data over this link too, e.g. GPS?&lt;br /&gt;
* camera control&lt;br /&gt;
* post-processing&lt;br /&gt;
** data presentation&lt;br /&gt;
*** video/photo stitching&lt;br /&gt;
*** time lapse view&lt;br /&gt;
*** map view of properties&lt;br /&gt;
* use cases&lt;br /&gt;
** verify with domain experts, how to engage?&lt;br /&gt;
** slootview, under/above water&lt;br /&gt;
** minimum viable prototype&lt;br /&gt;
** high-res measurement by location, by time&lt;br /&gt;
* materials&lt;br /&gt;
** boat selection&lt;br /&gt;
** processing platform selection&lt;br /&gt;
** communication platform selection&lt;br /&gt;
&lt;br /&gt;
== Investigate RTK GPS ==&lt;br /&gt;
Goal: figure out if it is practically possible to achieve cm resolution with a 200-euro GPS and a free correction service: YES&lt;br /&gt;
&lt;br /&gt;
* https://www.nsgi.nl/referentiepunten-en-gnss-data/gnss-data/real-time-streams public correction data service&lt;br /&gt;
* https://www.ardusimple.nl/rtk-in-5-minutes/&lt;br /&gt;
* RTK in action https://www.youtube.com/watch?v=Oc1LBFDj2MA&lt;br /&gt;
* Use with Linux / gpsd: https://stackoverflow.com/questions/77314115/drotek-gpsd-and-ntrip-correction-data-for-precise-positioning ?&lt;br /&gt;
* Chipsets&lt;br /&gt;
** Quectel LC29H (default: 115200 bps)&lt;br /&gt;
*** review: see https://rtklibexplorer.wordpress.com/2024/04/28/dual-frequency-rtk-for-less-than-60-with-the-quectel-lc29hea/&lt;br /&gt;
*** configuration: https://rtklibexplorer.wordpress.com/2024/05/06/configuring-the-quectel-lc29hea-receiver-for-real-time-rtk-solutions/&lt;br /&gt;
** uBLOX ZED-F9P&lt;br /&gt;
* Boards&lt;br /&gt;
** UM980 / UM982&lt;br /&gt;
&lt;br /&gt;
Edit /etc/default/gpsd, set GPSD_OPTIONS:&lt;br /&gt;
  GPSD_OPTIONS=&amp;quot;-Gn ntrip://user:pass@ntrip.kadaster.nl:2101/CBW100NLD0&amp;quot;&lt;br /&gt;
Option -G exposes the control socket on all network interfaces, option -n keeps the GPS active if there is no one currently connected.&lt;br /&gt;
&lt;br /&gt;
Plotting live location on a map:&lt;br /&gt;
* Configure gpsd to expose its socket to the outside world: last section of https://gpsd.gitlab.io/gpsd/troubleshooting.html&lt;br /&gt;
* In QGIS, press ctrl+0 to show the GPS information tab, enter the name of the remote gpsd (port 2947)&lt;br /&gt;
&lt;br /&gt;
Station at Stolwijk (close to Gouda): https://gnss1.tudelft.nl/dpga/station/Stolwijk.html#STWK ?&lt;br /&gt;
&lt;br /&gt;
Starting from the command line:&lt;br /&gt;
* stop gpsd.socket&lt;br /&gt;
  sudo systemctl stop gpsd.socket&lt;br /&gt;
* run from command line&lt;br /&gt;
  sudo /usr/sbin/gpsd -Gn -D 1 -N /dev/ttyUSB0 .... (not sure yet)&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
How to show that RTK GPS is actually accurate?&lt;br /&gt;
&lt;br /&gt;
* Relative positioning: with an &amp;quot;fix RTK&amp;quot; solution, place the antenna at 4 points 25cm apart, each point for 20 seconds or so -&amp;gt; you see 4 distinct clusters of points&lt;br /&gt;
* Positioning over short time: put it in a fixed location, make sure that it has &amp;quot;fix RTK&amp;quot; solution, take 100 measurements or so -&amp;gt; determine the radius of the circle that contains 90% of the points&lt;br /&gt;
* Positioning over longer time: do this for (say) an hour&lt;br /&gt;
* Absolute positioning: look up a national reference point, for example &amp;quot;RD-punt 389346&amp;quot;, located on the Sluisdijk between Gouda and Moordrecht. Technical data: https://www.nsgi.nl/iv-api/rdinfo/rdpoint/389346&lt;br /&gt;
** see https://www.nsgi.nl/referentiepunten-en-gnss-data/informatie-referentiepunten/rdinfo and enter 389346&lt;br /&gt;
** latitude: 51° 59&#039; 49,64048&amp;quot; , longitude: 4° 41&#039; 19,90765&amp;quot;, or 51.99712236/4.68886324&lt;br /&gt;
&lt;br /&gt;
==== Comparison with reference coordinate ====&lt;br /&gt;
On october 4th 2024, we took the RTK GPS to a kernnet reference point at 51.99712236/4.68886324, results below:&lt;br /&gt;
&lt;br /&gt;
From https://www.nsgi.nl/iv-api/rdinfo/rdpoint/389346:&lt;br /&gt;
* Year 2021: &amp;quot;51 59 49,64004&amp;quot;, &amp;quot;4 41 19,90584&amp;quot;, 48.039. In decimal degrees that is &lt;br /&gt;
&lt;br /&gt;
Differences between the reference point and the measurements are calculated to easting (&#039;X&#039;) and northing (&#039;Y&#039;), unit meter. To calculate distance in meters, we use a linear approximation:&lt;br /&gt;
* For dy: 40075km/360 = 111,319 m/deg&lt;br /&gt;
* For dx: dy * cos(latitude) = 68,549 m/deg&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Measurements + deviations&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Latitude !! Longitude !! dx (m) !! dy (m) !! absolute (m) !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| Reference 2012 || 51.99712236 || 4.68886324 || - || - || 0 || by definition&lt;br /&gt;
|-&lt;br /&gt;
| Reference 2021 || 51.99712223 || 4.68886273 || - || - || 0 || by definition&lt;br /&gt;
|-&lt;br /&gt;
| Screenshot 1 || 51.99712217 || 4.68886567 || 0.167 || -0.021 || 0.168 || - &lt;br /&gt;
|-&lt;br /&gt;
| Screenshot 2 || 51.99712200 || 4.68886533 || 0.143 || -0.040 || 0.149 || -&lt;br /&gt;
|-&lt;br /&gt;
| Meting 1 || 51.9971220 || 4.6888663 || 0.210 || -0.040 || 0.214 || -&lt;br /&gt;
|-&lt;br /&gt;
| Meting 2 || 51.9971222 || 4.6888660 || 0.189 || -0.018 || 0.190 || -&lt;br /&gt;
|-&lt;br /&gt;
| Average || - || - || 0.177 || -0.030 || 0.180 || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
According to [https://www.unavco.org/software/geodetic-utilities/plate-motion-calculator/plate-motion-calculator.html this page], the rate of movement is about&lt;br /&gt;
15.75mm/year to the north and 17.45 mm/year to the east (ITRF2020 model).&lt;br /&gt;
Over 12 years, that amounts to 0.189m north and 0.209m east.&lt;br /&gt;
&lt;br /&gt;
== Air quality sensors ==&lt;br /&gt;
&lt;br /&gt;
=== Nitrogen compounds in air ===&lt;br /&gt;
According to https://www.rivm.nl/stikstof/monitoren-advies-onderzoek/overzicht-stikstofmetingen/metingen-stikstof-in-de-lucht average (typical?) values of&lt;br /&gt;
* Ammonia (NH3): 6.7 ug/m3 (9.6 ppb)&lt;br /&gt;
* NOx: 27.3 ug/m3&lt;br /&gt;
* NO2: 18.6 ug/m3 (9.9 ppb)&lt;br /&gt;
&lt;br /&gt;
(ppb-conversion using https://www.breeze-technologies.de/blog/air-pollution-how-to-convert-between-mgm3-%C2%B5gm3-ppm-ppb/ )&lt;br /&gt;
&lt;br /&gt;
RIVM report on inexpensive nitrogen-in-air sensors: https://www.samenmeten.nl/sensoren-voor-no2&lt;br /&gt;
Conclusion: most sensors are not sensitive enough to be used in typical outdoor conditions, with perhaps one exception: alphasense NO2-B43F&lt;br /&gt;
&lt;br /&gt;
== Sonar sensors ==&lt;br /&gt;
Investigate this because it allows us to measure depth.&lt;br /&gt;
&lt;br /&gt;
AliExpress has several types of affordable sonar sensors, focused at detecting fish, but also able to measure depth.&lt;br /&gt;
&lt;br /&gt;
I ordered this one: https://nl.aliexpress.com/item/1005006388343879.html&lt;br /&gt;
* 125 kHz main frequency, range up to 200 ft deep (about 60m)&lt;br /&gt;
* bluetooth low-power interface (basically serial-over-BLE)&lt;br /&gt;
* built-in battery, powers on automatically when submerged&lt;br /&gt;
* reports 120-element array with raw sonar return intensity-vs-depth&lt;br /&gt;
* measures water temperature&lt;br /&gt;
* about 45 euro&lt;br /&gt;
&lt;br /&gt;
Fish helper pro application for android https://apkpure.com/fish-helper-pro/com.fishfinderpro.xdx&lt;br /&gt;
&lt;br /&gt;
=== Debug tool ===&lt;br /&gt;
I wrote a python script to connect to it from a linux computer: https://github.com/bertrik/wireless-sonar-sensor&lt;br /&gt;
&lt;br /&gt;
It&#039;s connects to a &amp;quot;Fish Helper Pro&amp;quot; wireless sonar sensor over bluetooth low-energy, reports depth and temperature&lt;br /&gt;
&lt;br /&gt;
=== ROS2 integration ===&lt;br /&gt;
The most appropriate message for a simple range would be: https://docs.ros2.org/foxy/api/sensor_msgs/msg/Range.html&lt;br /&gt;
&lt;br /&gt;
There are other messages to perhaps report the raw echo return array.&lt;br /&gt;
&lt;br /&gt;
== Water physical analysis ==&lt;br /&gt;
=== Turbidity / clarity ===&lt;br /&gt;
See https://en.wikipedia.org/wiki/Turbidity&lt;br /&gt;
&lt;br /&gt;
Aliexpress sensor &#039;&#039;&#039;TS-300B&#039;&#039;&#039;: https://nl.aliexpress.com/item/1005006732956937.html&lt;br /&gt;
Has a range 0 ~ 1000 ± 30 NTU&lt;br /&gt;
&lt;br /&gt;
Order of magnitude for turbidity:&lt;br /&gt;
* Drinking water upper limit: &#039;&#039;&#039;4 NTU&#039;&#039;&#039; (European turbidity standard for drinking water)&lt;br /&gt;
* Ambient water: 10-150 NTU. The US state of Washington use a &amp;quot;background&amp;quot; value of &#039;&#039;&#039;50 NTU&#039;&#039;&#039; as reference.&lt;br /&gt;
&lt;br /&gt;
(see https://en.wikipedia.org/wiki/Turbidity#Standards_and_test_methods )&lt;br /&gt;
&lt;br /&gt;
So the Aliexpress sensor is suited only for &amp;quot;dirty&amp;quot; water.&lt;br /&gt;
&lt;br /&gt;
=== Water measurement probes ===&lt;br /&gt;
* https://nl.aliexpress.com/item/1005003784454381.html BLE-9908 Inexpensie &amp;quot;Yieryi&amp;quot; PH/EC/Temp probe with bluetooth and app, about E25,- (Uses 3x LR44 coin cell batteries)&lt;br /&gt;
* Several different models: https://nl.aliexpress.com/item/1005007810989801.html&lt;br /&gt;
** EZ9901: TDS/pH/temp&lt;br /&gt;
** EZ9902: EC/pH/temp&lt;br /&gt;
** EZ9908: EC/TDS/pH/temp&lt;br /&gt;
** EZ9909: TDS/EC/pH/salt/temp&lt;br /&gt;
* The bluetooth versions are probably as above, with numbers like BLE9902 and BLE9908&lt;br /&gt;
* Yiery BLE9902: https://shop.yieryimeters.com/products/yieryi-ble-9902-3-in-1-digital-ph-meter-with-bluetooth-ec-and-temperature-measurement-ideal-for-water-quality-testing-in-pools-fish-tanks-hydroponics-more&lt;br /&gt;
* BLE-EC01 is a bluetooth EC meter, can find it here https://www.amazon.com/BLE-EC01-Smart4-TDS-Temp-Meter/dp/B0DPZZC7BV, not on AliExpress?&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Some probes indicate EC (electrical conductivity), other indicate TDS (total dissolved liquids). TDS is derived from EC (knowing the liquid type). EC is the more universal/fundamental property!&lt;br /&gt;
* EC is typically expressed in uS/cm or mS/cm (micro or milli siemens per centimeter), say 500 uS/cm for outdoor water.&lt;br /&gt;
* EC is temperature dependent, typically you need the value extrapolated to 25 degrees Celcius. Temperature-EC correlation rule of thumb: about 2% more conductive per K.&lt;br /&gt;
* pH sensors are almost by definition fragile and last only a limited time, so probably don&#039;t bother trying to use one at all. The pH of outdoor water might not be that interesting to measure.&lt;br /&gt;
* I expect the non-TuYa meters to use an easier to handle bluetooth protocol, avoiding the need for complicated encryption with a key that can only be fetched for a limited time using a tuya developer account.&lt;br /&gt;
&lt;br /&gt;
==== BT785 ====&lt;br /&gt;
I bought this one: Tuya compatible BT785 EC meter: https://nl.aliexpress.com/i/1005007462079781.html inexpensive, focused on EC, runs on 4x LR44.&lt;br /&gt;
Speaks the TuYa protocol (requires a secret key that you can fetch through the developer console).&lt;br /&gt;
This is quite cumbersome: you have to register as a developer, fetch the key before time runs out and developer access is limited.&lt;br /&gt;
&lt;br /&gt;
Does NOT speak the universal serialport access protocol as described here:&lt;br /&gt;
https://developer.tuya.com/en/docs/iot/tuya-cloud-universal-serial-port-access-protocol?id=K9hhi0xxtn9cb&lt;br /&gt;
&lt;br /&gt;
More information on this wiki: https://revspace.nl/BT785&lt;br /&gt;
Code: https://github.com/bertrik/bt785&lt;br /&gt;
&lt;br /&gt;
==== Cheap non-bluetooth EC/TDS ====&lt;br /&gt;
I got this one: https://nl.aliexpress.com/item/1005007267608479.html&lt;br /&gt;
&lt;br /&gt;
Tear-down on hackaday: https://hackaday.io/project/184764-ectds-temp-meter-teardown&lt;br /&gt;
&lt;br /&gt;
== Boat control ==&lt;br /&gt;
Typically the wireless link looks like this:&lt;br /&gt;
* 2.4 GHz working frequency&lt;br /&gt;
* 500m range&lt;br /&gt;
&lt;br /&gt;
Interesting links:&lt;br /&gt;
* Flytec-2011 remote control https://nl.aliexpress.com/item/1005002984723718.html&lt;br /&gt;
* Replacement board for various boats with &amp;quot;18&amp;quot; in their type number: https://nl.aliexpress.com/item/1005006115484716.html&lt;br /&gt;
* DIY Multi-protocol module: https://github.com/pascallanger/DIY-Multiprotocol-TX-Module&lt;br /&gt;
&lt;br /&gt;
=== remote control ===&lt;br /&gt;
Image of remote control RF chip:&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
Parts:&lt;br /&gt;
* 12.000 MHz crystal/oscillator&lt;br /&gt;
* 16-pin control chip: 20_CL6L071&lt;br /&gt;
* 6-pin RF chip: 1110 / VKA3, could be an rx/tx switch, amplifier or filter circuit&lt;br /&gt;
&lt;br /&gt;
See also: https://www.open-tx.org/&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* map out the connections between the mainboard and the rf board, expected: VCC, GND, spi ?&lt;br /&gt;
&lt;br /&gt;
== Use cases ==&lt;br /&gt;
material:&lt;br /&gt;
* https://www.youtube.com/watch?v=cMk0bGvIU1E&lt;br /&gt;
* https://iplo.nl/thema/water/oppervlaktewater/kaderrichtlijn-water&lt;br /&gt;
* kaartje: https://krw-nutrend.netlify.app/ -&amp;gt; 2 meetpunten op de reeuwijkse plassen, tijdresolutie is 1 jaar?&lt;br /&gt;
&lt;br /&gt;
Useful distinction, typically used in documents/guidelines:&lt;br /&gt;
* chemical quality, what substances are present in the water?&lt;br /&gt;
* biological / ecology quality, what kind of living organisms live in the water?&lt;br /&gt;
&lt;br /&gt;
=== Reeuwijkse plassen ===&lt;br /&gt;
See&lt;br /&gt;
* https://www.rijnland.net/wat-doet-rijnland/in-uw-buurt/reeuwijkse-plassen/ their stated goal: CLEAR WATER&lt;br /&gt;
* https://www.rijnland.net/regels-op-een-rij/subsidies-en-andere-financi%C3%ABle-bijdragen/&lt;br /&gt;
&lt;br /&gt;
potential applications:&lt;br /&gt;
* inspect water sides (oever) over time&lt;br /&gt;
* underwater camera: detect invasive cray fish&lt;br /&gt;
* sample water properties at high spatial resolution, high time resolution&lt;br /&gt;
* early detection of indicators for cyanobacteria: temperature and nutrients&lt;br /&gt;
&lt;br /&gt;
=== Detect/find pollution source ===&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== udev handling of serial ports ===&lt;br /&gt;
Many peripheral devices are connected through serial.&lt;br /&gt;
The plan is to have an udev config file with renaming rules, so each peripheral gets a stable name in /dev .&lt;br /&gt;
The plan is also to create the udev config using some python: insert device X now -&amp;gt; write line to udev config.&lt;br /&gt;
&lt;br /&gt;
The udev config file is:&lt;br /&gt;
  /etc/udev/rules.d/99-usb-serial.rules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# LIDAR serial converter&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;10c4&amp;quot;, ATTRS{idProduct}==&amp;quot;ea60&amp;quot;, SYMLINK+=&amp;quot;ttyLIDAR&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
# quectel GPS&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;1a86&amp;quot;, ATTRS{idProduct}==&amp;quot;7523&amp;quot;, SYMLINK+=&amp;quot;ttyGPS&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
# ublox GPS&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;0403&amp;quot;, ATTRS{idProduct}==&amp;quot;6001&amp;quot;, SYMLINK+=&amp;quot;ttyGPS&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An USB-nano also appears to have a USB vendor/product id of 1a86/7523 (&amp;quot;USB2.0-Serial&amp;quot;) ... same as the quectel GPS?&lt;br /&gt;
&lt;br /&gt;
Same for &amp;quot;AI thinker&amp;quot; USB-serial: vendor/product id of 1a86/7523 (product: &amp;quot;USB2.0-Serial&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
To (re)load the properties:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo udevadm control --reload-rules&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== reading temperature sensor ===&lt;br /&gt;
The idea is to to use a DB18B20 temperature sensor, read it using an arduino nano board acting as a 1-wire adapter.&lt;br /&gt;
Use openwire-fs as user-side openwire software http://owfs.org&lt;br /&gt;
&lt;br /&gt;
Preparation:&lt;br /&gt;
* Add the regular user to the &#039;dialout&#039; group, so it can access serial ports&lt;br /&gt;
  sudo adduser &amp;lt;name&amp;gt; dialout&lt;br /&gt;
&lt;br /&gt;
Setting up the hardware:&lt;br /&gt;
* connect the DS18B20 to the connector board with the pull-ups&lt;br /&gt;
* wire the connector board to the arduino nano, see ...&lt;br /&gt;
* plug the arduino nano in the pi&lt;br /&gt;
&lt;br /&gt;
Setting up the software:&lt;br /&gt;
* Install openwire fs&lt;br /&gt;
  sudo apt install owfs&lt;br /&gt;
* Create the openwire fs mountpoint&lt;br /&gt;
  sudo mkdir /mnt/1wire&lt;br /&gt;
* Configure owfs, edit /etc/owfs.conf&lt;br /&gt;
  server: device = /dev/ttyUSB0&lt;br /&gt;
  mountpoint = /mnt/1wire&lt;br /&gt;
  allow_other&lt;br /&gt;
  (comment out the line with the FAKE devices)&lt;br /&gt;
* Configure systemd services&lt;br /&gt;
  sudo systemctl enable owserver owhttpd&lt;br /&gt;
  sudo systemctl disable owftpd&lt;br /&gt;
* Start the systemd service&lt;br /&gt;
  sudo systemctl start owserver owhttpd&lt;br /&gt;
* Check the logs&lt;br /&gt;
  sudo journalctl -xeu owserver -f&lt;br /&gt;
* Open a browser to view the web interface&lt;br /&gt;
  http://localhost:2121 or&lt;br /&gt;
  http://raspberrypi.local:2121&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Karaburan&amp;diff=35228</id>
		<title>Karaburan</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Karaburan&amp;diff=35228"/>
		<updated>2026-05-11T12:12:36Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* BT785 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
 |Name=Karaburan&lt;br /&gt;
 |Picture=karaburan.png&lt;br /&gt;
 |Omschrijving=Monitoring water quality&lt;br /&gt;
 |Status=In progress&lt;br /&gt;
 |Contact=bertrik&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Next steps ==&lt;br /&gt;
* &amp;lt;s&amp;gt;engage with PX4 community on getting a feel if this is useful to use and if so, how to get started&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;figure out how to duplicate an MQTT stream&amp;lt;/s&amp;gt; don&#039;t bother&lt;br /&gt;
* write python scripts&lt;br /&gt;
** &amp;lt;s&amp;gt;arduino turbidity&amp;lt;/s&amp;gt; don&#039;t bother&lt;br /&gt;
** &amp;lt;s&amp;gt;turbidity-to-mqtt&amp;lt;/s&amp;gt; maybe make this ROS module&lt;br /&gt;
** &amp;lt;s&amp;gt;HID-to-mqtt&amp;lt;/s&amp;gt; maybe make this ROS module&lt;br /&gt;
** position/velocity listener script: latitude, longitude, altitude, heading/bearing/track/whatever, velocity&lt;br /&gt;
* hook things into systemd / udev&lt;br /&gt;
* analoog in op de pi:&lt;br /&gt;
** https://elektronicavoorjou.nl/product/adc-pi/&lt;br /&gt;
** https://www.123materialen.com/products/zeer-nauwkeurige-ads1256-dac8552-ad-da-board-voor-raspberry-pi_1676153&lt;br /&gt;
** FreeJoy project&lt;br /&gt;
* UPS voor pi: https://elektronicavoorjou.nl/product/raspberry-pi-ups-hat/&lt;br /&gt;
* 1-wire stuff:&lt;br /&gt;
** 1-wire adapter emulation on an stm32: https://github.com/alitekin2fx/stm32_ds2480_emu&lt;br /&gt;
** owfs.org for easy interfacing with multiple 1-wire devices in a hierarchical way on linux&lt;br /&gt;
* Figure out the udev/hotplug mess, we probably need this because many of our peripherals use a serial port:&lt;br /&gt;
** in how many places can we store the udev renaming logic (config files)&lt;br /&gt;
** can we automate this, make it user friendlier, e.g. some kind of &amp;quot;insert device X now&amp;quot; script&lt;br /&gt;
&lt;br /&gt;
Check:&lt;br /&gt;
* https://www.rtvnoord.nl/natuur/1215705/vuilrobot-maakt-jachthaven-winschoten-schoon-beter-dan-met-een-schepnet&lt;br /&gt;
&lt;br /&gt;
=== USB HID as analog input ===&lt;br /&gt;
An stm32 based bluepill board can be flashed with firmware to allow its analog inputs to be exposed as USB HID sliders.&lt;br /&gt;
&lt;br /&gt;
Flashing the bluepill with openocd to the freejoy firmware:&lt;br /&gt;
* install openocd&lt;br /&gt;
  sudo apt install openocd&lt;br /&gt;
* connect an stlinkv2 to an stm32 bluepill, connect the stlinkv2 to USB&lt;br /&gt;
* flash the freejoy firmware as follows:&lt;br /&gt;
** download the firmware from https://github.com/FreeJoy-Team/FreeJoy&lt;br /&gt;
** create a symlink to the hex file called firmware.hex&lt;br /&gt;
** flash the firmware from the command line&lt;br /&gt;
  openocd -s /usr/share/openocd/scripts -f interface/stlink.cfg -f target/stm32f1x.cfg -c init -c &amp;quot;program firmware.hex verify reset exit&amp;quot;&lt;br /&gt;
* watch the kernel logs&lt;br /&gt;
  sudo dmesg -w&lt;br /&gt;
* connect the stm32 using a USB cable&lt;br /&gt;
* download the freejoy configurator from https://github.com/FreeJoy-Team/FreeJoyConfiguratorQt&lt;br /&gt;
* start the configurator and load the karaburan.cfg setting&lt;br /&gt;
* Write config to device -&amp;gt; it should reboot now and come up with the new settings&lt;br /&gt;
&lt;br /&gt;
Verify that it works:&lt;br /&gt;
* install the evtest package&lt;br /&gt;
* run&lt;br /&gt;
  evtest /dev/input/by-id/usb-FreeJoy_FreeJoy_v1.7.1-event-if00&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/vostrenkov/EazyJoy&lt;br /&gt;
&lt;br /&gt;
=== influxdb ===&lt;br /&gt;
See https://hub.docker.com/_/influxdb&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/karaburan/tree/master/influxdb&lt;br /&gt;
&lt;br /&gt;
=== ROS ===&lt;br /&gt;
Investigation:&lt;br /&gt;
* Use ROS 2, not the old ROS 1&lt;br /&gt;
* Cannot work comfortably with debian, works best with ubuntu&lt;br /&gt;
* Using gpsd:&lt;br /&gt;
** install ros-jazzy-desktop&lt;br /&gt;
** ros2 launch gpsd_client gpsd_client-launch.py&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Topics:&lt;br /&gt;
* air quality sensors&lt;br /&gt;
** ammonia&lt;br /&gt;
** NOx&lt;br /&gt;
* water chemical analysis&lt;br /&gt;
** nitrates&lt;br /&gt;
** ammonia&lt;br /&gt;
** dissolved oxygen&lt;br /&gt;
** sulfide/sulfate&lt;br /&gt;
** phosphates?&lt;br /&gt;
** salinity (chlorides?)&lt;br /&gt;
* water physical analysis&lt;br /&gt;
** temperature&lt;br /&gt;
** clarity/turbidity -&amp;gt; investigate standard ways of measuring/expressing this&lt;br /&gt;
** conductivity/total dissolved solids&lt;br /&gt;
** water properties by light reflection, hyperspectral/polarity&lt;br /&gt;
** depth?&lt;br /&gt;
* boat control&lt;br /&gt;
** trajectory -&amp;gt; steering&lt;br /&gt;
** idea: interface with the remote control, not with the boat&lt;br /&gt;
** idea: find a boat with easily hackable remote control protocol&lt;br /&gt;
** idea: can we get sensor data over this link too, e.g. GPS?&lt;br /&gt;
* camera control&lt;br /&gt;
* post-processing&lt;br /&gt;
** data presentation&lt;br /&gt;
*** video/photo stitching&lt;br /&gt;
*** time lapse view&lt;br /&gt;
*** map view of properties&lt;br /&gt;
* use cases&lt;br /&gt;
** verify with domain experts, how to engage?&lt;br /&gt;
** slootview, under/above water&lt;br /&gt;
** minimum viable prototype&lt;br /&gt;
** high-res measurement by location, by time&lt;br /&gt;
* materials&lt;br /&gt;
** boat selection&lt;br /&gt;
** processing platform selection&lt;br /&gt;
** communication platform selection&lt;br /&gt;
&lt;br /&gt;
== Investigate RTK GPS ==&lt;br /&gt;
Goal: figure out if it is practically possible to achieve cm resolution with a 200-euro GPS and a free correction service: YES&lt;br /&gt;
&lt;br /&gt;
* https://www.nsgi.nl/referentiepunten-en-gnss-data/gnss-data/real-time-streams public correction data service&lt;br /&gt;
* https://www.ardusimple.nl/rtk-in-5-minutes/&lt;br /&gt;
* RTK in action https://www.youtube.com/watch?v=Oc1LBFDj2MA&lt;br /&gt;
* Use with Linux / gpsd: https://stackoverflow.com/questions/77314115/drotek-gpsd-and-ntrip-correction-data-for-precise-positioning ?&lt;br /&gt;
* Chipsets&lt;br /&gt;
** Quectel LC29H (default: 115200 bps)&lt;br /&gt;
*** review: see https://rtklibexplorer.wordpress.com/2024/04/28/dual-frequency-rtk-for-less-than-60-with-the-quectel-lc29hea/&lt;br /&gt;
*** configuration: https://rtklibexplorer.wordpress.com/2024/05/06/configuring-the-quectel-lc29hea-receiver-for-real-time-rtk-solutions/&lt;br /&gt;
** uBLOX ZED-F9P&lt;br /&gt;
* Boards&lt;br /&gt;
** UM980 / UM982&lt;br /&gt;
&lt;br /&gt;
Edit /etc/default/gpsd, set GPSD_OPTIONS:&lt;br /&gt;
  GPSD_OPTIONS=&amp;quot;-Gn ntrip://user:pass@ntrip.kadaster.nl:2101/CBW100NLD0&amp;quot;&lt;br /&gt;
Option -G exposes the control socket on all network interfaces, option -n keeps the GPS active if there is no one currently connected.&lt;br /&gt;
&lt;br /&gt;
Plotting live location on a map:&lt;br /&gt;
* Configure gpsd to expose its socket to the outside world: last section of https://gpsd.gitlab.io/gpsd/troubleshooting.html&lt;br /&gt;
* In QGIS, press ctrl+0 to show the GPS information tab, enter the name of the remote gpsd (port 2947)&lt;br /&gt;
&lt;br /&gt;
Station at Stolwijk (close to Gouda): https://gnss1.tudelft.nl/dpga/station/Stolwijk.html#STWK ?&lt;br /&gt;
&lt;br /&gt;
Starting from the command line:&lt;br /&gt;
* stop gpsd.socket&lt;br /&gt;
  sudo systemctl stop gpsd.socket&lt;br /&gt;
* run from command line&lt;br /&gt;
  sudo /usr/sbin/gpsd -Gn -D 1 -N /dev/ttyUSB0 .... (not sure yet)&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
How to show that RTK GPS is actually accurate?&lt;br /&gt;
&lt;br /&gt;
* Relative positioning: with an &amp;quot;fix RTK&amp;quot; solution, place the antenna at 4 points 25cm apart, each point for 20 seconds or so -&amp;gt; you see 4 distinct clusters of points&lt;br /&gt;
* Positioning over short time: put it in a fixed location, make sure that it has &amp;quot;fix RTK&amp;quot; solution, take 100 measurements or so -&amp;gt; determine the radius of the circle that contains 90% of the points&lt;br /&gt;
* Positioning over longer time: do this for (say) an hour&lt;br /&gt;
* Absolute positioning: look up a national reference point, for example &amp;quot;RD-punt 389346&amp;quot;, located on the Sluisdijk between Gouda and Moordrecht. Technical data: https://www.nsgi.nl/iv-api/rdinfo/rdpoint/389346&lt;br /&gt;
** see https://www.nsgi.nl/referentiepunten-en-gnss-data/informatie-referentiepunten/rdinfo and enter 389346&lt;br /&gt;
** latitude: 51° 59&#039; 49,64048&amp;quot; , longitude: 4° 41&#039; 19,90765&amp;quot;, or 51.99712236/4.68886324&lt;br /&gt;
&lt;br /&gt;
==== Comparison with reference coordinate ====&lt;br /&gt;
On october 4th 2024, we took the RTK GPS to a kernnet reference point at 51.99712236/4.68886324, results below:&lt;br /&gt;
&lt;br /&gt;
From https://www.nsgi.nl/iv-api/rdinfo/rdpoint/389346:&lt;br /&gt;
* Year 2021: &amp;quot;51 59 49,64004&amp;quot;, &amp;quot;4 41 19,90584&amp;quot;, 48.039. In decimal degrees that is &lt;br /&gt;
&lt;br /&gt;
Differences between the reference point and the measurements are calculated to easting (&#039;X&#039;) and northing (&#039;Y&#039;), unit meter. To calculate distance in meters, we use a linear approximation:&lt;br /&gt;
* For dy: 40075km/360 = 111,319 m/deg&lt;br /&gt;
* For dx: dy * cos(latitude) = 68,549 m/deg&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Measurements + deviations&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Latitude !! Longitude !! dx (m) !! dy (m) !! absolute (m) !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| Reference 2012 || 51.99712236 || 4.68886324 || - || - || 0 || by definition&lt;br /&gt;
|-&lt;br /&gt;
| Reference 2021 || 51.99712223 || 4.68886273 || - || - || 0 || by definition&lt;br /&gt;
|-&lt;br /&gt;
| Screenshot 1 || 51.99712217 || 4.68886567 || 0.167 || -0.021 || 0.168 || - &lt;br /&gt;
|-&lt;br /&gt;
| Screenshot 2 || 51.99712200 || 4.68886533 || 0.143 || -0.040 || 0.149 || -&lt;br /&gt;
|-&lt;br /&gt;
| Meting 1 || 51.9971220 || 4.6888663 || 0.210 || -0.040 || 0.214 || -&lt;br /&gt;
|-&lt;br /&gt;
| Meting 2 || 51.9971222 || 4.6888660 || 0.189 || -0.018 || 0.190 || -&lt;br /&gt;
|-&lt;br /&gt;
| Average || - || - || 0.177 || -0.030 || 0.180 || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
According to [https://www.unavco.org/software/geodetic-utilities/plate-motion-calculator/plate-motion-calculator.html this page], the rate of movement is about&lt;br /&gt;
15.75mm/year to the north and 17.45 mm/year to the east (ITRF2020 model).&lt;br /&gt;
Over 12 years, that amounts to 0.189m north and 0.209m east.&lt;br /&gt;
&lt;br /&gt;
== Air quality sensors ==&lt;br /&gt;
&lt;br /&gt;
=== Nitrogen compounds in air ===&lt;br /&gt;
According to https://www.rivm.nl/stikstof/monitoren-advies-onderzoek/overzicht-stikstofmetingen/metingen-stikstof-in-de-lucht average (typical?) values of&lt;br /&gt;
* Ammonia (NH3): 6.7 ug/m3 (9.6 ppb)&lt;br /&gt;
* NOx: 27.3 ug/m3&lt;br /&gt;
* NO2: 18.6 ug/m3 (9.9 ppb)&lt;br /&gt;
&lt;br /&gt;
(ppb-conversion using https://www.breeze-technologies.de/blog/air-pollution-how-to-convert-between-mgm3-%C2%B5gm3-ppm-ppb/ )&lt;br /&gt;
&lt;br /&gt;
RIVM report on inexpensive nitrogen-in-air sensors: https://www.samenmeten.nl/sensoren-voor-no2&lt;br /&gt;
Conclusion: most sensors are not sensitive enough to be used in typical outdoor conditions, with perhaps one exception: alphasense NO2-B43F&lt;br /&gt;
&lt;br /&gt;
== Sonar sensors ==&lt;br /&gt;
Investigate this because it allows us to measure depth.&lt;br /&gt;
&lt;br /&gt;
AliExpress has several types of affordable sonar sensors, focused at detecting fish, but also able to measure depth.&lt;br /&gt;
&lt;br /&gt;
I ordered this one: https://nl.aliexpress.com/item/1005006388343879.html&lt;br /&gt;
* 125 kHz main frequency, range up to 200 ft deep (about 60m)&lt;br /&gt;
* bluetooth low-power interface (basically serial-over-BLE)&lt;br /&gt;
* built-in battery, powers on automatically when submerged&lt;br /&gt;
* reports 120-element array with raw sonar return intensity-vs-depth&lt;br /&gt;
* measures water temperature&lt;br /&gt;
* about 45 euro&lt;br /&gt;
&lt;br /&gt;
Fish helper pro application for android https://apkpure.com/fish-helper-pro/com.fishfinderpro.xdx&lt;br /&gt;
&lt;br /&gt;
=== Debug tool ===&lt;br /&gt;
I wrote a python script to connect to it from a linux computer: https://github.com/bertrik/wireless-sonar-sensor&lt;br /&gt;
&lt;br /&gt;
It&#039;s connects to a &amp;quot;Fish Helper Pro&amp;quot; wireless sonar sensor over bluetooth low-energy, reports depth and temperature&lt;br /&gt;
&lt;br /&gt;
=== ROS2 integration ===&lt;br /&gt;
The most appropriate message for a simple range would be: https://docs.ros2.org/foxy/api/sensor_msgs/msg/Range.html&lt;br /&gt;
&lt;br /&gt;
There are other messages to perhaps report the raw echo return array.&lt;br /&gt;
&lt;br /&gt;
== Water physical analysis ==&lt;br /&gt;
=== Turbidity / clarity ===&lt;br /&gt;
See https://en.wikipedia.org/wiki/Turbidity&lt;br /&gt;
&lt;br /&gt;
Aliexpress sensor &#039;&#039;&#039;TS-300B&#039;&#039;&#039;: https://nl.aliexpress.com/item/1005006732956937.html&lt;br /&gt;
Has a range 0 ~ 1000 ± 30 NTU&lt;br /&gt;
&lt;br /&gt;
Order of magnitude for turbidity:&lt;br /&gt;
* Drinking water upper limit: &#039;&#039;&#039;4 NTU&#039;&#039;&#039; (European turbidity standard for drinking water)&lt;br /&gt;
* Ambient water: 10-150 NTU. The US state of Washington use a &amp;quot;background&amp;quot; value of &#039;&#039;&#039;50 NTU&#039;&#039;&#039; as reference.&lt;br /&gt;
&lt;br /&gt;
(see https://en.wikipedia.org/wiki/Turbidity#Standards_and_test_methods )&lt;br /&gt;
&lt;br /&gt;
So the Aliexpress sensor is suited only for &amp;quot;dirty&amp;quot; water.&lt;br /&gt;
&lt;br /&gt;
=== Water measurement probes ===&lt;br /&gt;
* https://nl.aliexpress.com/item/1005003784454381.html BLE-9908 Inexpensie &amp;quot;Yieryi&amp;quot; PH/EC/Temp probe with bluetooth and app, about E25,- (Uses 3x LR44 coin cell batteries)&lt;br /&gt;
* Several different models: https://nl.aliexpress.com/item/1005007810989801.html&lt;br /&gt;
** EZ9901: TDS/pH/temp&lt;br /&gt;
** EZ9902: EC/pH/temp&lt;br /&gt;
** EZ9908: EC/TDS/pH/temp&lt;br /&gt;
** EZ9909: TDS/EC/pH/salt/temp&lt;br /&gt;
* The bluetooth versions are probably as above, with numbers like BLE9902 and BLE9908&lt;br /&gt;
* Yiery BLE9902: https://shop.yieryimeters.com/products/yieryi-ble-9902-3-in-1-digital-ph-meter-with-bluetooth-ec-and-temperature-measurement-ideal-for-water-quality-testing-in-pools-fish-tanks-hydroponics-more&lt;br /&gt;
* BLE-EC01 is a bluetooth EC meter, can find it here https://www.amazon.com/BLE-EC01-Smart4-TDS-Temp-Meter/dp/B0DPZZC7BV, not on AliExpress?&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Some probes indicate EC (electrical conductivity), other indicate TDS (total dissolved liquids). TDS is derived from EC (knowing the liquid type). EC is the more universal/fundamental property!&lt;br /&gt;
* EC is typically expressed in uS/cm or mS/cm (micro or milli siemens per centimeter), say 500 uS/cm for outdoor water.&lt;br /&gt;
* EC is temperature dependent, typically you need the value extrapolated to 25 degrees Celcius. Temperature-EC correlation rule of thumb: about 2% more conductive per K.&lt;br /&gt;
* pH sensors are almost by definition fragile and last only a limited time, so probably don&#039;t bother trying to use one at all. The pH of outdoor water might not be that interesting to measure.&lt;br /&gt;
* I expect the non-TuYa meters to use an easier to handle bluetooth protocol, avoiding the need for complicated encryption with a key that can only be fetched for a limited time using a tuya developer account.&lt;br /&gt;
&lt;br /&gt;
==== BT785 ====&lt;br /&gt;
I bought this one: Tuya compatible BT785 EC meter: https://nl.aliexpress.com/i/1005007462079781.html inexpensive, focused on EC, runs on 4x LR44.&lt;br /&gt;
Speaks the TuYa protocol (requires a secret key that you can fetch through the developer console).&lt;br /&gt;
This is quite cumbersome: you have to register as a developer, fetch the key before time runs out and developer access is limited.&lt;br /&gt;
&lt;br /&gt;
Does NOT speak the universal serialport access protocol as described here:&lt;br /&gt;
https://developer.tuya.com/en/docs/iot/tuya-cloud-universal-serial-port-access-protocol?id=K9hhi0xxtn9cb&lt;br /&gt;
&lt;br /&gt;
Code: https://github.com/bertrik/bt785&lt;br /&gt;
&lt;br /&gt;
==== Cheap non-bluetooth EC/TDS ====&lt;br /&gt;
I got this one: https://nl.aliexpress.com/item/1005007267608479.html&lt;br /&gt;
&lt;br /&gt;
Tear-down on hackaday: https://hackaday.io/project/184764-ectds-temp-meter-teardown&lt;br /&gt;
&lt;br /&gt;
== Boat control ==&lt;br /&gt;
Typically the wireless link looks like this:&lt;br /&gt;
* 2.4 GHz working frequency&lt;br /&gt;
* 500m range&lt;br /&gt;
&lt;br /&gt;
Interesting links:&lt;br /&gt;
* Flytec-2011 remote control https://nl.aliexpress.com/item/1005002984723718.html&lt;br /&gt;
* Replacement board for various boats with &amp;quot;18&amp;quot; in their type number: https://nl.aliexpress.com/item/1005006115484716.html&lt;br /&gt;
* DIY Multi-protocol module: https://github.com/pascallanger/DIY-Multiprotocol-TX-Module&lt;br /&gt;
&lt;br /&gt;
=== remote control ===&lt;br /&gt;
Image of remote control RF chip:&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
Parts:&lt;br /&gt;
* 12.000 MHz crystal/oscillator&lt;br /&gt;
* 16-pin control chip: 20_CL6L071&lt;br /&gt;
* 6-pin RF chip: 1110 / VKA3, could be an rx/tx switch, amplifier or filter circuit&lt;br /&gt;
&lt;br /&gt;
See also: https://www.open-tx.org/&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* map out the connections between the mainboard and the rf board, expected: VCC, GND, spi ?&lt;br /&gt;
&lt;br /&gt;
== Use cases ==&lt;br /&gt;
material:&lt;br /&gt;
* https://www.youtube.com/watch?v=cMk0bGvIU1E&lt;br /&gt;
* https://iplo.nl/thema/water/oppervlaktewater/kaderrichtlijn-water&lt;br /&gt;
* kaartje: https://krw-nutrend.netlify.app/ -&amp;gt; 2 meetpunten op de reeuwijkse plassen, tijdresolutie is 1 jaar?&lt;br /&gt;
&lt;br /&gt;
Useful distinction, typically used in documents/guidelines:&lt;br /&gt;
* chemical quality, what substances are present in the water?&lt;br /&gt;
* biological / ecology quality, what kind of living organisms live in the water?&lt;br /&gt;
&lt;br /&gt;
=== Reeuwijkse plassen ===&lt;br /&gt;
See&lt;br /&gt;
* https://www.rijnland.net/wat-doet-rijnland/in-uw-buurt/reeuwijkse-plassen/ their stated goal: CLEAR WATER&lt;br /&gt;
* https://www.rijnland.net/regels-op-een-rij/subsidies-en-andere-financi%C3%ABle-bijdragen/&lt;br /&gt;
&lt;br /&gt;
potential applications:&lt;br /&gt;
* inspect water sides (oever) over time&lt;br /&gt;
* underwater camera: detect invasive cray fish&lt;br /&gt;
* sample water properties at high spatial resolution, high time resolution&lt;br /&gt;
* early detection of indicators for cyanobacteria: temperature and nutrients&lt;br /&gt;
&lt;br /&gt;
=== Detect/find pollution source ===&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== udev handling of serial ports ===&lt;br /&gt;
Many peripheral devices are connected through serial.&lt;br /&gt;
The plan is to have an udev config file with renaming rules, so each peripheral gets a stable name in /dev .&lt;br /&gt;
The plan is also to create the udev config using some python: insert device X now -&amp;gt; write line to udev config.&lt;br /&gt;
&lt;br /&gt;
The udev config file is:&lt;br /&gt;
  /etc/udev/rules.d/99-usb-serial.rules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# LIDAR serial converter&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;10c4&amp;quot;, ATTRS{idProduct}==&amp;quot;ea60&amp;quot;, SYMLINK+=&amp;quot;ttyLIDAR&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
# quectel GPS&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;1a86&amp;quot;, ATTRS{idProduct}==&amp;quot;7523&amp;quot;, SYMLINK+=&amp;quot;ttyGPS&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
# ublox GPS&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;0403&amp;quot;, ATTRS{idProduct}==&amp;quot;6001&amp;quot;, SYMLINK+=&amp;quot;ttyGPS&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An USB-nano also appears to have a USB vendor/product id of 1a86/7523 (&amp;quot;USB2.0-Serial&amp;quot;) ... same as the quectel GPS?&lt;br /&gt;
&lt;br /&gt;
Same for &amp;quot;AI thinker&amp;quot; USB-serial: vendor/product id of 1a86/7523 (product: &amp;quot;USB2.0-Serial&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
To (re)load the properties:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo udevadm control --reload-rules&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== reading temperature sensor ===&lt;br /&gt;
The idea is to to use a DB18B20 temperature sensor, read it using an arduino nano board acting as a 1-wire adapter.&lt;br /&gt;
Use openwire-fs as user-side openwire software http://owfs.org&lt;br /&gt;
&lt;br /&gt;
Preparation:&lt;br /&gt;
* Add the regular user to the &#039;dialout&#039; group, so it can access serial ports&lt;br /&gt;
  sudo adduser &amp;lt;name&amp;gt; dialout&lt;br /&gt;
&lt;br /&gt;
Setting up the hardware:&lt;br /&gt;
* connect the DS18B20 to the connector board with the pull-ups&lt;br /&gt;
* wire the connector board to the arduino nano, see ...&lt;br /&gt;
* plug the arduino nano in the pi&lt;br /&gt;
&lt;br /&gt;
Setting up the software:&lt;br /&gt;
* Install openwire fs&lt;br /&gt;
  sudo apt install owfs&lt;br /&gt;
* Create the openwire fs mountpoint&lt;br /&gt;
  sudo mkdir /mnt/1wire&lt;br /&gt;
* Configure owfs, edit /etc/owfs.conf&lt;br /&gt;
  server: device = /dev/ttyUSB0&lt;br /&gt;
  mountpoint = /mnt/1wire&lt;br /&gt;
  allow_other&lt;br /&gt;
  (comment out the line with the FAKE devices)&lt;br /&gt;
* Configure systemd services&lt;br /&gt;
  sudo systemctl enable owserver owhttpd&lt;br /&gt;
  sudo systemctl disable owftpd&lt;br /&gt;
* Start the systemd service&lt;br /&gt;
  sudo systemctl start owserver owhttpd&lt;br /&gt;
* Check the logs&lt;br /&gt;
  sudo journalctl -xeu owserver -f&lt;br /&gt;
* Open a browser to view the web interface&lt;br /&gt;
  http://localhost:2121 or&lt;br /&gt;
  http://raspberrypi.local:2121&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Karaburan&amp;diff=35227</id>
		<title>Karaburan</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Karaburan&amp;diff=35227"/>
		<updated>2026-05-11T12:11:30Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
 |Name=Karaburan&lt;br /&gt;
 |Picture=karaburan.png&lt;br /&gt;
 |Omschrijving=Monitoring water quality&lt;br /&gt;
 |Status=In progress&lt;br /&gt;
 |Contact=bertrik&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Next steps ==&lt;br /&gt;
* &amp;lt;s&amp;gt;engage with PX4 community on getting a feel if this is useful to use and if so, how to get started&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;figure out how to duplicate an MQTT stream&amp;lt;/s&amp;gt; don&#039;t bother&lt;br /&gt;
* write python scripts&lt;br /&gt;
** &amp;lt;s&amp;gt;arduino turbidity&amp;lt;/s&amp;gt; don&#039;t bother&lt;br /&gt;
** &amp;lt;s&amp;gt;turbidity-to-mqtt&amp;lt;/s&amp;gt; maybe make this ROS module&lt;br /&gt;
** &amp;lt;s&amp;gt;HID-to-mqtt&amp;lt;/s&amp;gt; maybe make this ROS module&lt;br /&gt;
** position/velocity listener script: latitude, longitude, altitude, heading/bearing/track/whatever, velocity&lt;br /&gt;
* hook things into systemd / udev&lt;br /&gt;
* analoog in op de pi:&lt;br /&gt;
** https://elektronicavoorjou.nl/product/adc-pi/&lt;br /&gt;
** https://www.123materialen.com/products/zeer-nauwkeurige-ads1256-dac8552-ad-da-board-voor-raspberry-pi_1676153&lt;br /&gt;
** FreeJoy project&lt;br /&gt;
* UPS voor pi: https://elektronicavoorjou.nl/product/raspberry-pi-ups-hat/&lt;br /&gt;
* 1-wire stuff:&lt;br /&gt;
** 1-wire adapter emulation on an stm32: https://github.com/alitekin2fx/stm32_ds2480_emu&lt;br /&gt;
** owfs.org for easy interfacing with multiple 1-wire devices in a hierarchical way on linux&lt;br /&gt;
* Figure out the udev/hotplug mess, we probably need this because many of our peripherals use a serial port:&lt;br /&gt;
** in how many places can we store the udev renaming logic (config files)&lt;br /&gt;
** can we automate this, make it user friendlier, e.g. some kind of &amp;quot;insert device X now&amp;quot; script&lt;br /&gt;
&lt;br /&gt;
Check:&lt;br /&gt;
* https://www.rtvnoord.nl/natuur/1215705/vuilrobot-maakt-jachthaven-winschoten-schoon-beter-dan-met-een-schepnet&lt;br /&gt;
&lt;br /&gt;
=== USB HID as analog input ===&lt;br /&gt;
An stm32 based bluepill board can be flashed with firmware to allow its analog inputs to be exposed as USB HID sliders.&lt;br /&gt;
&lt;br /&gt;
Flashing the bluepill with openocd to the freejoy firmware:&lt;br /&gt;
* install openocd&lt;br /&gt;
  sudo apt install openocd&lt;br /&gt;
* connect an stlinkv2 to an stm32 bluepill, connect the stlinkv2 to USB&lt;br /&gt;
* flash the freejoy firmware as follows:&lt;br /&gt;
** download the firmware from https://github.com/FreeJoy-Team/FreeJoy&lt;br /&gt;
** create a symlink to the hex file called firmware.hex&lt;br /&gt;
** flash the firmware from the command line&lt;br /&gt;
  openocd -s /usr/share/openocd/scripts -f interface/stlink.cfg -f target/stm32f1x.cfg -c init -c &amp;quot;program firmware.hex verify reset exit&amp;quot;&lt;br /&gt;
* watch the kernel logs&lt;br /&gt;
  sudo dmesg -w&lt;br /&gt;
* connect the stm32 using a USB cable&lt;br /&gt;
* download the freejoy configurator from https://github.com/FreeJoy-Team/FreeJoyConfiguratorQt&lt;br /&gt;
* start the configurator and load the karaburan.cfg setting&lt;br /&gt;
* Write config to device -&amp;gt; it should reboot now and come up with the new settings&lt;br /&gt;
&lt;br /&gt;
Verify that it works:&lt;br /&gt;
* install the evtest package&lt;br /&gt;
* run&lt;br /&gt;
  evtest /dev/input/by-id/usb-FreeJoy_FreeJoy_v1.7.1-event-if00&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/vostrenkov/EazyJoy&lt;br /&gt;
&lt;br /&gt;
=== influxdb ===&lt;br /&gt;
See https://hub.docker.com/_/influxdb&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/karaburan/tree/master/influxdb&lt;br /&gt;
&lt;br /&gt;
=== ROS ===&lt;br /&gt;
Investigation:&lt;br /&gt;
* Use ROS 2, not the old ROS 1&lt;br /&gt;
* Cannot work comfortably with debian, works best with ubuntu&lt;br /&gt;
* Using gpsd:&lt;br /&gt;
** install ros-jazzy-desktop&lt;br /&gt;
** ros2 launch gpsd_client gpsd_client-launch.py&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Topics:&lt;br /&gt;
* air quality sensors&lt;br /&gt;
** ammonia&lt;br /&gt;
** NOx&lt;br /&gt;
* water chemical analysis&lt;br /&gt;
** nitrates&lt;br /&gt;
** ammonia&lt;br /&gt;
** dissolved oxygen&lt;br /&gt;
** sulfide/sulfate&lt;br /&gt;
** phosphates?&lt;br /&gt;
** salinity (chlorides?)&lt;br /&gt;
* water physical analysis&lt;br /&gt;
** temperature&lt;br /&gt;
** clarity/turbidity -&amp;gt; investigate standard ways of measuring/expressing this&lt;br /&gt;
** conductivity/total dissolved solids&lt;br /&gt;
** water properties by light reflection, hyperspectral/polarity&lt;br /&gt;
** depth?&lt;br /&gt;
* boat control&lt;br /&gt;
** trajectory -&amp;gt; steering&lt;br /&gt;
** idea: interface with the remote control, not with the boat&lt;br /&gt;
** idea: find a boat with easily hackable remote control protocol&lt;br /&gt;
** idea: can we get sensor data over this link too, e.g. GPS?&lt;br /&gt;
* camera control&lt;br /&gt;
* post-processing&lt;br /&gt;
** data presentation&lt;br /&gt;
*** video/photo stitching&lt;br /&gt;
*** time lapse view&lt;br /&gt;
*** map view of properties&lt;br /&gt;
* use cases&lt;br /&gt;
** verify with domain experts, how to engage?&lt;br /&gt;
** slootview, under/above water&lt;br /&gt;
** minimum viable prototype&lt;br /&gt;
** high-res measurement by location, by time&lt;br /&gt;
* materials&lt;br /&gt;
** boat selection&lt;br /&gt;
** processing platform selection&lt;br /&gt;
** communication platform selection&lt;br /&gt;
&lt;br /&gt;
== Investigate RTK GPS ==&lt;br /&gt;
Goal: figure out if it is practically possible to achieve cm resolution with a 200-euro GPS and a free correction service: YES&lt;br /&gt;
&lt;br /&gt;
* https://www.nsgi.nl/referentiepunten-en-gnss-data/gnss-data/real-time-streams public correction data service&lt;br /&gt;
* https://www.ardusimple.nl/rtk-in-5-minutes/&lt;br /&gt;
* RTK in action https://www.youtube.com/watch?v=Oc1LBFDj2MA&lt;br /&gt;
* Use with Linux / gpsd: https://stackoverflow.com/questions/77314115/drotek-gpsd-and-ntrip-correction-data-for-precise-positioning ?&lt;br /&gt;
* Chipsets&lt;br /&gt;
** Quectel LC29H (default: 115200 bps)&lt;br /&gt;
*** review: see https://rtklibexplorer.wordpress.com/2024/04/28/dual-frequency-rtk-for-less-than-60-with-the-quectel-lc29hea/&lt;br /&gt;
*** configuration: https://rtklibexplorer.wordpress.com/2024/05/06/configuring-the-quectel-lc29hea-receiver-for-real-time-rtk-solutions/&lt;br /&gt;
** uBLOX ZED-F9P&lt;br /&gt;
* Boards&lt;br /&gt;
** UM980 / UM982&lt;br /&gt;
&lt;br /&gt;
Edit /etc/default/gpsd, set GPSD_OPTIONS:&lt;br /&gt;
  GPSD_OPTIONS=&amp;quot;-Gn ntrip://user:pass@ntrip.kadaster.nl:2101/CBW100NLD0&amp;quot;&lt;br /&gt;
Option -G exposes the control socket on all network interfaces, option -n keeps the GPS active if there is no one currently connected.&lt;br /&gt;
&lt;br /&gt;
Plotting live location on a map:&lt;br /&gt;
* Configure gpsd to expose its socket to the outside world: last section of https://gpsd.gitlab.io/gpsd/troubleshooting.html&lt;br /&gt;
* In QGIS, press ctrl+0 to show the GPS information tab, enter the name of the remote gpsd (port 2947)&lt;br /&gt;
&lt;br /&gt;
Station at Stolwijk (close to Gouda): https://gnss1.tudelft.nl/dpga/station/Stolwijk.html#STWK ?&lt;br /&gt;
&lt;br /&gt;
Starting from the command line:&lt;br /&gt;
* stop gpsd.socket&lt;br /&gt;
  sudo systemctl stop gpsd.socket&lt;br /&gt;
* run from command line&lt;br /&gt;
  sudo /usr/sbin/gpsd -Gn -D 1 -N /dev/ttyUSB0 .... (not sure yet)&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
How to show that RTK GPS is actually accurate?&lt;br /&gt;
&lt;br /&gt;
* Relative positioning: with an &amp;quot;fix RTK&amp;quot; solution, place the antenna at 4 points 25cm apart, each point for 20 seconds or so -&amp;gt; you see 4 distinct clusters of points&lt;br /&gt;
* Positioning over short time: put it in a fixed location, make sure that it has &amp;quot;fix RTK&amp;quot; solution, take 100 measurements or so -&amp;gt; determine the radius of the circle that contains 90% of the points&lt;br /&gt;
* Positioning over longer time: do this for (say) an hour&lt;br /&gt;
* Absolute positioning: look up a national reference point, for example &amp;quot;RD-punt 389346&amp;quot;, located on the Sluisdijk between Gouda and Moordrecht. Technical data: https://www.nsgi.nl/iv-api/rdinfo/rdpoint/389346&lt;br /&gt;
** see https://www.nsgi.nl/referentiepunten-en-gnss-data/informatie-referentiepunten/rdinfo and enter 389346&lt;br /&gt;
** latitude: 51° 59&#039; 49,64048&amp;quot; , longitude: 4° 41&#039; 19,90765&amp;quot;, or 51.99712236/4.68886324&lt;br /&gt;
&lt;br /&gt;
==== Comparison with reference coordinate ====&lt;br /&gt;
On october 4th 2024, we took the RTK GPS to a kernnet reference point at 51.99712236/4.68886324, results below:&lt;br /&gt;
&lt;br /&gt;
From https://www.nsgi.nl/iv-api/rdinfo/rdpoint/389346:&lt;br /&gt;
* Year 2021: &amp;quot;51 59 49,64004&amp;quot;, &amp;quot;4 41 19,90584&amp;quot;, 48.039. In decimal degrees that is &lt;br /&gt;
&lt;br /&gt;
Differences between the reference point and the measurements are calculated to easting (&#039;X&#039;) and northing (&#039;Y&#039;), unit meter. To calculate distance in meters, we use a linear approximation:&lt;br /&gt;
* For dy: 40075km/360 = 111,319 m/deg&lt;br /&gt;
* For dx: dy * cos(latitude) = 68,549 m/deg&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Measurements + deviations&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Latitude !! Longitude !! dx (m) !! dy (m) !! absolute (m) !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| Reference 2012 || 51.99712236 || 4.68886324 || - || - || 0 || by definition&lt;br /&gt;
|-&lt;br /&gt;
| Reference 2021 || 51.99712223 || 4.68886273 || - || - || 0 || by definition&lt;br /&gt;
|-&lt;br /&gt;
| Screenshot 1 || 51.99712217 || 4.68886567 || 0.167 || -0.021 || 0.168 || - &lt;br /&gt;
|-&lt;br /&gt;
| Screenshot 2 || 51.99712200 || 4.68886533 || 0.143 || -0.040 || 0.149 || -&lt;br /&gt;
|-&lt;br /&gt;
| Meting 1 || 51.9971220 || 4.6888663 || 0.210 || -0.040 || 0.214 || -&lt;br /&gt;
|-&lt;br /&gt;
| Meting 2 || 51.9971222 || 4.6888660 || 0.189 || -0.018 || 0.190 || -&lt;br /&gt;
|-&lt;br /&gt;
| Average || - || - || 0.177 || -0.030 || 0.180 || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
According to [https://www.unavco.org/software/geodetic-utilities/plate-motion-calculator/plate-motion-calculator.html this page], the rate of movement is about&lt;br /&gt;
15.75mm/year to the north and 17.45 mm/year to the east (ITRF2020 model).&lt;br /&gt;
Over 12 years, that amounts to 0.189m north and 0.209m east.&lt;br /&gt;
&lt;br /&gt;
== Air quality sensors ==&lt;br /&gt;
&lt;br /&gt;
=== Nitrogen compounds in air ===&lt;br /&gt;
According to https://www.rivm.nl/stikstof/monitoren-advies-onderzoek/overzicht-stikstofmetingen/metingen-stikstof-in-de-lucht average (typical?) values of&lt;br /&gt;
* Ammonia (NH3): 6.7 ug/m3 (9.6 ppb)&lt;br /&gt;
* NOx: 27.3 ug/m3&lt;br /&gt;
* NO2: 18.6 ug/m3 (9.9 ppb)&lt;br /&gt;
&lt;br /&gt;
(ppb-conversion using https://www.breeze-technologies.de/blog/air-pollution-how-to-convert-between-mgm3-%C2%B5gm3-ppm-ppb/ )&lt;br /&gt;
&lt;br /&gt;
RIVM report on inexpensive nitrogen-in-air sensors: https://www.samenmeten.nl/sensoren-voor-no2&lt;br /&gt;
Conclusion: most sensors are not sensitive enough to be used in typical outdoor conditions, with perhaps one exception: alphasense NO2-B43F&lt;br /&gt;
&lt;br /&gt;
== Sonar sensors ==&lt;br /&gt;
Investigate this because it allows us to measure depth.&lt;br /&gt;
&lt;br /&gt;
AliExpress has several types of affordable sonar sensors, focused at detecting fish, but also able to measure depth.&lt;br /&gt;
&lt;br /&gt;
I ordered this one: https://nl.aliexpress.com/item/1005006388343879.html&lt;br /&gt;
* 125 kHz main frequency, range up to 200 ft deep (about 60m)&lt;br /&gt;
* bluetooth low-power interface (basically serial-over-BLE)&lt;br /&gt;
* built-in battery, powers on automatically when submerged&lt;br /&gt;
* reports 120-element array with raw sonar return intensity-vs-depth&lt;br /&gt;
* measures water temperature&lt;br /&gt;
* about 45 euro&lt;br /&gt;
&lt;br /&gt;
Fish helper pro application for android https://apkpure.com/fish-helper-pro/com.fishfinderpro.xdx&lt;br /&gt;
&lt;br /&gt;
=== Debug tool ===&lt;br /&gt;
I wrote a python script to connect to it from a linux computer: https://github.com/bertrik/wireless-sonar-sensor&lt;br /&gt;
&lt;br /&gt;
It&#039;s connects to a &amp;quot;Fish Helper Pro&amp;quot; wireless sonar sensor over bluetooth low-energy, reports depth and temperature&lt;br /&gt;
&lt;br /&gt;
=== ROS2 integration ===&lt;br /&gt;
The most appropriate message for a simple range would be: https://docs.ros2.org/foxy/api/sensor_msgs/msg/Range.html&lt;br /&gt;
&lt;br /&gt;
There are other messages to perhaps report the raw echo return array.&lt;br /&gt;
&lt;br /&gt;
== Water physical analysis ==&lt;br /&gt;
=== Turbidity / clarity ===&lt;br /&gt;
See https://en.wikipedia.org/wiki/Turbidity&lt;br /&gt;
&lt;br /&gt;
Aliexpress sensor &#039;&#039;&#039;TS-300B&#039;&#039;&#039;: https://nl.aliexpress.com/item/1005006732956937.html&lt;br /&gt;
Has a range 0 ~ 1000 ± 30 NTU&lt;br /&gt;
&lt;br /&gt;
Order of magnitude for turbidity:&lt;br /&gt;
* Drinking water upper limit: &#039;&#039;&#039;4 NTU&#039;&#039;&#039; (European turbidity standard for drinking water)&lt;br /&gt;
* Ambient water: 10-150 NTU. The US state of Washington use a &amp;quot;background&amp;quot; value of &#039;&#039;&#039;50 NTU&#039;&#039;&#039; as reference.&lt;br /&gt;
&lt;br /&gt;
(see https://en.wikipedia.org/wiki/Turbidity#Standards_and_test_methods )&lt;br /&gt;
&lt;br /&gt;
So the Aliexpress sensor is suited only for &amp;quot;dirty&amp;quot; water.&lt;br /&gt;
&lt;br /&gt;
=== Water measurement probes ===&lt;br /&gt;
* https://nl.aliexpress.com/item/1005003784454381.html BLE-9908 Inexpensie &amp;quot;Yieryi&amp;quot; PH/EC/Temp probe with bluetooth and app, about E25,- (Uses 3x LR44 coin cell batteries)&lt;br /&gt;
* Several different models: https://nl.aliexpress.com/item/1005007810989801.html&lt;br /&gt;
** EZ9901: TDS/pH/temp&lt;br /&gt;
** EZ9902: EC/pH/temp&lt;br /&gt;
** EZ9908: EC/TDS/pH/temp&lt;br /&gt;
** EZ9909: TDS/EC/pH/salt/temp&lt;br /&gt;
* The bluetooth versions are probably as above, with numbers like BLE9902 and BLE9908&lt;br /&gt;
* Yiery BLE9902: https://shop.yieryimeters.com/products/yieryi-ble-9902-3-in-1-digital-ph-meter-with-bluetooth-ec-and-temperature-measurement-ideal-for-water-quality-testing-in-pools-fish-tanks-hydroponics-more&lt;br /&gt;
* BLE-EC01 is a bluetooth EC meter, can find it here https://www.amazon.com/BLE-EC01-Smart4-TDS-Temp-Meter/dp/B0DPZZC7BV, not on AliExpress?&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Some probes indicate EC (electrical conductivity), other indicate TDS (total dissolved liquids). TDS is derived from EC (knowing the liquid type). EC is the more universal/fundamental property!&lt;br /&gt;
* EC is typically expressed in uS/cm or mS/cm (micro or milli siemens per centimeter), say 500 uS/cm for outdoor water.&lt;br /&gt;
* EC is temperature dependent, typically you need the value extrapolated to 25 degrees Celcius. Temperature-EC correlation rule of thumb: about 2% more conductive per K.&lt;br /&gt;
* pH sensors are almost by definition fragile and last only a limited time, so probably don&#039;t bother trying to use one at all. The pH of outdoor water might not be that interesting to measure.&lt;br /&gt;
* I expect the non-TuYa meters to use an easier to handle bluetooth protocol, avoiding the need for complicated encryption with a key that can only be fetched for a limited time using a tuya developer account.&lt;br /&gt;
&lt;br /&gt;
==== BT785 ====&lt;br /&gt;
I bought this one: Tuya compatible BT785 EC meter: https://nl.aliexpress.com/i/1005007462079781.html inexpensive, focused on EC, runs on 4x LR44.&lt;br /&gt;
Speaks the TuYa protocol (requires a secret key that you can fetch through the developer console).&lt;br /&gt;
This is quite cumbersome: you have to register as a developer, fetch the key before time runs out and developer access is limited.&lt;br /&gt;
&lt;br /&gt;
Does NOT speak the universal serialport access protocol as described here:&lt;br /&gt;
https://developer.tuya.com/en/docs/iot/tuya-cloud-universal-serial-port-access-protocol?id=K9hhi0xxtn9cb&lt;br /&gt;
&lt;br /&gt;
==== Cheap non-bluetooth EC/TDS ====&lt;br /&gt;
I got this one: https://nl.aliexpress.com/item/1005007267608479.html&lt;br /&gt;
&lt;br /&gt;
Tear-down on hackaday: https://hackaday.io/project/184764-ectds-temp-meter-teardown&lt;br /&gt;
&lt;br /&gt;
== Boat control ==&lt;br /&gt;
Typically the wireless link looks like this:&lt;br /&gt;
* 2.4 GHz working frequency&lt;br /&gt;
* 500m range&lt;br /&gt;
&lt;br /&gt;
Interesting links:&lt;br /&gt;
* Flytec-2011 remote control https://nl.aliexpress.com/item/1005002984723718.html&lt;br /&gt;
* Replacement board for various boats with &amp;quot;18&amp;quot; in their type number: https://nl.aliexpress.com/item/1005006115484716.html&lt;br /&gt;
* DIY Multi-protocol module: https://github.com/pascallanger/DIY-Multiprotocol-TX-Module&lt;br /&gt;
&lt;br /&gt;
=== remote control ===&lt;br /&gt;
Image of remote control RF chip:&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
Parts:&lt;br /&gt;
* 12.000 MHz crystal/oscillator&lt;br /&gt;
* 16-pin control chip: 20_CL6L071&lt;br /&gt;
* 6-pin RF chip: 1110 / VKA3, could be an rx/tx switch, amplifier or filter circuit&lt;br /&gt;
&lt;br /&gt;
See also: https://www.open-tx.org/&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* map out the connections between the mainboard and the rf board, expected: VCC, GND, spi ?&lt;br /&gt;
&lt;br /&gt;
== Use cases ==&lt;br /&gt;
material:&lt;br /&gt;
* https://www.youtube.com/watch?v=cMk0bGvIU1E&lt;br /&gt;
* https://iplo.nl/thema/water/oppervlaktewater/kaderrichtlijn-water&lt;br /&gt;
* kaartje: https://krw-nutrend.netlify.app/ -&amp;gt; 2 meetpunten op de reeuwijkse plassen, tijdresolutie is 1 jaar?&lt;br /&gt;
&lt;br /&gt;
Useful distinction, typically used in documents/guidelines:&lt;br /&gt;
* chemical quality, what substances are present in the water?&lt;br /&gt;
* biological / ecology quality, what kind of living organisms live in the water?&lt;br /&gt;
&lt;br /&gt;
=== Reeuwijkse plassen ===&lt;br /&gt;
See&lt;br /&gt;
* https://www.rijnland.net/wat-doet-rijnland/in-uw-buurt/reeuwijkse-plassen/ their stated goal: CLEAR WATER&lt;br /&gt;
* https://www.rijnland.net/regels-op-een-rij/subsidies-en-andere-financi%C3%ABle-bijdragen/&lt;br /&gt;
&lt;br /&gt;
potential applications:&lt;br /&gt;
* inspect water sides (oever) over time&lt;br /&gt;
* underwater camera: detect invasive cray fish&lt;br /&gt;
* sample water properties at high spatial resolution, high time resolution&lt;br /&gt;
* early detection of indicators for cyanobacteria: temperature and nutrients&lt;br /&gt;
&lt;br /&gt;
=== Detect/find pollution source ===&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== udev handling of serial ports ===&lt;br /&gt;
Many peripheral devices are connected through serial.&lt;br /&gt;
The plan is to have an udev config file with renaming rules, so each peripheral gets a stable name in /dev .&lt;br /&gt;
The plan is also to create the udev config using some python: insert device X now -&amp;gt; write line to udev config.&lt;br /&gt;
&lt;br /&gt;
The udev config file is:&lt;br /&gt;
  /etc/udev/rules.d/99-usb-serial.rules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# LIDAR serial converter&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;10c4&amp;quot;, ATTRS{idProduct}==&amp;quot;ea60&amp;quot;, SYMLINK+=&amp;quot;ttyLIDAR&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
# quectel GPS&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;1a86&amp;quot;, ATTRS{idProduct}==&amp;quot;7523&amp;quot;, SYMLINK+=&amp;quot;ttyGPS&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
# ublox GPS&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;0403&amp;quot;, ATTRS{idProduct}==&amp;quot;6001&amp;quot;, SYMLINK+=&amp;quot;ttyGPS&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An USB-nano also appears to have a USB vendor/product id of 1a86/7523 (&amp;quot;USB2.0-Serial&amp;quot;) ... same as the quectel GPS?&lt;br /&gt;
&lt;br /&gt;
Same for &amp;quot;AI thinker&amp;quot; USB-serial: vendor/product id of 1a86/7523 (product: &amp;quot;USB2.0-Serial&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
To (re)load the properties:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo udevadm control --reload-rules&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== reading temperature sensor ===&lt;br /&gt;
The idea is to to use a DB18B20 temperature sensor, read it using an arduino nano board acting as a 1-wire adapter.&lt;br /&gt;
Use openwire-fs as user-side openwire software http://owfs.org&lt;br /&gt;
&lt;br /&gt;
Preparation:&lt;br /&gt;
* Add the regular user to the &#039;dialout&#039; group, so it can access serial ports&lt;br /&gt;
  sudo adduser &amp;lt;name&amp;gt; dialout&lt;br /&gt;
&lt;br /&gt;
Setting up the hardware:&lt;br /&gt;
* connect the DS18B20 to the connector board with the pull-ups&lt;br /&gt;
* wire the connector board to the arduino nano, see ...&lt;br /&gt;
* plug the arduino nano in the pi&lt;br /&gt;
&lt;br /&gt;
Setting up the software:&lt;br /&gt;
* Install openwire fs&lt;br /&gt;
  sudo apt install owfs&lt;br /&gt;
* Create the openwire fs mountpoint&lt;br /&gt;
  sudo mkdir /mnt/1wire&lt;br /&gt;
* Configure owfs, edit /etc/owfs.conf&lt;br /&gt;
  server: device = /dev/ttyUSB0&lt;br /&gt;
  mountpoint = /mnt/1wire&lt;br /&gt;
  allow_other&lt;br /&gt;
  (comment out the line with the FAKE devices)&lt;br /&gt;
* Configure systemd services&lt;br /&gt;
  sudo systemctl enable owserver owhttpd&lt;br /&gt;
  sudo systemctl disable owftpd&lt;br /&gt;
* Start the systemd service&lt;br /&gt;
  sudo systemctl start owserver owhttpd&lt;br /&gt;
* Check the logs&lt;br /&gt;
  sudo journalctl -xeu owserver -f&lt;br /&gt;
* Open a browser to view the web interface&lt;br /&gt;
  http://localhost:2121 or&lt;br /&gt;
  http://raspberrypi.local:2121&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35224</id>
		<title>User:Bertrik Sikken</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35224"/>
		<updated>2026-05-07T12:01:44Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Project ideas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Smoel&lt;br /&gt;
 |Name=Bertrik Sikken&lt;br /&gt;
 |Nick=bertrik&lt;br /&gt;
 |Tagline=heb ik niet&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You can reach me at [mailto:bertrik@sikken.nl bertrik@sikken.nl] or [mailto:bertrik@gmail.com bertrik@gmail.com].&lt;br /&gt;
&lt;br /&gt;
Studied Electrical Engineering at Twente University.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Main interests:&lt;br /&gt;
* reverse-engineering things (USB stuff, mp3 players), worked on http://rockbox.org (sansa clip players)&lt;br /&gt;
* studying bats and making electronics for recording/listening to bat sounds&lt;br /&gt;
* radio stuff, in particular software-defined radio, LoRa networks&lt;br /&gt;
* citizen science and open data (particulate matter measurement, noise, water quality)&lt;br /&gt;
* energy-related stuff, visualisation&lt;br /&gt;
&lt;br /&gt;
Projects I work(ed) on ([https://revspace.nl/index.php?title=User:Bertrik_Sikken&amp;amp;action=purge refresh]):&lt;br /&gt;
{{#ask:[[Category:Project]][[Project Contact::bertrik]]&lt;br /&gt;
|?Project Status&lt;br /&gt;
|headers=show&lt;br /&gt;
|link=all&lt;br /&gt;
|order=ASC,ASC&lt;br /&gt;
|sort=Project Status,Project Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project ideas ==&lt;br /&gt;
[[File:always10oclock.jpg|right]]&lt;br /&gt;
[[File:idea.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas I&#039;m thinking about, but have not fully developed into an actual project yet.&lt;br /&gt;
&lt;br /&gt;
https://pine64.com/product/128mb-ox64-sbc-available-on-december-2-2022/&lt;br /&gt;
=== LilyGo T-Radar ===&lt;br /&gt;
https://developer.acconeer.com/home/a121-docs-software/a121-esp32&lt;br /&gt;
&lt;br /&gt;
=== Action 32x32 display ===&lt;br /&gt;
Action sells [https://www.action.com/nl-nl/p/3217439/led-pixelbord/ this ACT1026 display]. You control it over BLE.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Pupariaa/Bk-Light-AppBypass works to control it&lt;br /&gt;
* software for a similar led display: https://github.com/derkalle4/python3-idotmatrix-client&lt;br /&gt;
&lt;br /&gt;
=== investigate thread/matter ===&lt;br /&gt;
Matter/thread is the new IKEA standard for home automation thins apparently. &lt;br /&gt;
Thread is the wireless protocol, matter is a home automation protocol running on top of thread.&lt;br /&gt;
&lt;br /&gt;
I have a couple of nrf52840, these are good in doing thread.&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* check out openthread&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/openthread/openthread.git&lt;br /&gt;
cd openthread&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Prepare development environment:&lt;br /&gt;
  scripts/bootstrap&lt;br /&gt;
* Build it:&lt;br /&gt;
  ./script/build nrf52840 UART_trans -DOT_LOG_LEVEL=OT_LOG_LEVEL_INFO&lt;br /&gt;
&lt;br /&gt;
Thread on ESP32:&lt;br /&gt;
* on ESP32 C6 https://gist.github.com/gtxaspec/d26198daadfb0a8b0a0edeae2d3fd58f&lt;br /&gt;
* https://github.com/espressif/esp-thread-br&lt;br /&gt;
* https://github.com/espressif/esp-idf/tree/master/examples/openthread/ot_rcp&lt;br /&gt;
&lt;br /&gt;
=== action lsc stekker ===&lt;br /&gt;
https://keetsupport.nl/2024/03/20/how-to-flash-lsc-power-plug-with-esphome/&lt;br /&gt;
&lt;br /&gt;
https://community.home-assistant.io/t/detailed-guide-on-how-to-flash-the-new-tuya-beken-chips-with-openbk7231t/437276&lt;br /&gt;
&lt;br /&gt;
=== sipeed maix dock ===&lt;br /&gt;
Bought this a couple of years ago. Get familiar with this board.&lt;br /&gt;
Can I run a chess program on this, for example?&lt;br /&gt;
&lt;br /&gt;
* https://wiki.sipeed.com/soft/maixpy/en/develop_kit_board/maix_dock.html&lt;br /&gt;
&lt;br /&gt;
=== rfid keyfob ===&lt;br /&gt;
* aliexpress page: https://nl.aliexpress.com/item/1005009569496736.html&lt;br /&gt;
* firmware github: &lt;br /&gt;
** https://github.com/RfidResearchGroup/ChameleonUltra&lt;br /&gt;
** https://github.com/GameTec-live/ChameleonUltraGUI&lt;br /&gt;
&lt;br /&gt;
=== advanced lidars for bat detection ===&lt;br /&gt;
livox:&lt;br /&gt;
* github page https://github.com/Livox-SDK/Livox-SDK/tree/master&lt;br /&gt;
* web page: https://www.livoxtech.com/&lt;br /&gt;
&lt;br /&gt;
=== cubecell meshtastic motion detector ===&lt;br /&gt;
I have a cubecell AB01 board.&lt;br /&gt;
This board is focused on low power, has a connection to attach a solar panel and has a lora radio.&lt;br /&gt;
Relatively small amount of RAM, barely enough to run a LoRaWAN stack but probably plenty to run meshtastic&lt;br /&gt;
&lt;br /&gt;
The plan is to build a simple motion detector from this (using a PIR).&lt;br /&gt;
The PIR can wake up the board from low-power, or a timer can wake it periodically.&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/HelTecAutomation/CubeCell-Arduino/tree/master/libraries/Basics/examples/LowPower&lt;br /&gt;
&lt;br /&gt;
=== configure multitech outdoor gateway ===&lt;br /&gt;
https://www.multitech.net/developer/products/multiconnect-conduit-platform/basestation/&lt;br /&gt;
&lt;br /&gt;
https://multitech.com/product/multitech-conduit-mtcdt-246a-868-eu-gb/&lt;br /&gt;
&lt;br /&gt;
emergency procedure:&lt;br /&gt;
https://www.multitech.net/developer/software/mlinux/using-mlinux/flashing-mlinux-firmware-for-conduit/&lt;br /&gt;
&lt;br /&gt;
=== esp32 wtf ===&lt;br /&gt;
* https://forum.arduino.cc/t/ttgo-lilygo-lora-esp32-26mhz-problem/1353750&lt;br /&gt;
* &amp;quot;26 MHz crystal has been deprecated&amp;quot; https://github.com/espressif/arduino-esp32/issues/10117&lt;br /&gt;
&lt;br /&gt;
=== kakofonie counter ===&lt;br /&gt;
Sample room audio, use neural network to distinguish voices to estimate number of people talking in the past 30 seconds or so.&lt;br /&gt;
Show this number on some kind of display, publish it to MQTT, make a nice graph of it.&lt;br /&gt;
&lt;br /&gt;
Stuff to figure out:&lt;br /&gt;
* this is called &#039;speaker diarization&#039;&lt;br /&gt;
* can it run on an ESP32?&lt;br /&gt;
* make a prototype&lt;br /&gt;
&lt;br /&gt;
=== hypno toad ===&lt;br /&gt;
Put these LEDS https://nl.aliexpress.com/item/1005007583528891.html into https://www.action.com/nl-nl/p/2560347/solar-tuinbeeldje/&lt;br /&gt;
&lt;br /&gt;
Turns out that the default circuit is really basic and output a rough step-up waveform to the LED.&lt;br /&gt;
The self-fading LEDs don&#039;t work very well with that.&lt;br /&gt;
&lt;br /&gt;
Also, putting some IPA on hotglue makes it release really easy.&lt;br /&gt;
&lt;br /&gt;
=== wasbeer / kat classifier ===&lt;br /&gt;
ESP32 with resnet50 neural net to distinguish house cats from other animals, see also:&lt;br /&gt;
* https://ieeexplore.ieee.org/document/10556848/&lt;br /&gt;
&lt;br /&gt;
=== Nespresso brew counter ===&lt;br /&gt;
Several hacker spaces have one of these Nespresso cup coffee makers, but there&#039;s no obvious easy way to monitor usage (monitor ALL the things!).&lt;br /&gt;
Inspired by https://hackaday.com/2021/04/25/arduino-mkr-makes-nespresso-monitoring-easy/ this idea is making an even simpler nespresso monitor,&lt;br /&gt;
using an inexpensive WiFi enabled ESP8266 with an ubiquitous I2S microphone such as the INMP441. &lt;br /&gt;
&lt;br /&gt;
Use this sound monitoring project:&lt;br /&gt;
https://github.com/aleiei/ESP8266-BUG-I2S-MIC&lt;br /&gt;
and turn it into a WiFi connected brew counter.&lt;br /&gt;
&lt;br /&gt;
Software for getting microphone data from an ESP8266/I2S mic into Linux https://github.com/bertrik/EspMicServer&lt;br /&gt;
Nespresso sound is typically 50 Hz with overtones.&lt;br /&gt;
In a recording with the ESP8266, it appears that oddly the 17th harmonic (around 850 Hz) is quite strong.&lt;br /&gt;
&lt;br /&gt;
The plan in the short term is this:&lt;br /&gt;
* apply a gentle IIR filter to subtract any DC bias from the microphone signal&lt;br /&gt;
* calculate autocovariance at offsets 0 and 20 ms (inverse of 50 Hz), representing the total energy and the energy at 50 Hz respectively&lt;br /&gt;
* compare amplitudes to decide about presence of 50 Hz signal, e.g. calculate ratio in dB&lt;br /&gt;
* use this to count the length of time that a 50 Hz signal is heard (increments of 100 ms or so)&lt;br /&gt;
* decide about none / espresso / lungo based on time&lt;br /&gt;
&lt;br /&gt;
Might even integrate with esphome / home assistant later.&lt;br /&gt;
&lt;br /&gt;
=== Remote bat box monitor ===&lt;br /&gt;
Idea:&lt;br /&gt;
* goal: check if remote bat boxes are occupied and identify the species&lt;br /&gt;
* challenges:&lt;br /&gt;
** connectivity: need to transport images/videos (no LoRaWAN), possibly out of range of mobile data networks&lt;br /&gt;
** autonomy: cannot reach the bat box once installed&lt;br /&gt;
** power: no fixed power connection, so probably needs a battery + solar panel&lt;br /&gt;
* design&lt;br /&gt;
** wake up every hour, take a picture, go to sleep, upload photos/videos once per day&lt;br /&gt;
** run from batteries, recharge by solar, rules of thumb&lt;br /&gt;
*** batteries should last for about 10 days&lt;br /&gt;
*** battery should be able to charge in 1 day&lt;br /&gt;
*** consider only 10% of peak solar power&lt;br /&gt;
** KPN &amp;quot;4G-op-zee&amp;quot; somewhat confusing article: https://www.kpn.com/zakelijk/mobiel/roaming/noordzee&lt;br /&gt;
* hardware&lt;br /&gt;
** main processor: raspberry pi zero&lt;br /&gt;
*** raspberry pi power consumption overview: https://www.pidramble.com/wiki/benchmarks/power-consumption&lt;br /&gt;
** this hat to wake up the main CPU: https://www.waveshare.com/wiki/Power_Management_HAT_(B) sold at https://www.kiwi-electronics.com/en/power-management-hat-for-raspberry-pi-with-rtc-and-rp2040-mcu-11373&lt;br /&gt;
&lt;br /&gt;
=== KNMI API ===&lt;br /&gt;
Get familiar with https://developer.dataplatform.knmi.nl/open-data-api&lt;br /&gt;
&lt;br /&gt;
=== Grid frequency measurer with web page ===&lt;br /&gt;
See https://github.com/bertrik/GridFrequency&lt;br /&gt;
SSE source is gridfrequency.local/events&lt;br /&gt;
&lt;br /&gt;
=== WeAct CH55x board ===&lt;br /&gt;
Cheap little boards, using a similar chip as used in USB-serial converters.&lt;br /&gt;
&lt;br /&gt;
The hardware&lt;br /&gt;
https://github.com/WeActStudio/WeActStudio.CH552CoreBoard&lt;br /&gt;
&lt;br /&gt;
Flashing it:&lt;br /&gt;
https://hackaday.io/page/137447-flashing-the-ch552-dev-board-from-the-command-line&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://hackaday.io/project/198238-more-weact-ch5xx&lt;br /&gt;
* https://community.platformio.org/t/manually-adding-support-for-ch55x-controller-by-adding-existing-ardunio-core/41138&lt;br /&gt;
&lt;br /&gt;
=== Zigbee device with esp32 ===&lt;br /&gt;
See https://github.com/P-R-O-C-H-Y/arduino-esp32/blob/8169a434c3e46e1bb7711ebcc04f27267db2093c/libraries/ESP32/examples/Zigbee/Zigbee_Light_Bulb/Zigbee_Light_Bulb.ino&lt;br /&gt;
&lt;br /&gt;
See https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Zigbee&lt;br /&gt;
&lt;br /&gt;
Espressif32 arduino platform git: https://github.com/platformio/platform-espressif32&lt;br /&gt;
&lt;br /&gt;
=== Cameratoezicht in Gouda ===&lt;br /&gt;
Gemeente Gouda publiceert een lijst van camera&#039;s in Gouda, zie&lt;br /&gt;
https://gis.gouda.nl/nl/app/Basisviewer_open#!eAGT8uRiNBRy4ZIRYFKSyKkssjJwdzFxNDMz8TKKsLC0cnb0dQ1y5FIByirgkg3xd43ydPYIAQBXGBFm&lt;br /&gt;
&lt;br /&gt;
Aanmelden (semi-automatisch) bij bijvoorbeeld [https://mapcomplete.org/surveillance Surveillance-under-surveillance] ?&lt;br /&gt;
&lt;br /&gt;
=== SolarEdge ===&lt;br /&gt;
Interact with the solar edge api for PV installations.&lt;br /&gt;
&lt;br /&gt;
https://developers.solaredge.com/&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/solaredge-api&lt;br /&gt;
&lt;br /&gt;
=== Stookalert ===&lt;br /&gt;
Idee: gekleurd lampje dat aangeeft of er op dit moment een stookalert actief is&lt;br /&gt;
&lt;br /&gt;
Implementatie:&lt;br /&gt;
* kijk m.b.v. WiFi locatieservice in welke provincie je je bevindt&lt;br /&gt;
* haal JSON op bij https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* toon de bijbehorende kleur op het lampje&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
* Officiele pagina: https://www.atlasleefomgeving.nl/stookwijzer&lt;br /&gt;
* Achterliggende JSON met toestand per provincie: https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* Er moet ook nog ergens een API zijn die fijnmaziger aangeeft wat de toestand is ...&lt;br /&gt;
&lt;br /&gt;
=== Display of current electricity usage ===&lt;br /&gt;
I have a [https://www.zuidwijk.com/product/slimmelezer-plus/ slimme lezer] connected to the P1 port of my smart electricity meter.&lt;br /&gt;
The default firmware exposes meter readings using an event stream (SSE) at http://slimmelezer.local/events&lt;br /&gt;
&lt;br /&gt;
So for example, you can read this with curl:&lt;br /&gt;
  curl http://slimmelezer.local/events&lt;br /&gt;
With result:&lt;br /&gt;
  event: state&lt;br /&gt;
  data: {&amp;quot;id&amp;quot;:&amp;quot;sensor-power_consumed_phase_1&amp;quot;,&amp;quot;value&amp;quot;:0.046,&amp;quot;state&amp;quot;:&amp;quot;0.046 kW&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Specification of SSE: https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
&lt;br /&gt;
What I would like to do is to read these events and control a simple display to display  the current usage number.&lt;br /&gt;
&lt;br /&gt;
=== Participating in ultrasonic sound project ===&lt;br /&gt;
https://bat-migration-europe.netlify.app/project/&lt;br /&gt;
&lt;br /&gt;
Use an audiomoth for this.&lt;br /&gt;
&lt;br /&gt;
=== ESP32 C3 ===&lt;br /&gt;
* [https://www.espressif.com/en/products/socs/esp32-c3 processor page]&lt;br /&gt;
* [https://wiki.luatos.com/chips/esp32c3/index.html luatos basic esp32 c3 board]&lt;br /&gt;
&lt;br /&gt;
=== Flexible LED ticker ===&lt;br /&gt;
Ordered a flexible 32x8 RGB LED display:&lt;br /&gt;
https://nl.aliexpress.com/item/4001296811800.html&lt;br /&gt;
&lt;br /&gt;
Matching diffuser to be 3D printed:&lt;br /&gt;
https://www.thingiverse.com/thing:1903744&lt;br /&gt;
&lt;br /&gt;
=== Washing machine API ===&lt;br /&gt;
https://tratt.net/laurie/blog/2023/displaying_my_washing_machines_remaining_time_with_curl_jq_pizauth.html&lt;br /&gt;
&lt;br /&gt;
=== TinyML ===&lt;br /&gt;
Investigate TinyML, see https://www.tinyml.org/&lt;br /&gt;
Apparently can run on a RP2040 (raspi pi pico).&lt;br /&gt;
&lt;br /&gt;
https://www.hackster.io/mjrobot/esp32-cam-tinyml-image-classification-fruits-vs-veggies-4ab970&lt;br /&gt;
&lt;br /&gt;
=== Bat box busy signal ===&lt;br /&gt;
My brother built little pyramid &#039;blinkies&#039;: solar cell + Lithium-supercapacitor + harvesting circuit + LED encased in clear expoxy.&lt;br /&gt;
&lt;br /&gt;
Can we add a low-power PIR sensor to this, and make a blinky that blinks if movement was detected by the PIR in the past hour?&lt;br /&gt;
&lt;br /&gt;
=== Super tiny RFID ===&lt;br /&gt;
See https://www.sparkfun.com/products/16464 an almost sand grain size RFID chip, 1.25mmx1.25mmx0.55mm&lt;br /&gt;
&lt;br /&gt;
The accompanying reader &amp;quot;M6E Nano&amp;quot; is still quite expensive at $235.95 : https://www.sparkfun.com/products/14066&lt;br /&gt;
&lt;br /&gt;
Uses the MuRata LXMSJZNCMF-198:&lt;br /&gt;
&amp;quot;This product can be used as an ultra small tag and this can be&lt;br /&gt;
fit on any metal objects, non-metal objects, as well as&lt;br /&gt;
embedding into any objects by glue or adhesive and so on.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See also: ISO18000-63 and EPC global Gen2(v2)&lt;br /&gt;
&lt;br /&gt;
Specification:&lt;br /&gt;
* https://www.gs1.org/standards/rfid/uhf-air-interface-protocol&lt;br /&gt;
&lt;br /&gt;
=== TheThingsNetwork-Sondehub bridge ===&lt;br /&gt;
Uploads balloon telemetry to sondehub.&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/ttnhabbridge/issues/6&lt;br /&gt;
&lt;br /&gt;
=== Actually smart boiler ===&lt;br /&gt;
The boiler for hot water is about half of my electricity bill.&lt;br /&gt;
The idea is to use/build a smart switch that switches it on at time when electricity prices are lowest.&lt;br /&gt;
&lt;br /&gt;
Currently have a &amp;quot;Slimme boiler module&amp;quot; from Eneco, which is *not* actually smart,&lt;br /&gt;
since it allows me no control whatsoever when it switches on (besides cutting the power in the meterkast).&lt;br /&gt;
For example, it will switch on mid-day when my price is high and eneco&#039;s price is low, perhaps good for Eneco, not for me. &lt;br /&gt;
Apparently, they even received a [https://nieuws.eneco.nl/slim-apparaatje-bij-boiler-vangt-pieken-wind--en-zonnestroom-op/ subsidy] for this.&lt;br /&gt;
&lt;br /&gt;
A boiler is a pretty big load, about 3 kW, but it is not inductive.&lt;br /&gt;
&lt;br /&gt;
Alternatives:&lt;br /&gt;
* https://www.shelly.cloud/en-nl/products/product-overview/shelly-plus-1-pm-2-pack/shelly-plus-1-pm&lt;br /&gt;
* https://www.solyxenergy.nl/solar-iboost/ to store excess solar energy in hot water, might also be useful for just controlling a boiler to use cheaper rates&lt;br /&gt;
* tuya smartplug, like https://www.wifilampkoning.nl/merken-slimme-verlichting/tuya/tuya-enkele-smartplug-met-energiemeting ?&lt;br /&gt;
* tuya 20A smart plug: https://nl.aliexpress.com/item/1005003347568206.html&lt;br /&gt;
&lt;br /&gt;
=== Receiving gas meters ===&lt;br /&gt;
Apparently gas meters send gas consumption data to the slimme meter using a wireless link in the 868 MHz band.&lt;br /&gt;
Probably just FSK at 38.4, as mentioned here: https://a35.veron.nl/nieuwe-elektra-en-gasmeters/&lt;br /&gt;
&lt;br /&gt;
Interesting leads:&lt;br /&gt;
* https://github.com/stef/smeter&lt;br /&gt;
* https://www.rtl-sdr.com/reading-household-wireless-utility-meters-with-an-rtl-sdr-and-plotting-the-data-in-home-automation-software/&lt;br /&gt;
* https://github.com/bemasher/rtlamr&lt;br /&gt;
&lt;br /&gt;
=== Multi-network wifi manager ===&lt;br /&gt;
Figure out or create software so that ESP8266/ESP32 wifi manager can use multiple networks to connect (not just one),&lt;br /&gt;
so it allowing storing credentials for more than one network. For example, the network at home, the hacker space, at work.&lt;br /&gt;
Instead of reconfiguring the wifi manager for each network, you just *add* your credentials (and the existing credentials&lt;br /&gt;
are not replaced).&lt;br /&gt;
&lt;br /&gt;
See https://github.com/folkertvanheusden/M.A.X.X&lt;br /&gt;
&lt;br /&gt;
Interesting candidates:&lt;br /&gt;
* https://registry.platformio.org/libraries/martinverges/ESP32%20Wifi%20Manager wifi manager for ESP32, has a REST API for managing wifi network, but is incomplete in the sense that you need to write your own code (e.g. javascript) to actually *use* its API&lt;br /&gt;
* https://github.com/arduino-libraries/Arduino_MultiWiFi is the arduino multi wifi library, to allow connecting to multiple different WiFi networks, but it is not a wifi manager, that starts a captive portal, etc&lt;br /&gt;
&lt;br /&gt;
=== Automated bat counting ===&lt;br /&gt;
Can we automatically count the number of bats from the image of a webcam mounted in a bat colony?&lt;br /&gt;
Perhaps using some kind of AI or machine learning algorithm?&lt;br /&gt;
&lt;br /&gt;
The image in question:&lt;br /&gt;
https://stofradar.nl/coenecoop/&lt;br /&gt;
&lt;br /&gt;
=== Use TheThingsIndoorGateway as Helium/ThingSix hotspot ===&lt;br /&gt;
I have a spare TTIG that could perhaps be used as a Helium gateway, investigate what is possible.&lt;br /&gt;
&lt;br /&gt;
One possiblity is to capture the gateway traffic from the TTN gateway events API, convert uplink data to a format that the Helium network understands and forward it.&lt;br /&gt;
I don&#039;t really care about the Helium crypto tokens, this is just for fun and science.&lt;br /&gt;
&lt;br /&gt;
What I definitely can do:&lt;br /&gt;
* Capture data from the TTN gateway events API, convert it back to Semtech UP format and forward it somewhere to Helium (just not sure where!)&lt;br /&gt;
* See also my https://github.com/bertrik/ttn-gateway-collector project which contains an initial implementation of TTN-to-UDP conversion&lt;br /&gt;
&lt;br /&gt;
Showstoppers:&lt;br /&gt;
* If you want to be a gateway on the Helium network, you have to *pay Helium*! Obviously I don&#039;t want that, I just want to share data to improve *their* network. &lt;br /&gt;
&lt;br /&gt;
Open work:&lt;br /&gt;
* Investigate if Helium has an open uplink API for their hotspots, if so study it etc, without paying the gateway fee&lt;br /&gt;
* Investigate if Thingsix has an open uplink API for their hotspots, if so study it etc, without paying any gateway fee&lt;br /&gt;
* Investigate if Thingsix is just another Helium, with weird crypto money&lt;br /&gt;
&lt;br /&gt;
Interesting stuff:&lt;br /&gt;
* https://docs.helium.com/use-the-network/setup-a-packet-forwarder unfortunately the link to setting up the &#039;light hotspot client&#039; does not work!&lt;br /&gt;
* https://docs.helium.com/mine-hnt/light-hotspots/&lt;br /&gt;
* https://thingsix.com/&lt;br /&gt;
&lt;br /&gt;
=== Adding BLE GATT interface to sensors ===&lt;br /&gt;
The GATT specification allows measurement properties to be defined and transferred continuously over Bluetooth low-energy.&lt;br /&gt;
&lt;br /&gt;
With GATT you can define a collection of properties (e.g. measurement items like temperature/humidity/particulate matter/noise, etc)&lt;br /&gt;
organised in a simple structure of a BLE service.&lt;br /&gt;
The &#039;notification&#039; method allows you to basically push the data continuously to a connected host, e.g. a smart phone.&lt;br /&gt;
&lt;br /&gt;
Services collects characteristic, a characteristic has values with units.&lt;br /&gt;
Each of these (service, characteristic, unit) have their own unique &amp;quot;UUID&amp;quot;.&lt;br /&gt;
This is described in the so-called [https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20Numbers%20Document.pdf 16-bit UUID numbers document]&lt;br /&gt;
&lt;br /&gt;
Interesting stuff in GATT:&lt;br /&gt;
* See GATT_Specification_Supplement_v5 paragraph 3.151, it has a noise characteristic with 1 dB resolution.&lt;br /&gt;
* 0x27C3 is the GATT *unit* for sound pressure&lt;br /&gt;
* 0x181A is the GATT environmental sensing *service*, document name &amp;quot;ESP_V1.0.0.pdf&amp;quot;&lt;br /&gt;
* 0x2A6E is the GATT Characteristic and Object Type for temperature&lt;br /&gt;
* 0x2A6F is the GATT Characteristic and Object Type for humidity&lt;br /&gt;
* 0x2BD5 is the GATT Characteristic and Object Type for Particulate Matter - PM1 Concentration&lt;br /&gt;
* 0x2BD6 is the GATT Characteristic and Object Type for Particulate Matter - PM2.5 Concentration&lt;br /&gt;
* 0x2BD7 is the GATT Characteristic and Object Type for Particulate Matter - PM10 Concentration&lt;br /&gt;
* Unfortunately I cannot find a characteristic for carbon-dioxide (CO2) in the BLE GATT unit document&lt;br /&gt;
&lt;br /&gt;
See also https://programmaticponderings.com/2020/08/04/getting-started-with-bluetooth-low-energy-ble-and-generic-attribute-profile-gatt-specification-for-iot/&lt;br /&gt;
&lt;br /&gt;
=== Reverse engineering XS-8217 bluetooth air quality meter ===&lt;br /&gt;
This is a thing that measures CO2, humidity, temperature, TVOC and formaldehyde.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.liutyi.info/display/CO2/ZN-2CO3+Inside&lt;br /&gt;
&lt;br /&gt;
This teardown looks a lot like my sensor: https://www.youtube.com/watch?v=APnjhMrJChI&lt;br /&gt;
Mine contains a &amp;quot;TPM-300A&amp;quot; sensor for measuring VOC.&lt;br /&gt;
&lt;br /&gt;
It has a bluetooth interface, device name is XS-8217.&lt;br /&gt;
It has a BLE GATT profile, with the following services&lt;br /&gt;
* service 0xC760&lt;br /&gt;
** characteristic 0xC762 (WRITE)&lt;br /&gt;
** characteristic 0xC761 (NOTIFY)&lt;br /&gt;
*** example data: 0x23 0x06 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
*** example data: 0x23 0x08 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
*** data shown on screen was approximately: CO2=418ppm, HCHO=0.003mg/m3, TVOC=0.013mg/m3, temp=24degC, humi=35%&lt;br /&gt;
&lt;br /&gt;
So data in the characteristic 0xC761 seems to have a 4 byte constant header:&lt;br /&gt;
* 0x23&lt;br /&gt;
* length byte&lt;br /&gt;
&lt;br /&gt;
Then we have for the first message: 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0xF1 is temperature in 0.1 degree Celcius most likely (24.1)&lt;br /&gt;
* 0x00 is ...&lt;br /&gt;
* 0x23 is humidity most likely (35)&lt;br /&gt;
* 0x65 is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
And for the second message: 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0x01 0x9A is the CO2 concentration (410)&lt;br /&gt;
* 0x00 0x0A is TVOC most likely (10)&lt;br /&gt;
* 0x00 0x03 is HCHO most likely (3)&lt;br /&gt;
* 0x0E is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
=== ribbon tweeter for bat audio ===&lt;br /&gt;
Someone gave me this idea:&lt;br /&gt;
Use a ribbon tweeter like this for playing back bat audio:&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/4000973201791.html&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/1005002565880660.html&amp;lt;/s&amp;gt;&lt;br /&gt;
https://nl.aliexpress.com/item/1005002635086050.html&lt;br /&gt;
&lt;br /&gt;
The frequency spectrum shows no sign of dropping off at 20 kHz.&lt;br /&gt;
&lt;br /&gt;
=== 3d glasses ===&lt;br /&gt;
I got some 2nd hand 3d glasses, they look exactly like these ones:&lt;br /&gt;
* GH-15 https://www.dhgate.com/product/g15-dlp-3d-active-shutter-glasses-96-144hz/213983026.html&lt;br /&gt;
* Sintron https://www.amazon.de/Sintron-Kompatibel-TDG-BT500A-TDG-BT400A-Deutschland/dp/B015PCWMZ8&lt;br /&gt;
The common name appears to be &amp;quot;G15-DLP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A tear-down here:&lt;br /&gt;
* https://blog.danman.eu/3d-shutter-glasses-teardown/&lt;br /&gt;
&lt;br /&gt;
Interesting documents:&lt;br /&gt;
* http://cmst.curtin.edu.au/wp-content/uploads/sites/4/2016/05/2012-28-woods-helliwell-cross-compatibility_of_shutter_glasses.pdf&lt;br /&gt;
* http://cmst.curtin.edu.au/local/docs/pubs/2011-17-woods-helliwell-3D-Sync-IR.pdf&lt;br /&gt;
&lt;br /&gt;
Someone claims he got something to work with some hacks:&lt;br /&gt;
https://www.avsforum.com/threads/how-i-got-cheap-dlp-link-glasses-to-work-great.1887145/&lt;br /&gt;
&lt;br /&gt;
=== Waterniveaumeter ===&lt;br /&gt;
Op verschillende plekken in Gouda staat er water in de kruipruimte van huizen van bewoners.&lt;br /&gt;
Kunnen we dat meten en inzichtelijk maken, voor bewoners, op een kaart bijvoorbeeld?&lt;br /&gt;
&lt;br /&gt;
Idee:&lt;br /&gt;
* in de kruipruimte plaats je een module die waterhoogte kan meten&lt;br /&gt;
* de module bestaat uit een microcontroller en een afstandsmeter, die de waterhoogte bepaalt&lt;br /&gt;
* de gegevens worden via WiFi doorgestuurd naar een centraal punt, waar de data wordt verwerkt en gevisualiseerd&lt;br /&gt;
* op een webpagina kan je een overzicht zien van alle meters die online zijn&lt;br /&gt;
* de meting wordt gedaan door bijv. een laser-afstandsmeter of een ultrasoon-afstandsmeter&lt;br /&gt;
* voeding? lastig, hoe krijg je 5v naar een potentieel natte plek?&lt;br /&gt;
* kosten? verwachting &amp;lt; E 40,-&lt;br /&gt;
&lt;br /&gt;
In Gouda wordt op veel verschillende plekken de grondwaterstand gemeten, zie https://opendata.munisense.net/portal/wareco-water2/group/581/Gouda-KJ38A , maar:&lt;br /&gt;
* geen visualisatie op de kaart, je ziet alleen de meetlokaties d.m.v. een icoontje!&lt;br /&gt;
* geen meetpunten in Gouda noord!&lt;br /&gt;
&lt;br /&gt;
=== Online bat detector ===&lt;br /&gt;
Idea: use an ultrasonic microphone, connect it to a WebSDR, so people can tune into bat sounds remotely.&lt;br /&gt;
&lt;br /&gt;
=== Raspberry pi airplane tracking ===&lt;br /&gt;
Apparently now you can also participate in MLAT tracking of planes that don&#039;t transmit GPS coordinates themselves.&lt;br /&gt;
&lt;br /&gt;
=== APRS gateway ===&lt;br /&gt;
http://qso365.co.uk/2017/02/a-guide-to-setting-up-an-aprs-receive-only-igate-using-a-raspberry-pi-and-an-rtl-sdr-dongle/&lt;br /&gt;
&lt;br /&gt;
=== JQ6500 ===&lt;br /&gt;
Small inexpensive modules that play mp3 from an internal flash. Could be nice for a custom door bell for example.&lt;br /&gt;
&lt;br /&gt;
More info at: &lt;br /&gt;
* https://www.elecfreaks.com/wiki/index.php?title=JQ6500_Mini_MP3_Module&lt;br /&gt;
* https://sparks.gogo.co.nz/jq6500/index.html&lt;br /&gt;
&lt;br /&gt;
=== FPGA ===&lt;br /&gt;
Cheap FPGA boards and nice applications:&lt;br /&gt;
* https://bitbucket.org/appanp/artificial-neural-networks/wiki/Home/FPGAsAndNeuralNets.md#!sbcs-and-iot-boards &lt;br /&gt;
* [http://nl.aliexpress.com/item/Altera-fpga-cycloneii-ep2c5t144-learning-board-development-board/872520721.html inexpensive ep2c5t144 board] &lt;br /&gt;
* http://land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board&lt;br /&gt;
&lt;br /&gt;
=== Neural networks on low-end hardware ===&lt;br /&gt;
Investigate if you can run a powerful neural network on relatively low-end/cheap/low-power hardware. For example a Raspberry pi.&lt;br /&gt;
A RPI runs Linux, run python, just like some common neural frameworks.&lt;br /&gt;
Do we need hardware acceleration from the GPU and does the RPI GPU support that?&lt;br /&gt;
&lt;br /&gt;
Read list:&lt;br /&gt;
* https://www.zdnet.com/pictures/raspberry-pi-meets-ai-the-projects-that-put-machine-learning-on-the-35-board/&lt;br /&gt;
* https://www.pyimagesearch.com/2017/12/18/keras-deep-learning-raspberry-pi/&lt;br /&gt;
* https://www.indiegogo.com/projects/sipeed-maix-the-world-first-risc-v-64-ai-module#/&lt;br /&gt;
* https://ai.intel.com/intel-neural-compute-stick-2-smarter-faster-plug-and-play-ai-at-the-edge/&lt;br /&gt;
&lt;br /&gt;
Bought a MaixPy:&lt;br /&gt;
* see https://maixpy.sipeed.com/en/&lt;br /&gt;
* see https://www.youtube.com/watch?v=KResVuAIMb4&lt;br /&gt;
* see http://educ8s.tv/sipeed-m1-dock-review/&lt;br /&gt;
* interesting? https://www.instructables.com/id/Transfer-Learning-With-Sipeed-MaiX-and-Arduino-IDE/&lt;br /&gt;
&lt;br /&gt;
=== mini word clock in dutch ===&lt;br /&gt;
Basically an monochrome 8x8 word clock, in Dutch, showing local time in the Netherlands.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bertrik/miniwordclock This git repo] has the current code.&lt;br /&gt;
&lt;br /&gt;
See [https://plus.google.com/103276078656203197145/posts/7ki7rpJzk3a here for a demo] running on an arduino nano.&lt;br /&gt;
&lt;br /&gt;
The plan is to run this from an ESP8266 instead of an arduino nano, so it can get the time from the internet using NTP.&lt;br /&gt;
Andreas Spiess demonstrated on youtube how existing libraries on the ESP8266 can be used to do the local time (including summer-time) calculations.&lt;br /&gt;
&lt;br /&gt;
=== Cypress PSOC5 ===&lt;br /&gt;
Play with the Cypress PSOC5 platform, which combines a ARM Cortex-m3 processor with configurable analog blocks. I&#039;m thinking of combining it with a 24 GHz doppler radar sensor, to process the signal and present it as a USB audio device (stereo signal contains I and Q parts). See [[RadarOnAStick]].&lt;br /&gt;
&lt;br /&gt;
=== Simple Doppler motion sensors ===&lt;br /&gt;
You can find basic doppler microwave motion sensors based on a single transistor, with some weird traces on the PCB very cheaply, for example&lt;br /&gt;
* https://www.aliexpress.com/item/RCWL-0516-microwave-radar-sensor-module-Human-body-induction-switch-module-Intelligent-sensor/32708877914.html&lt;br /&gt;
&lt;br /&gt;
Typically the microwave part of these consists of a single transistor with a rectangular area on one leg and a meandering trace (with lots of vias to the other side) on the other leg.&lt;br /&gt;
The output of this circuit seems to go into a chip very much like the ones used in PIR sensors.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/jdesbonnet/RCWL-0516 for a reverse engineering effort of these doppler radar modules.&lt;br /&gt;
&lt;br /&gt;
=== Bare-bones Arduino bat detector ===&lt;br /&gt;
This is an idea for a very basic heterodyne bat detector, doing signal processing on an Arduino, requiring minimal external components.&lt;br /&gt;
&lt;br /&gt;
The basic principle of a heterodyne detector is that it just mixes (multiplies) the audio signal with a square wave, low-pass filters the result and puts it on a speaker.&lt;br /&gt;
&lt;br /&gt;
Multiplying with a square wave can also be considered to be just alternatively inverting and not-inverting the signal.&lt;br /&gt;
So if you sample an ultrasonic signal at twice the rate you want to multiply, you can just subtract odd samples from even samples and low-pass filter that.&lt;br /&gt;
&lt;br /&gt;
How this can be done in an AVR Arduino:&lt;br /&gt;
* sample the audio signal at twice the detection frequency, say 84 kHz. An AVR should just be able to do that.&lt;br /&gt;
* apply a 1-pole IIR high-pass filter to remove DC bias, this takes one shift instruction and one addition.&lt;br /&gt;
* multiply by the detection frequency, this means just inverting the odd samples.&lt;br /&gt;
* low-pass filter the signal, this can be done using a moving average filter, say 16 samples long (first null at 5.25 kHz). Theoretically, averaging 16 samples should result in two bits extra accuracy. This operation takes some storage, an addition and a subtraction.&lt;br /&gt;
* output the filtered signal using PWM, possibly at the same rate that we are sampling the input audio.&lt;br /&gt;
&lt;br /&gt;
The microphone can be a 40 kHz piezo transducer, to keep it cheap (but also limited to 40 kHz).&lt;br /&gt;
The pre-amplifier can be a single transistor with some resistors around it, providing about 40x gain.&lt;br /&gt;
The arduino does the signal processing (mixing, low-pass filter) to shift the bat audio to human range.&lt;br /&gt;
The speaker amplifier can just be a simple two transistor push-pull circuit, since the output from the Arduino is digital/PWM.&lt;br /&gt;
&lt;br /&gt;
==== AVR Arduino sample rate ====&lt;br /&gt;
As far as I understand, the ADC clock can be set to 1 MHz.&lt;br /&gt;
Conversion takes 13 cycles, so this can be a problem to reach a sample rate above 80 kHz.&lt;br /&gt;
&lt;br /&gt;
=== Indoor radar speed sign ===&lt;br /&gt;
This idea about placing a simple IQ-output radar sensor indoors in the hacker space, do some basic signal processing on the IQ doppler signal and determine movement speed and direction, then display this on a LED display.&lt;br /&gt;
This is of no immediate practical use other than fun, but helps me to gain a bit more experience with microwave radar sensors and eventually build a more effective setup for detecting/counting bats flying in and out of a roost.&lt;br /&gt;
&lt;br /&gt;
Implement this on a PSOC5 platform or on the STM32 using Arduino.&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35214</id>
		<title>User:Bertrik Sikken</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35214"/>
		<updated>2026-04-25T10:47:53Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Action 32x32 display */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Smoel&lt;br /&gt;
 |Name=Bertrik Sikken&lt;br /&gt;
 |Nick=bertrik&lt;br /&gt;
 |Tagline=heb ik niet&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You can reach me at [mailto:bertrik@sikken.nl bertrik@sikken.nl] or [mailto:bertrik@gmail.com bertrik@gmail.com].&lt;br /&gt;
&lt;br /&gt;
Studied Electrical Engineering at Twente University.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Main interests:&lt;br /&gt;
* reverse-engineering things (USB stuff, mp3 players), worked on http://rockbox.org (sansa clip players)&lt;br /&gt;
* studying bats and making electronics for recording/listening to bat sounds&lt;br /&gt;
* radio stuff, in particular software-defined radio, LoRa networks&lt;br /&gt;
* citizen science and open data (particulate matter measurement, noise, water quality)&lt;br /&gt;
* energy-related stuff, visualisation&lt;br /&gt;
&lt;br /&gt;
Projects I work(ed) on ([https://revspace.nl/index.php?title=User:Bertrik_Sikken&amp;amp;action=purge refresh]):&lt;br /&gt;
{{#ask:[[Category:Project]][[Project Contact::bertrik]]&lt;br /&gt;
|?Project Status&lt;br /&gt;
|headers=show&lt;br /&gt;
|link=all&lt;br /&gt;
|order=ASC,ASC&lt;br /&gt;
|sort=Project Status,Project Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project ideas ==&lt;br /&gt;
[[File:always10oclock.jpg|right]]&lt;br /&gt;
[[File:idea.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas I&#039;m thinking about, but have not fully developed into an actual project yet.&lt;br /&gt;
&lt;br /&gt;
https://pine64.com/product/128mb-ox64-sbc-available-on-december-2-2022/&lt;br /&gt;
&lt;br /&gt;
=== Action 32x32 display ===&lt;br /&gt;
Action sells [https://www.action.com/nl-nl/p/3217439/led-pixelbord/ this ACT1026 display]. You control it over BLE.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Pupariaa/Bk-Light-AppBypass works to control it&lt;br /&gt;
* software for a similar led display: https://github.com/derkalle4/python3-idotmatrix-client&lt;br /&gt;
&lt;br /&gt;
=== investigate thread/matter ===&lt;br /&gt;
Matter/thread is the new IKEA standard for home automation thins apparently. &lt;br /&gt;
Thread is the wireless protocol, matter is a home automation protocol running on top of thread.&lt;br /&gt;
&lt;br /&gt;
I have a couple of nrf52840, these are good in doing thread.&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* check out openthread&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/openthread/openthread.git&lt;br /&gt;
cd openthread&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Prepare development environment:&lt;br /&gt;
  scripts/bootstrap&lt;br /&gt;
* Build it:&lt;br /&gt;
  ./script/build nrf52840 UART_trans -DOT_LOG_LEVEL=OT_LOG_LEVEL_INFO&lt;br /&gt;
&lt;br /&gt;
Thread on ESP32:&lt;br /&gt;
* on ESP32 C6 https://gist.github.com/gtxaspec/d26198daadfb0a8b0a0edeae2d3fd58f&lt;br /&gt;
* https://github.com/espressif/esp-thread-br&lt;br /&gt;
* https://github.com/espressif/esp-idf/tree/master/examples/openthread/ot_rcp&lt;br /&gt;
&lt;br /&gt;
=== action lsc stekker ===&lt;br /&gt;
https://keetsupport.nl/2024/03/20/how-to-flash-lsc-power-plug-with-esphome/&lt;br /&gt;
&lt;br /&gt;
https://community.home-assistant.io/t/detailed-guide-on-how-to-flash-the-new-tuya-beken-chips-with-openbk7231t/437276&lt;br /&gt;
&lt;br /&gt;
=== sipeed maix dock ===&lt;br /&gt;
Bought this a couple of years ago. Get familiar with this board.&lt;br /&gt;
Can I run a chess program on this, for example?&lt;br /&gt;
&lt;br /&gt;
* https://wiki.sipeed.com/soft/maixpy/en/develop_kit_board/maix_dock.html&lt;br /&gt;
&lt;br /&gt;
=== rfid keyfob ===&lt;br /&gt;
* aliexpress page: https://nl.aliexpress.com/item/1005009569496736.html&lt;br /&gt;
* firmware github: &lt;br /&gt;
** https://github.com/RfidResearchGroup/ChameleonUltra&lt;br /&gt;
** https://github.com/GameTec-live/ChameleonUltraGUI&lt;br /&gt;
&lt;br /&gt;
=== advanced lidars for bat detection ===&lt;br /&gt;
livox:&lt;br /&gt;
* github page https://github.com/Livox-SDK/Livox-SDK/tree/master&lt;br /&gt;
* web page: https://www.livoxtech.com/&lt;br /&gt;
&lt;br /&gt;
=== cubecell meshtastic motion detector ===&lt;br /&gt;
I have a cubecell AB01 board.&lt;br /&gt;
This board is focused on low power, has a connection to attach a solar panel and has a lora radio.&lt;br /&gt;
Relatively small amount of RAM, barely enough to run a LoRaWAN stack but probably plenty to run meshtastic&lt;br /&gt;
&lt;br /&gt;
The plan is to build a simple motion detector from this (using a PIR).&lt;br /&gt;
The PIR can wake up the board from low-power, or a timer can wake it periodically.&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/HelTecAutomation/CubeCell-Arduino/tree/master/libraries/Basics/examples/LowPower&lt;br /&gt;
&lt;br /&gt;
=== configure multitech outdoor gateway ===&lt;br /&gt;
https://www.multitech.net/developer/products/multiconnect-conduit-platform/basestation/&lt;br /&gt;
&lt;br /&gt;
https://multitech.com/product/multitech-conduit-mtcdt-246a-868-eu-gb/&lt;br /&gt;
&lt;br /&gt;
emergency procedure:&lt;br /&gt;
https://www.multitech.net/developer/software/mlinux/using-mlinux/flashing-mlinux-firmware-for-conduit/&lt;br /&gt;
&lt;br /&gt;
=== esp32 wtf ===&lt;br /&gt;
* https://forum.arduino.cc/t/ttgo-lilygo-lora-esp32-26mhz-problem/1353750&lt;br /&gt;
* &amp;quot;26 MHz crystal has been deprecated&amp;quot; https://github.com/espressif/arduino-esp32/issues/10117&lt;br /&gt;
&lt;br /&gt;
=== kakofonie counter ===&lt;br /&gt;
Sample room audio, use neural network to distinguish voices to estimate number of people talking in the past 30 seconds or so.&lt;br /&gt;
Show this number on some kind of display, publish it to MQTT, make a nice graph of it.&lt;br /&gt;
&lt;br /&gt;
Stuff to figure out:&lt;br /&gt;
* this is called &#039;speaker diarization&#039;&lt;br /&gt;
* can it run on an ESP32?&lt;br /&gt;
* make a prototype&lt;br /&gt;
&lt;br /&gt;
=== hypno toad ===&lt;br /&gt;
Put these LEDS https://nl.aliexpress.com/item/1005007583528891.html into https://www.action.com/nl-nl/p/2560347/solar-tuinbeeldje/&lt;br /&gt;
&lt;br /&gt;
Turns out that the default circuit is really basic and output a rough step-up waveform to the LED.&lt;br /&gt;
The self-fading LEDs don&#039;t work very well with that.&lt;br /&gt;
&lt;br /&gt;
Also, putting some IPA on hotglue makes it release really easy.&lt;br /&gt;
&lt;br /&gt;
=== wasbeer / kat classifier ===&lt;br /&gt;
ESP32 with resnet50 neural net to distinguish house cats from other animals, see also:&lt;br /&gt;
* https://ieeexplore.ieee.org/document/10556848/&lt;br /&gt;
&lt;br /&gt;
=== Nespresso brew counter ===&lt;br /&gt;
Several hacker spaces have one of these Nespresso cup coffee makers, but there&#039;s no obvious easy way to monitor usage (monitor ALL the things!).&lt;br /&gt;
Inspired by https://hackaday.com/2021/04/25/arduino-mkr-makes-nespresso-monitoring-easy/ this idea is making an even simpler nespresso monitor,&lt;br /&gt;
using an inexpensive WiFi enabled ESP8266 with an ubiquitous I2S microphone such as the INMP441. &lt;br /&gt;
&lt;br /&gt;
Use this sound monitoring project:&lt;br /&gt;
https://github.com/aleiei/ESP8266-BUG-I2S-MIC&lt;br /&gt;
and turn it into a WiFi connected brew counter.&lt;br /&gt;
&lt;br /&gt;
Software for getting microphone data from an ESP8266/I2S mic into Linux https://github.com/bertrik/EspMicServer&lt;br /&gt;
Nespresso sound is typically 50 Hz with overtones.&lt;br /&gt;
In a recording with the ESP8266, it appears that oddly the 17th harmonic (around 850 Hz) is quite strong.&lt;br /&gt;
&lt;br /&gt;
The plan in the short term is this:&lt;br /&gt;
* apply a gentle IIR filter to subtract any DC bias from the microphone signal&lt;br /&gt;
* calculate autocovariance at offsets 0 and 20 ms (inverse of 50 Hz), representing the total energy and the energy at 50 Hz respectively&lt;br /&gt;
* compare amplitudes to decide about presence of 50 Hz signal, e.g. calculate ratio in dB&lt;br /&gt;
* use this to count the length of time that a 50 Hz signal is heard (increments of 100 ms or so)&lt;br /&gt;
* decide about none / espresso / lungo based on time&lt;br /&gt;
&lt;br /&gt;
Might even integrate with esphome / home assistant later.&lt;br /&gt;
&lt;br /&gt;
=== Remote bat box monitor ===&lt;br /&gt;
Idea:&lt;br /&gt;
* goal: check if remote bat boxes are occupied and identify the species&lt;br /&gt;
* challenges:&lt;br /&gt;
** connectivity: need to transport images/videos (no LoRaWAN), possibly out of range of mobile data networks&lt;br /&gt;
** autonomy: cannot reach the bat box once installed&lt;br /&gt;
** power: no fixed power connection, so probably needs a battery + solar panel&lt;br /&gt;
* design&lt;br /&gt;
** wake up every hour, take a picture, go to sleep, upload photos/videos once per day&lt;br /&gt;
** run from batteries, recharge by solar, rules of thumb&lt;br /&gt;
*** batteries should last for about 10 days&lt;br /&gt;
*** battery should be able to charge in 1 day&lt;br /&gt;
*** consider only 10% of peak solar power&lt;br /&gt;
** KPN &amp;quot;4G-op-zee&amp;quot; somewhat confusing article: https://www.kpn.com/zakelijk/mobiel/roaming/noordzee&lt;br /&gt;
* hardware&lt;br /&gt;
** main processor: raspberry pi zero&lt;br /&gt;
*** raspberry pi power consumption overview: https://www.pidramble.com/wiki/benchmarks/power-consumption&lt;br /&gt;
** this hat to wake up the main CPU: https://www.waveshare.com/wiki/Power_Management_HAT_(B) sold at https://www.kiwi-electronics.com/en/power-management-hat-for-raspberry-pi-with-rtc-and-rp2040-mcu-11373&lt;br /&gt;
&lt;br /&gt;
=== KNMI API ===&lt;br /&gt;
Get familiar with https://developer.dataplatform.knmi.nl/open-data-api&lt;br /&gt;
&lt;br /&gt;
=== Grid frequency measurer with web page ===&lt;br /&gt;
See https://github.com/bertrik/GridFrequency&lt;br /&gt;
SSE source is gridfrequency.local/events&lt;br /&gt;
&lt;br /&gt;
=== WeAct CH55x board ===&lt;br /&gt;
Cheap little boards, using a similar chip as used in USB-serial converters.&lt;br /&gt;
&lt;br /&gt;
The hardware&lt;br /&gt;
https://github.com/WeActStudio/WeActStudio.CH552CoreBoard&lt;br /&gt;
&lt;br /&gt;
Flashing it:&lt;br /&gt;
https://hackaday.io/page/137447-flashing-the-ch552-dev-board-from-the-command-line&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://hackaday.io/project/198238-more-weact-ch5xx&lt;br /&gt;
* https://community.platformio.org/t/manually-adding-support-for-ch55x-controller-by-adding-existing-ardunio-core/41138&lt;br /&gt;
&lt;br /&gt;
=== Zigbee device with esp32 ===&lt;br /&gt;
See https://github.com/P-R-O-C-H-Y/arduino-esp32/blob/8169a434c3e46e1bb7711ebcc04f27267db2093c/libraries/ESP32/examples/Zigbee/Zigbee_Light_Bulb/Zigbee_Light_Bulb.ino&lt;br /&gt;
&lt;br /&gt;
See https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Zigbee&lt;br /&gt;
&lt;br /&gt;
Espressif32 arduino platform git: https://github.com/platformio/platform-espressif32&lt;br /&gt;
&lt;br /&gt;
=== Cameratoezicht in Gouda ===&lt;br /&gt;
Gemeente Gouda publiceert een lijst van camera&#039;s in Gouda, zie&lt;br /&gt;
https://gis.gouda.nl/nl/app/Basisviewer_open#!eAGT8uRiNBRy4ZIRYFKSyKkssjJwdzFxNDMz8TKKsLC0cnb0dQ1y5FIByirgkg3xd43ydPYIAQBXGBFm&lt;br /&gt;
&lt;br /&gt;
Aanmelden (semi-automatisch) bij bijvoorbeeld [https://mapcomplete.org/surveillance Surveillance-under-surveillance] ?&lt;br /&gt;
&lt;br /&gt;
=== SolarEdge ===&lt;br /&gt;
Interact with the solar edge api for PV installations.&lt;br /&gt;
&lt;br /&gt;
https://developers.solaredge.com/&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/solaredge-api&lt;br /&gt;
&lt;br /&gt;
=== Stookalert ===&lt;br /&gt;
Idee: gekleurd lampje dat aangeeft of er op dit moment een stookalert actief is&lt;br /&gt;
&lt;br /&gt;
Implementatie:&lt;br /&gt;
* kijk m.b.v. WiFi locatieservice in welke provincie je je bevindt&lt;br /&gt;
* haal JSON op bij https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* toon de bijbehorende kleur op het lampje&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
* Officiele pagina: https://www.atlasleefomgeving.nl/stookwijzer&lt;br /&gt;
* Achterliggende JSON met toestand per provincie: https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* Er moet ook nog ergens een API zijn die fijnmaziger aangeeft wat de toestand is ...&lt;br /&gt;
&lt;br /&gt;
=== Display of current electricity usage ===&lt;br /&gt;
I have a [https://www.zuidwijk.com/product/slimmelezer-plus/ slimme lezer] connected to the P1 port of my smart electricity meter.&lt;br /&gt;
The default firmware exposes meter readings using an event stream (SSE) at http://slimmelezer.local/events&lt;br /&gt;
&lt;br /&gt;
So for example, you can read this with curl:&lt;br /&gt;
  curl http://slimmelezer.local/events&lt;br /&gt;
With result:&lt;br /&gt;
  event: state&lt;br /&gt;
  data: {&amp;quot;id&amp;quot;:&amp;quot;sensor-power_consumed_phase_1&amp;quot;,&amp;quot;value&amp;quot;:0.046,&amp;quot;state&amp;quot;:&amp;quot;0.046 kW&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Specification of SSE: https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
&lt;br /&gt;
What I would like to do is to read these events and control a simple display to display  the current usage number.&lt;br /&gt;
&lt;br /&gt;
=== Participating in ultrasonic sound project ===&lt;br /&gt;
https://bat-migration-europe.netlify.app/project/&lt;br /&gt;
&lt;br /&gt;
Use an audiomoth for this.&lt;br /&gt;
&lt;br /&gt;
=== ESP32 C3 ===&lt;br /&gt;
* [https://www.espressif.com/en/products/socs/esp32-c3 processor page]&lt;br /&gt;
* [https://wiki.luatos.com/chips/esp32c3/index.html luatos basic esp32 c3 board]&lt;br /&gt;
&lt;br /&gt;
=== Flexible LED ticker ===&lt;br /&gt;
Ordered a flexible 32x8 RGB LED display:&lt;br /&gt;
https://nl.aliexpress.com/item/4001296811800.html&lt;br /&gt;
&lt;br /&gt;
Matching diffuser to be 3D printed:&lt;br /&gt;
https://www.thingiverse.com/thing:1903744&lt;br /&gt;
&lt;br /&gt;
=== Washing machine API ===&lt;br /&gt;
https://tratt.net/laurie/blog/2023/displaying_my_washing_machines_remaining_time_with_curl_jq_pizauth.html&lt;br /&gt;
&lt;br /&gt;
=== TinyML ===&lt;br /&gt;
Investigate TinyML, see https://www.tinyml.org/&lt;br /&gt;
Apparently can run on a RP2040 (raspi pi pico).&lt;br /&gt;
&lt;br /&gt;
https://www.hackster.io/mjrobot/esp32-cam-tinyml-image-classification-fruits-vs-veggies-4ab970&lt;br /&gt;
&lt;br /&gt;
=== Bat box busy signal ===&lt;br /&gt;
My brother built little pyramid &#039;blinkies&#039;: solar cell + Lithium-supercapacitor + harvesting circuit + LED encased in clear expoxy.&lt;br /&gt;
&lt;br /&gt;
Can we add a low-power PIR sensor to this, and make a blinky that blinks if movement was detected by the PIR in the past hour?&lt;br /&gt;
&lt;br /&gt;
=== Super tiny RFID ===&lt;br /&gt;
See https://www.sparkfun.com/products/16464 an almost sand grain size RFID chip, 1.25mmx1.25mmx0.55mm&lt;br /&gt;
&lt;br /&gt;
The accompanying reader &amp;quot;M6E Nano&amp;quot; is still quite expensive at $235.95 : https://www.sparkfun.com/products/14066&lt;br /&gt;
&lt;br /&gt;
Uses the MuRata LXMSJZNCMF-198:&lt;br /&gt;
&amp;quot;This product can be used as an ultra small tag and this can be&lt;br /&gt;
fit on any metal objects, non-metal objects, as well as&lt;br /&gt;
embedding into any objects by glue or adhesive and so on.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See also: ISO18000-63 and EPC global Gen2(v2)&lt;br /&gt;
&lt;br /&gt;
Specification:&lt;br /&gt;
* https://www.gs1.org/standards/rfid/uhf-air-interface-protocol&lt;br /&gt;
&lt;br /&gt;
=== TheThingsNetwork-Sondehub bridge ===&lt;br /&gt;
Uploads balloon telemetry to sondehub.&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/ttnhabbridge/issues/6&lt;br /&gt;
&lt;br /&gt;
=== Actually smart boiler ===&lt;br /&gt;
The boiler for hot water is about half of my electricity bill.&lt;br /&gt;
The idea is to use/build a smart switch that switches it on at time when electricity prices are lowest.&lt;br /&gt;
&lt;br /&gt;
Currently have a &amp;quot;Slimme boiler module&amp;quot; from Eneco, which is *not* actually smart,&lt;br /&gt;
since it allows me no control whatsoever when it switches on (besides cutting the power in the meterkast).&lt;br /&gt;
For example, it will switch on mid-day when my price is high and eneco&#039;s price is low, perhaps good for Eneco, not for me. &lt;br /&gt;
Apparently, they even received a [https://nieuws.eneco.nl/slim-apparaatje-bij-boiler-vangt-pieken-wind--en-zonnestroom-op/ subsidy] for this.&lt;br /&gt;
&lt;br /&gt;
A boiler is a pretty big load, about 3 kW, but it is not inductive.&lt;br /&gt;
&lt;br /&gt;
Alternatives:&lt;br /&gt;
* https://www.shelly.cloud/en-nl/products/product-overview/shelly-plus-1-pm-2-pack/shelly-plus-1-pm&lt;br /&gt;
* https://www.solyxenergy.nl/solar-iboost/ to store excess solar energy in hot water, might also be useful for just controlling a boiler to use cheaper rates&lt;br /&gt;
* tuya smartplug, like https://www.wifilampkoning.nl/merken-slimme-verlichting/tuya/tuya-enkele-smartplug-met-energiemeting ?&lt;br /&gt;
* tuya 20A smart plug: https://nl.aliexpress.com/item/1005003347568206.html&lt;br /&gt;
&lt;br /&gt;
=== Receiving gas meters ===&lt;br /&gt;
Apparently gas meters send gas consumption data to the slimme meter using a wireless link in the 868 MHz band.&lt;br /&gt;
Probably just FSK at 38.4, as mentioned here: https://a35.veron.nl/nieuwe-elektra-en-gasmeters/&lt;br /&gt;
&lt;br /&gt;
Interesting leads:&lt;br /&gt;
* https://github.com/stef/smeter&lt;br /&gt;
* https://www.rtl-sdr.com/reading-household-wireless-utility-meters-with-an-rtl-sdr-and-plotting-the-data-in-home-automation-software/&lt;br /&gt;
* https://github.com/bemasher/rtlamr&lt;br /&gt;
&lt;br /&gt;
=== Multi-network wifi manager ===&lt;br /&gt;
Figure out or create software so that ESP8266/ESP32 wifi manager can use multiple networks to connect (not just one),&lt;br /&gt;
so it allowing storing credentials for more than one network. For example, the network at home, the hacker space, at work.&lt;br /&gt;
Instead of reconfiguring the wifi manager for each network, you just *add* your credentials (and the existing credentials&lt;br /&gt;
are not replaced).&lt;br /&gt;
&lt;br /&gt;
See https://github.com/folkertvanheusden/M.A.X.X&lt;br /&gt;
&lt;br /&gt;
Interesting candidates:&lt;br /&gt;
* https://registry.platformio.org/libraries/martinverges/ESP32%20Wifi%20Manager wifi manager for ESP32, has a REST API for managing wifi network, but is incomplete in the sense that you need to write your own code (e.g. javascript) to actually *use* its API&lt;br /&gt;
* https://github.com/arduino-libraries/Arduino_MultiWiFi is the arduino multi wifi library, to allow connecting to multiple different WiFi networks, but it is not a wifi manager, that starts a captive portal, etc&lt;br /&gt;
&lt;br /&gt;
=== Automated bat counting ===&lt;br /&gt;
Can we automatically count the number of bats from the image of a webcam mounted in a bat colony?&lt;br /&gt;
Perhaps using some kind of AI or machine learning algorithm?&lt;br /&gt;
&lt;br /&gt;
The image in question:&lt;br /&gt;
https://stofradar.nl/coenecoop/&lt;br /&gt;
&lt;br /&gt;
=== Use TheThingsIndoorGateway as Helium/ThingSix hotspot ===&lt;br /&gt;
I have a spare TTIG that could perhaps be used as a Helium gateway, investigate what is possible.&lt;br /&gt;
&lt;br /&gt;
One possiblity is to capture the gateway traffic from the TTN gateway events API, convert uplink data to a format that the Helium network understands and forward it.&lt;br /&gt;
I don&#039;t really care about the Helium crypto tokens, this is just for fun and science.&lt;br /&gt;
&lt;br /&gt;
What I definitely can do:&lt;br /&gt;
* Capture data from the TTN gateway events API, convert it back to Semtech UP format and forward it somewhere to Helium (just not sure where!)&lt;br /&gt;
* See also my https://github.com/bertrik/ttn-gateway-collector project which contains an initial implementation of TTN-to-UDP conversion&lt;br /&gt;
&lt;br /&gt;
Showstoppers:&lt;br /&gt;
* If you want to be a gateway on the Helium network, you have to *pay Helium*! Obviously I don&#039;t want that, I just want to share data to improve *their* network. &lt;br /&gt;
&lt;br /&gt;
Open work:&lt;br /&gt;
* Investigate if Helium has an open uplink API for their hotspots, if so study it etc, without paying the gateway fee&lt;br /&gt;
* Investigate if Thingsix has an open uplink API for their hotspots, if so study it etc, without paying any gateway fee&lt;br /&gt;
* Investigate if Thingsix is just another Helium, with weird crypto money&lt;br /&gt;
&lt;br /&gt;
Interesting stuff:&lt;br /&gt;
* https://docs.helium.com/use-the-network/setup-a-packet-forwarder unfortunately the link to setting up the &#039;light hotspot client&#039; does not work!&lt;br /&gt;
* https://docs.helium.com/mine-hnt/light-hotspots/&lt;br /&gt;
* https://thingsix.com/&lt;br /&gt;
&lt;br /&gt;
=== Adding BLE GATT interface to sensors ===&lt;br /&gt;
The GATT specification allows measurement properties to be defined and transferred continuously over Bluetooth low-energy.&lt;br /&gt;
&lt;br /&gt;
With GATT you can define a collection of properties (e.g. measurement items like temperature/humidity/particulate matter/noise, etc)&lt;br /&gt;
organised in a simple structure of a BLE service.&lt;br /&gt;
The &#039;notification&#039; method allows you to basically push the data continuously to a connected host, e.g. a smart phone.&lt;br /&gt;
&lt;br /&gt;
Services collects characteristic, a characteristic has values with units.&lt;br /&gt;
Each of these (service, characteristic, unit) have their own unique &amp;quot;UUID&amp;quot;.&lt;br /&gt;
This is described in the so-called [https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20Numbers%20Document.pdf 16-bit UUID numbers document]&lt;br /&gt;
&lt;br /&gt;
Interesting stuff in GATT:&lt;br /&gt;
* See GATT_Specification_Supplement_v5 paragraph 3.151, it has a noise characteristic with 1 dB resolution.&lt;br /&gt;
* 0x27C3 is the GATT *unit* for sound pressure&lt;br /&gt;
* 0x181A is the GATT environmental sensing *service*, document name &amp;quot;ESP_V1.0.0.pdf&amp;quot;&lt;br /&gt;
* 0x2A6E is the GATT Characteristic and Object Type for temperature&lt;br /&gt;
* 0x2A6F is the GATT Characteristic and Object Type for humidity&lt;br /&gt;
* 0x2BD5 is the GATT Characteristic and Object Type for Particulate Matter - PM1 Concentration&lt;br /&gt;
* 0x2BD6 is the GATT Characteristic and Object Type for Particulate Matter - PM2.5 Concentration&lt;br /&gt;
* 0x2BD7 is the GATT Characteristic and Object Type for Particulate Matter - PM10 Concentration&lt;br /&gt;
* Unfortunately I cannot find a characteristic for carbon-dioxide (CO2) in the BLE GATT unit document&lt;br /&gt;
&lt;br /&gt;
See also https://programmaticponderings.com/2020/08/04/getting-started-with-bluetooth-low-energy-ble-and-generic-attribute-profile-gatt-specification-for-iot/&lt;br /&gt;
&lt;br /&gt;
=== Reverse engineering XS-8217 bluetooth air quality meter ===&lt;br /&gt;
This is a thing that measures CO2, humidity, temperature, TVOC and formaldehyde.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.liutyi.info/display/CO2/ZN-2CO3+Inside&lt;br /&gt;
&lt;br /&gt;
This teardown looks a lot like my sensor: https://www.youtube.com/watch?v=APnjhMrJChI&lt;br /&gt;
Mine contains a &amp;quot;TPM-300A&amp;quot; sensor for measuring VOC.&lt;br /&gt;
&lt;br /&gt;
It has a bluetooth interface, device name is XS-8217.&lt;br /&gt;
It has a BLE GATT profile, with the following services&lt;br /&gt;
* service 0xC760&lt;br /&gt;
** characteristic 0xC762 (WRITE)&lt;br /&gt;
** characteristic 0xC761 (NOTIFY)&lt;br /&gt;
*** example data: 0x23 0x06 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
*** example data: 0x23 0x08 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
*** data shown on screen was approximately: CO2=418ppm, HCHO=0.003mg/m3, TVOC=0.013mg/m3, temp=24degC, humi=35%&lt;br /&gt;
&lt;br /&gt;
So data in the characteristic 0xC761 seems to have a 4 byte constant header:&lt;br /&gt;
* 0x23&lt;br /&gt;
* length byte&lt;br /&gt;
&lt;br /&gt;
Then we have for the first message: 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0xF1 is temperature in 0.1 degree Celcius most likely (24.1)&lt;br /&gt;
* 0x00 is ...&lt;br /&gt;
* 0x23 is humidity most likely (35)&lt;br /&gt;
* 0x65 is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
And for the second message: 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0x01 0x9A is the CO2 concentration (410)&lt;br /&gt;
* 0x00 0x0A is TVOC most likely (10)&lt;br /&gt;
* 0x00 0x03 is HCHO most likely (3)&lt;br /&gt;
* 0x0E is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
=== ribbon tweeter for bat audio ===&lt;br /&gt;
Someone gave me this idea:&lt;br /&gt;
Use a ribbon tweeter like this for playing back bat audio:&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/4000973201791.html&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/1005002565880660.html&amp;lt;/s&amp;gt;&lt;br /&gt;
https://nl.aliexpress.com/item/1005002635086050.html&lt;br /&gt;
&lt;br /&gt;
The frequency spectrum shows no sign of dropping off at 20 kHz.&lt;br /&gt;
&lt;br /&gt;
=== 3d glasses ===&lt;br /&gt;
I got some 2nd hand 3d glasses, they look exactly like these ones:&lt;br /&gt;
* GH-15 https://www.dhgate.com/product/g15-dlp-3d-active-shutter-glasses-96-144hz/213983026.html&lt;br /&gt;
* Sintron https://www.amazon.de/Sintron-Kompatibel-TDG-BT500A-TDG-BT400A-Deutschland/dp/B015PCWMZ8&lt;br /&gt;
The common name appears to be &amp;quot;G15-DLP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A tear-down here:&lt;br /&gt;
* https://blog.danman.eu/3d-shutter-glasses-teardown/&lt;br /&gt;
&lt;br /&gt;
Interesting documents:&lt;br /&gt;
* http://cmst.curtin.edu.au/wp-content/uploads/sites/4/2016/05/2012-28-woods-helliwell-cross-compatibility_of_shutter_glasses.pdf&lt;br /&gt;
* http://cmst.curtin.edu.au/local/docs/pubs/2011-17-woods-helliwell-3D-Sync-IR.pdf&lt;br /&gt;
&lt;br /&gt;
Someone claims he got something to work with some hacks:&lt;br /&gt;
https://www.avsforum.com/threads/how-i-got-cheap-dlp-link-glasses-to-work-great.1887145/&lt;br /&gt;
&lt;br /&gt;
=== Waterniveaumeter ===&lt;br /&gt;
Op verschillende plekken in Gouda staat er water in de kruipruimte van huizen van bewoners.&lt;br /&gt;
Kunnen we dat meten en inzichtelijk maken, voor bewoners, op een kaart bijvoorbeeld?&lt;br /&gt;
&lt;br /&gt;
Idee:&lt;br /&gt;
* in de kruipruimte plaats je een module die waterhoogte kan meten&lt;br /&gt;
* de module bestaat uit een microcontroller en een afstandsmeter, die de waterhoogte bepaalt&lt;br /&gt;
* de gegevens worden via WiFi doorgestuurd naar een centraal punt, waar de data wordt verwerkt en gevisualiseerd&lt;br /&gt;
* op een webpagina kan je een overzicht zien van alle meters die online zijn&lt;br /&gt;
* de meting wordt gedaan door bijv. een laser-afstandsmeter of een ultrasoon-afstandsmeter&lt;br /&gt;
* voeding? lastig, hoe krijg je 5v naar een potentieel natte plek?&lt;br /&gt;
* kosten? verwachting &amp;lt; E 40,-&lt;br /&gt;
&lt;br /&gt;
In Gouda wordt op veel verschillende plekken de grondwaterstand gemeten, zie https://opendata.munisense.net/portal/wareco-water2/group/581/Gouda-KJ38A , maar:&lt;br /&gt;
* geen visualisatie op de kaart, je ziet alleen de meetlokaties d.m.v. een icoontje!&lt;br /&gt;
* geen meetpunten in Gouda noord!&lt;br /&gt;
&lt;br /&gt;
=== Online bat detector ===&lt;br /&gt;
Idea: use an ultrasonic microphone, connect it to a WebSDR, so people can tune into bat sounds remotely.&lt;br /&gt;
&lt;br /&gt;
=== Raspberry pi airplane tracking ===&lt;br /&gt;
Apparently now you can also participate in MLAT tracking of planes that don&#039;t transmit GPS coordinates themselves.&lt;br /&gt;
&lt;br /&gt;
=== APRS gateway ===&lt;br /&gt;
http://qso365.co.uk/2017/02/a-guide-to-setting-up-an-aprs-receive-only-igate-using-a-raspberry-pi-and-an-rtl-sdr-dongle/&lt;br /&gt;
&lt;br /&gt;
=== JQ6500 ===&lt;br /&gt;
Small inexpensive modules that play mp3 from an internal flash. Could be nice for a custom door bell for example.&lt;br /&gt;
&lt;br /&gt;
More info at: &lt;br /&gt;
* https://www.elecfreaks.com/wiki/index.php?title=JQ6500_Mini_MP3_Module&lt;br /&gt;
* https://sparks.gogo.co.nz/jq6500/index.html&lt;br /&gt;
&lt;br /&gt;
=== FPGA ===&lt;br /&gt;
Cheap FPGA boards and nice applications:&lt;br /&gt;
* https://bitbucket.org/appanp/artificial-neural-networks/wiki/Home/FPGAsAndNeuralNets.md#!sbcs-and-iot-boards &lt;br /&gt;
* [http://nl.aliexpress.com/item/Altera-fpga-cycloneii-ep2c5t144-learning-board-development-board/872520721.html inexpensive ep2c5t144 board] &lt;br /&gt;
* http://land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board&lt;br /&gt;
&lt;br /&gt;
=== Neural networks on low-end hardware ===&lt;br /&gt;
Investigate if you can run a powerful neural network on relatively low-end/cheap/low-power hardware. For example a Raspberry pi.&lt;br /&gt;
A RPI runs Linux, run python, just like some common neural frameworks.&lt;br /&gt;
Do we need hardware acceleration from the GPU and does the RPI GPU support that?&lt;br /&gt;
&lt;br /&gt;
Read list:&lt;br /&gt;
* https://www.zdnet.com/pictures/raspberry-pi-meets-ai-the-projects-that-put-machine-learning-on-the-35-board/&lt;br /&gt;
* https://www.pyimagesearch.com/2017/12/18/keras-deep-learning-raspberry-pi/&lt;br /&gt;
* https://www.indiegogo.com/projects/sipeed-maix-the-world-first-risc-v-64-ai-module#/&lt;br /&gt;
* https://ai.intel.com/intel-neural-compute-stick-2-smarter-faster-plug-and-play-ai-at-the-edge/&lt;br /&gt;
&lt;br /&gt;
Bought a MaixPy:&lt;br /&gt;
* see https://maixpy.sipeed.com/en/&lt;br /&gt;
* see https://www.youtube.com/watch?v=KResVuAIMb4&lt;br /&gt;
* see http://educ8s.tv/sipeed-m1-dock-review/&lt;br /&gt;
* interesting? https://www.instructables.com/id/Transfer-Learning-With-Sipeed-MaiX-and-Arduino-IDE/&lt;br /&gt;
&lt;br /&gt;
=== mini word clock in dutch ===&lt;br /&gt;
Basically an monochrome 8x8 word clock, in Dutch, showing local time in the Netherlands.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bertrik/miniwordclock This git repo] has the current code.&lt;br /&gt;
&lt;br /&gt;
See [https://plus.google.com/103276078656203197145/posts/7ki7rpJzk3a here for a demo] running on an arduino nano.&lt;br /&gt;
&lt;br /&gt;
The plan is to run this from an ESP8266 instead of an arduino nano, so it can get the time from the internet using NTP.&lt;br /&gt;
Andreas Spiess demonstrated on youtube how existing libraries on the ESP8266 can be used to do the local time (including summer-time) calculations.&lt;br /&gt;
&lt;br /&gt;
=== Cypress PSOC5 ===&lt;br /&gt;
Play with the Cypress PSOC5 platform, which combines a ARM Cortex-m3 processor with configurable analog blocks. I&#039;m thinking of combining it with a 24 GHz doppler radar sensor, to process the signal and present it as a USB audio device (stereo signal contains I and Q parts). See [[RadarOnAStick]].&lt;br /&gt;
&lt;br /&gt;
=== Simple Doppler motion sensors ===&lt;br /&gt;
You can find basic doppler microwave motion sensors based on a single transistor, with some weird traces on the PCB very cheaply, for example&lt;br /&gt;
* https://www.aliexpress.com/item/RCWL-0516-microwave-radar-sensor-module-Human-body-induction-switch-module-Intelligent-sensor/32708877914.html&lt;br /&gt;
&lt;br /&gt;
Typically the microwave part of these consists of a single transistor with a rectangular area on one leg and a meandering trace (with lots of vias to the other side) on the other leg.&lt;br /&gt;
The output of this circuit seems to go into a chip very much like the ones used in PIR sensors.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/jdesbonnet/RCWL-0516 for a reverse engineering effort of these doppler radar modules.&lt;br /&gt;
&lt;br /&gt;
=== Bare-bones Arduino bat detector ===&lt;br /&gt;
This is an idea for a very basic heterodyne bat detector, doing signal processing on an Arduino, requiring minimal external components.&lt;br /&gt;
&lt;br /&gt;
The basic principle of a heterodyne detector is that it just mixes (multiplies) the audio signal with a square wave, low-pass filters the result and puts it on a speaker.&lt;br /&gt;
&lt;br /&gt;
Multiplying with a square wave can also be considered to be just alternatively inverting and not-inverting the signal.&lt;br /&gt;
So if you sample an ultrasonic signal at twice the rate you want to multiply, you can just subtract odd samples from even samples and low-pass filter that.&lt;br /&gt;
&lt;br /&gt;
How this can be done in an AVR Arduino:&lt;br /&gt;
* sample the audio signal at twice the detection frequency, say 84 kHz. An AVR should just be able to do that.&lt;br /&gt;
* apply a 1-pole IIR high-pass filter to remove DC bias, this takes one shift instruction and one addition.&lt;br /&gt;
* multiply by the detection frequency, this means just inverting the odd samples.&lt;br /&gt;
* low-pass filter the signal, this can be done using a moving average filter, say 16 samples long (first null at 5.25 kHz). Theoretically, averaging 16 samples should result in two bits extra accuracy. This operation takes some storage, an addition and a subtraction.&lt;br /&gt;
* output the filtered signal using PWM, possibly at the same rate that we are sampling the input audio.&lt;br /&gt;
&lt;br /&gt;
The microphone can be a 40 kHz piezo transducer, to keep it cheap (but also limited to 40 kHz).&lt;br /&gt;
The pre-amplifier can be a single transistor with some resistors around it, providing about 40x gain.&lt;br /&gt;
The arduino does the signal processing (mixing, low-pass filter) to shift the bat audio to human range.&lt;br /&gt;
The speaker amplifier can just be a simple two transistor push-pull circuit, since the output from the Arduino is digital/PWM.&lt;br /&gt;
&lt;br /&gt;
==== AVR Arduino sample rate ====&lt;br /&gt;
As far as I understand, the ADC clock can be set to 1 MHz.&lt;br /&gt;
Conversion takes 13 cycles, so this can be a problem to reach a sample rate above 80 kHz.&lt;br /&gt;
&lt;br /&gt;
=== Indoor radar speed sign ===&lt;br /&gt;
This idea about placing a simple IQ-output radar sensor indoors in the hacker space, do some basic signal processing on the IQ doppler signal and determine movement speed and direction, then display this on a LED display.&lt;br /&gt;
This is of no immediate practical use other than fun, but helps me to gain a bit more experience with microwave radar sensors and eventually build a more effective setup for detecting/counting bats flying in and out of a roost.&lt;br /&gt;
&lt;br /&gt;
Implement this on a PSOC5 platform or on the STM32 using Arduino.&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35213</id>
		<title>User:Bertrik Sikken</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35213"/>
		<updated>2026-04-18T11:13:18Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Action 32x32 display */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Smoel&lt;br /&gt;
 |Name=Bertrik Sikken&lt;br /&gt;
 |Nick=bertrik&lt;br /&gt;
 |Tagline=heb ik niet&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You can reach me at [mailto:bertrik@sikken.nl bertrik@sikken.nl] or [mailto:bertrik@gmail.com bertrik@gmail.com].&lt;br /&gt;
&lt;br /&gt;
Studied Electrical Engineering at Twente University.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Main interests:&lt;br /&gt;
* reverse-engineering things (USB stuff, mp3 players), worked on http://rockbox.org (sansa clip players)&lt;br /&gt;
* studying bats and making electronics for recording/listening to bat sounds&lt;br /&gt;
* radio stuff, in particular software-defined radio, LoRa networks&lt;br /&gt;
* citizen science and open data (particulate matter measurement, noise, water quality)&lt;br /&gt;
* energy-related stuff, visualisation&lt;br /&gt;
&lt;br /&gt;
Projects I work(ed) on ([https://revspace.nl/index.php?title=User:Bertrik_Sikken&amp;amp;action=purge refresh]):&lt;br /&gt;
{{#ask:[[Category:Project]][[Project Contact::bertrik]]&lt;br /&gt;
|?Project Status&lt;br /&gt;
|headers=show&lt;br /&gt;
|link=all&lt;br /&gt;
|order=ASC,ASC&lt;br /&gt;
|sort=Project Status,Project Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project ideas ==&lt;br /&gt;
[[File:always10oclock.jpg|right]]&lt;br /&gt;
[[File:idea.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas I&#039;m thinking about, but have not fully developed into an actual project yet.&lt;br /&gt;
&lt;br /&gt;
https://pine64.com/product/128mb-ox64-sbc-available-on-december-2-2022/&lt;br /&gt;
&lt;br /&gt;
=== Action 32x32 display ===&lt;br /&gt;
Action sells an ACT1026 display. You control it over BLE.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Pupariaa/Bk-Light-AppBypass works to control it&lt;br /&gt;
* software for a similar led display: https://github.com/derkalle4/python3-idotmatrix-client&lt;br /&gt;
&lt;br /&gt;
=== investigate thread/matter ===&lt;br /&gt;
Matter/thread is the new IKEA standard for home automation thins apparently. &lt;br /&gt;
Thread is the wireless protocol, matter is a home automation protocol running on top of thread.&lt;br /&gt;
&lt;br /&gt;
I have a couple of nrf52840, these are good in doing thread.&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* check out openthread&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/openthread/openthread.git&lt;br /&gt;
cd openthread&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Prepare development environment:&lt;br /&gt;
  scripts/bootstrap&lt;br /&gt;
* Build it:&lt;br /&gt;
  ./script/build nrf52840 UART_trans -DOT_LOG_LEVEL=OT_LOG_LEVEL_INFO&lt;br /&gt;
&lt;br /&gt;
Thread on ESP32:&lt;br /&gt;
* on ESP32 C6 https://gist.github.com/gtxaspec/d26198daadfb0a8b0a0edeae2d3fd58f&lt;br /&gt;
* https://github.com/espressif/esp-thread-br&lt;br /&gt;
* https://github.com/espressif/esp-idf/tree/master/examples/openthread/ot_rcp&lt;br /&gt;
&lt;br /&gt;
=== action lsc stekker ===&lt;br /&gt;
https://keetsupport.nl/2024/03/20/how-to-flash-lsc-power-plug-with-esphome/&lt;br /&gt;
&lt;br /&gt;
https://community.home-assistant.io/t/detailed-guide-on-how-to-flash-the-new-tuya-beken-chips-with-openbk7231t/437276&lt;br /&gt;
&lt;br /&gt;
=== sipeed maix dock ===&lt;br /&gt;
Bought this a couple of years ago. Get familiar with this board.&lt;br /&gt;
Can I run a chess program on this, for example?&lt;br /&gt;
&lt;br /&gt;
* https://wiki.sipeed.com/soft/maixpy/en/develop_kit_board/maix_dock.html&lt;br /&gt;
&lt;br /&gt;
=== rfid keyfob ===&lt;br /&gt;
* aliexpress page: https://nl.aliexpress.com/item/1005009569496736.html&lt;br /&gt;
* firmware github: &lt;br /&gt;
** https://github.com/RfidResearchGroup/ChameleonUltra&lt;br /&gt;
** https://github.com/GameTec-live/ChameleonUltraGUI&lt;br /&gt;
&lt;br /&gt;
=== advanced lidars for bat detection ===&lt;br /&gt;
livox:&lt;br /&gt;
* github page https://github.com/Livox-SDK/Livox-SDK/tree/master&lt;br /&gt;
* web page: https://www.livoxtech.com/&lt;br /&gt;
&lt;br /&gt;
=== cubecell meshtastic motion detector ===&lt;br /&gt;
I have a cubecell AB01 board.&lt;br /&gt;
This board is focused on low power, has a connection to attach a solar panel and has a lora radio.&lt;br /&gt;
Relatively small amount of RAM, barely enough to run a LoRaWAN stack but probably plenty to run meshtastic&lt;br /&gt;
&lt;br /&gt;
The plan is to build a simple motion detector from this (using a PIR).&lt;br /&gt;
The PIR can wake up the board from low-power, or a timer can wake it periodically.&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/HelTecAutomation/CubeCell-Arduino/tree/master/libraries/Basics/examples/LowPower&lt;br /&gt;
&lt;br /&gt;
=== configure multitech outdoor gateway ===&lt;br /&gt;
https://www.multitech.net/developer/products/multiconnect-conduit-platform/basestation/&lt;br /&gt;
&lt;br /&gt;
https://multitech.com/product/multitech-conduit-mtcdt-246a-868-eu-gb/&lt;br /&gt;
&lt;br /&gt;
emergency procedure:&lt;br /&gt;
https://www.multitech.net/developer/software/mlinux/using-mlinux/flashing-mlinux-firmware-for-conduit/&lt;br /&gt;
&lt;br /&gt;
=== esp32 wtf ===&lt;br /&gt;
* https://forum.arduino.cc/t/ttgo-lilygo-lora-esp32-26mhz-problem/1353750&lt;br /&gt;
* &amp;quot;26 MHz crystal has been deprecated&amp;quot; https://github.com/espressif/arduino-esp32/issues/10117&lt;br /&gt;
&lt;br /&gt;
=== kakofonie counter ===&lt;br /&gt;
Sample room audio, use neural network to distinguish voices to estimate number of people talking in the past 30 seconds or so.&lt;br /&gt;
Show this number on some kind of display, publish it to MQTT, make a nice graph of it.&lt;br /&gt;
&lt;br /&gt;
Stuff to figure out:&lt;br /&gt;
* this is called &#039;speaker diarization&#039;&lt;br /&gt;
* can it run on an ESP32?&lt;br /&gt;
* make a prototype&lt;br /&gt;
&lt;br /&gt;
=== hypno toad ===&lt;br /&gt;
Put these LEDS https://nl.aliexpress.com/item/1005007583528891.html into https://www.action.com/nl-nl/p/2560347/solar-tuinbeeldje/&lt;br /&gt;
&lt;br /&gt;
Turns out that the default circuit is really basic and output a rough step-up waveform to the LED.&lt;br /&gt;
The self-fading LEDs don&#039;t work very well with that.&lt;br /&gt;
&lt;br /&gt;
Also, putting some IPA on hotglue makes it release really easy.&lt;br /&gt;
&lt;br /&gt;
=== wasbeer / kat classifier ===&lt;br /&gt;
ESP32 with resnet50 neural net to distinguish house cats from other animals, see also:&lt;br /&gt;
* https://ieeexplore.ieee.org/document/10556848/&lt;br /&gt;
&lt;br /&gt;
=== Nespresso brew counter ===&lt;br /&gt;
Several hacker spaces have one of these Nespresso cup coffee makers, but there&#039;s no obvious easy way to monitor usage (monitor ALL the things!).&lt;br /&gt;
Inspired by https://hackaday.com/2021/04/25/arduino-mkr-makes-nespresso-monitoring-easy/ this idea is making an even simpler nespresso monitor,&lt;br /&gt;
using an inexpensive WiFi enabled ESP8266 with an ubiquitous I2S microphone such as the INMP441. &lt;br /&gt;
&lt;br /&gt;
Use this sound monitoring project:&lt;br /&gt;
https://github.com/aleiei/ESP8266-BUG-I2S-MIC&lt;br /&gt;
and turn it into a WiFi connected brew counter.&lt;br /&gt;
&lt;br /&gt;
Software for getting microphone data from an ESP8266/I2S mic into Linux https://github.com/bertrik/EspMicServer&lt;br /&gt;
Nespresso sound is typically 50 Hz with overtones.&lt;br /&gt;
In a recording with the ESP8266, it appears that oddly the 17th harmonic (around 850 Hz) is quite strong.&lt;br /&gt;
&lt;br /&gt;
The plan in the short term is this:&lt;br /&gt;
* apply a gentle IIR filter to subtract any DC bias from the microphone signal&lt;br /&gt;
* calculate autocovariance at offsets 0 and 20 ms (inverse of 50 Hz), representing the total energy and the energy at 50 Hz respectively&lt;br /&gt;
* compare amplitudes to decide about presence of 50 Hz signal, e.g. calculate ratio in dB&lt;br /&gt;
* use this to count the length of time that a 50 Hz signal is heard (increments of 100 ms or so)&lt;br /&gt;
* decide about none / espresso / lungo based on time&lt;br /&gt;
&lt;br /&gt;
Might even integrate with esphome / home assistant later.&lt;br /&gt;
&lt;br /&gt;
=== Remote bat box monitor ===&lt;br /&gt;
Idea:&lt;br /&gt;
* goal: check if remote bat boxes are occupied and identify the species&lt;br /&gt;
* challenges:&lt;br /&gt;
** connectivity: need to transport images/videos (no LoRaWAN), possibly out of range of mobile data networks&lt;br /&gt;
** autonomy: cannot reach the bat box once installed&lt;br /&gt;
** power: no fixed power connection, so probably needs a battery + solar panel&lt;br /&gt;
* design&lt;br /&gt;
** wake up every hour, take a picture, go to sleep, upload photos/videos once per day&lt;br /&gt;
** run from batteries, recharge by solar, rules of thumb&lt;br /&gt;
*** batteries should last for about 10 days&lt;br /&gt;
*** battery should be able to charge in 1 day&lt;br /&gt;
*** consider only 10% of peak solar power&lt;br /&gt;
** KPN &amp;quot;4G-op-zee&amp;quot; somewhat confusing article: https://www.kpn.com/zakelijk/mobiel/roaming/noordzee&lt;br /&gt;
* hardware&lt;br /&gt;
** main processor: raspberry pi zero&lt;br /&gt;
*** raspberry pi power consumption overview: https://www.pidramble.com/wiki/benchmarks/power-consumption&lt;br /&gt;
** this hat to wake up the main CPU: https://www.waveshare.com/wiki/Power_Management_HAT_(B) sold at https://www.kiwi-electronics.com/en/power-management-hat-for-raspberry-pi-with-rtc-and-rp2040-mcu-11373&lt;br /&gt;
&lt;br /&gt;
=== KNMI API ===&lt;br /&gt;
Get familiar with https://developer.dataplatform.knmi.nl/open-data-api&lt;br /&gt;
&lt;br /&gt;
=== Grid frequency measurer with web page ===&lt;br /&gt;
See https://github.com/bertrik/GridFrequency&lt;br /&gt;
SSE source is gridfrequency.local/events&lt;br /&gt;
&lt;br /&gt;
=== WeAct CH55x board ===&lt;br /&gt;
Cheap little boards, using a similar chip as used in USB-serial converters.&lt;br /&gt;
&lt;br /&gt;
The hardware&lt;br /&gt;
https://github.com/WeActStudio/WeActStudio.CH552CoreBoard&lt;br /&gt;
&lt;br /&gt;
Flashing it:&lt;br /&gt;
https://hackaday.io/page/137447-flashing-the-ch552-dev-board-from-the-command-line&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://hackaday.io/project/198238-more-weact-ch5xx&lt;br /&gt;
* https://community.platformio.org/t/manually-adding-support-for-ch55x-controller-by-adding-existing-ardunio-core/41138&lt;br /&gt;
&lt;br /&gt;
=== Zigbee device with esp32 ===&lt;br /&gt;
See https://github.com/P-R-O-C-H-Y/arduino-esp32/blob/8169a434c3e46e1bb7711ebcc04f27267db2093c/libraries/ESP32/examples/Zigbee/Zigbee_Light_Bulb/Zigbee_Light_Bulb.ino&lt;br /&gt;
&lt;br /&gt;
See https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Zigbee&lt;br /&gt;
&lt;br /&gt;
Espressif32 arduino platform git: https://github.com/platformio/platform-espressif32&lt;br /&gt;
&lt;br /&gt;
=== Cameratoezicht in Gouda ===&lt;br /&gt;
Gemeente Gouda publiceert een lijst van camera&#039;s in Gouda, zie&lt;br /&gt;
https://gis.gouda.nl/nl/app/Basisviewer_open#!eAGT8uRiNBRy4ZIRYFKSyKkssjJwdzFxNDMz8TKKsLC0cnb0dQ1y5FIByirgkg3xd43ydPYIAQBXGBFm&lt;br /&gt;
&lt;br /&gt;
Aanmelden (semi-automatisch) bij bijvoorbeeld [https://mapcomplete.org/surveillance Surveillance-under-surveillance] ?&lt;br /&gt;
&lt;br /&gt;
=== SolarEdge ===&lt;br /&gt;
Interact with the solar edge api for PV installations.&lt;br /&gt;
&lt;br /&gt;
https://developers.solaredge.com/&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/solaredge-api&lt;br /&gt;
&lt;br /&gt;
=== Stookalert ===&lt;br /&gt;
Idee: gekleurd lampje dat aangeeft of er op dit moment een stookalert actief is&lt;br /&gt;
&lt;br /&gt;
Implementatie:&lt;br /&gt;
* kijk m.b.v. WiFi locatieservice in welke provincie je je bevindt&lt;br /&gt;
* haal JSON op bij https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* toon de bijbehorende kleur op het lampje&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
* Officiele pagina: https://www.atlasleefomgeving.nl/stookwijzer&lt;br /&gt;
* Achterliggende JSON met toestand per provincie: https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* Er moet ook nog ergens een API zijn die fijnmaziger aangeeft wat de toestand is ...&lt;br /&gt;
&lt;br /&gt;
=== Display of current electricity usage ===&lt;br /&gt;
I have a [https://www.zuidwijk.com/product/slimmelezer-plus/ slimme lezer] connected to the P1 port of my smart electricity meter.&lt;br /&gt;
The default firmware exposes meter readings using an event stream (SSE) at http://slimmelezer.local/events&lt;br /&gt;
&lt;br /&gt;
So for example, you can read this with curl:&lt;br /&gt;
  curl http://slimmelezer.local/events&lt;br /&gt;
With result:&lt;br /&gt;
  event: state&lt;br /&gt;
  data: {&amp;quot;id&amp;quot;:&amp;quot;sensor-power_consumed_phase_1&amp;quot;,&amp;quot;value&amp;quot;:0.046,&amp;quot;state&amp;quot;:&amp;quot;0.046 kW&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Specification of SSE: https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
&lt;br /&gt;
What I would like to do is to read these events and control a simple display to display  the current usage number.&lt;br /&gt;
&lt;br /&gt;
=== Participating in ultrasonic sound project ===&lt;br /&gt;
https://bat-migration-europe.netlify.app/project/&lt;br /&gt;
&lt;br /&gt;
Use an audiomoth for this.&lt;br /&gt;
&lt;br /&gt;
=== ESP32 C3 ===&lt;br /&gt;
* [https://www.espressif.com/en/products/socs/esp32-c3 processor page]&lt;br /&gt;
* [https://wiki.luatos.com/chips/esp32c3/index.html luatos basic esp32 c3 board]&lt;br /&gt;
&lt;br /&gt;
=== Flexible LED ticker ===&lt;br /&gt;
Ordered a flexible 32x8 RGB LED display:&lt;br /&gt;
https://nl.aliexpress.com/item/4001296811800.html&lt;br /&gt;
&lt;br /&gt;
Matching diffuser to be 3D printed:&lt;br /&gt;
https://www.thingiverse.com/thing:1903744&lt;br /&gt;
&lt;br /&gt;
=== Washing machine API ===&lt;br /&gt;
https://tratt.net/laurie/blog/2023/displaying_my_washing_machines_remaining_time_with_curl_jq_pizauth.html&lt;br /&gt;
&lt;br /&gt;
=== TinyML ===&lt;br /&gt;
Investigate TinyML, see https://www.tinyml.org/&lt;br /&gt;
Apparently can run on a RP2040 (raspi pi pico).&lt;br /&gt;
&lt;br /&gt;
https://www.hackster.io/mjrobot/esp32-cam-tinyml-image-classification-fruits-vs-veggies-4ab970&lt;br /&gt;
&lt;br /&gt;
=== Bat box busy signal ===&lt;br /&gt;
My brother built little pyramid &#039;blinkies&#039;: solar cell + Lithium-supercapacitor + harvesting circuit + LED encased in clear expoxy.&lt;br /&gt;
&lt;br /&gt;
Can we add a low-power PIR sensor to this, and make a blinky that blinks if movement was detected by the PIR in the past hour?&lt;br /&gt;
&lt;br /&gt;
=== Super tiny RFID ===&lt;br /&gt;
See https://www.sparkfun.com/products/16464 an almost sand grain size RFID chip, 1.25mmx1.25mmx0.55mm&lt;br /&gt;
&lt;br /&gt;
The accompanying reader &amp;quot;M6E Nano&amp;quot; is still quite expensive at $235.95 : https://www.sparkfun.com/products/14066&lt;br /&gt;
&lt;br /&gt;
Uses the MuRata LXMSJZNCMF-198:&lt;br /&gt;
&amp;quot;This product can be used as an ultra small tag and this can be&lt;br /&gt;
fit on any metal objects, non-metal objects, as well as&lt;br /&gt;
embedding into any objects by glue or adhesive and so on.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See also: ISO18000-63 and EPC global Gen2(v2)&lt;br /&gt;
&lt;br /&gt;
Specification:&lt;br /&gt;
* https://www.gs1.org/standards/rfid/uhf-air-interface-protocol&lt;br /&gt;
&lt;br /&gt;
=== TheThingsNetwork-Sondehub bridge ===&lt;br /&gt;
Uploads balloon telemetry to sondehub.&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/ttnhabbridge/issues/6&lt;br /&gt;
&lt;br /&gt;
=== Actually smart boiler ===&lt;br /&gt;
The boiler for hot water is about half of my electricity bill.&lt;br /&gt;
The idea is to use/build a smart switch that switches it on at time when electricity prices are lowest.&lt;br /&gt;
&lt;br /&gt;
Currently have a &amp;quot;Slimme boiler module&amp;quot; from Eneco, which is *not* actually smart,&lt;br /&gt;
since it allows me no control whatsoever when it switches on (besides cutting the power in the meterkast).&lt;br /&gt;
For example, it will switch on mid-day when my price is high and eneco&#039;s price is low, perhaps good for Eneco, not for me. &lt;br /&gt;
Apparently, they even received a [https://nieuws.eneco.nl/slim-apparaatje-bij-boiler-vangt-pieken-wind--en-zonnestroom-op/ subsidy] for this.&lt;br /&gt;
&lt;br /&gt;
A boiler is a pretty big load, about 3 kW, but it is not inductive.&lt;br /&gt;
&lt;br /&gt;
Alternatives:&lt;br /&gt;
* https://www.shelly.cloud/en-nl/products/product-overview/shelly-plus-1-pm-2-pack/shelly-plus-1-pm&lt;br /&gt;
* https://www.solyxenergy.nl/solar-iboost/ to store excess solar energy in hot water, might also be useful for just controlling a boiler to use cheaper rates&lt;br /&gt;
* tuya smartplug, like https://www.wifilampkoning.nl/merken-slimme-verlichting/tuya/tuya-enkele-smartplug-met-energiemeting ?&lt;br /&gt;
* tuya 20A smart plug: https://nl.aliexpress.com/item/1005003347568206.html&lt;br /&gt;
&lt;br /&gt;
=== Receiving gas meters ===&lt;br /&gt;
Apparently gas meters send gas consumption data to the slimme meter using a wireless link in the 868 MHz band.&lt;br /&gt;
Probably just FSK at 38.4, as mentioned here: https://a35.veron.nl/nieuwe-elektra-en-gasmeters/&lt;br /&gt;
&lt;br /&gt;
Interesting leads:&lt;br /&gt;
* https://github.com/stef/smeter&lt;br /&gt;
* https://www.rtl-sdr.com/reading-household-wireless-utility-meters-with-an-rtl-sdr-and-plotting-the-data-in-home-automation-software/&lt;br /&gt;
* https://github.com/bemasher/rtlamr&lt;br /&gt;
&lt;br /&gt;
=== Multi-network wifi manager ===&lt;br /&gt;
Figure out or create software so that ESP8266/ESP32 wifi manager can use multiple networks to connect (not just one),&lt;br /&gt;
so it allowing storing credentials for more than one network. For example, the network at home, the hacker space, at work.&lt;br /&gt;
Instead of reconfiguring the wifi manager for each network, you just *add* your credentials (and the existing credentials&lt;br /&gt;
are not replaced).&lt;br /&gt;
&lt;br /&gt;
See https://github.com/folkertvanheusden/M.A.X.X&lt;br /&gt;
&lt;br /&gt;
Interesting candidates:&lt;br /&gt;
* https://registry.platformio.org/libraries/martinverges/ESP32%20Wifi%20Manager wifi manager for ESP32, has a REST API for managing wifi network, but is incomplete in the sense that you need to write your own code (e.g. javascript) to actually *use* its API&lt;br /&gt;
* https://github.com/arduino-libraries/Arduino_MultiWiFi is the arduino multi wifi library, to allow connecting to multiple different WiFi networks, but it is not a wifi manager, that starts a captive portal, etc&lt;br /&gt;
&lt;br /&gt;
=== Automated bat counting ===&lt;br /&gt;
Can we automatically count the number of bats from the image of a webcam mounted in a bat colony?&lt;br /&gt;
Perhaps using some kind of AI or machine learning algorithm?&lt;br /&gt;
&lt;br /&gt;
The image in question:&lt;br /&gt;
https://stofradar.nl/coenecoop/&lt;br /&gt;
&lt;br /&gt;
=== Use TheThingsIndoorGateway as Helium/ThingSix hotspot ===&lt;br /&gt;
I have a spare TTIG that could perhaps be used as a Helium gateway, investigate what is possible.&lt;br /&gt;
&lt;br /&gt;
One possiblity is to capture the gateway traffic from the TTN gateway events API, convert uplink data to a format that the Helium network understands and forward it.&lt;br /&gt;
I don&#039;t really care about the Helium crypto tokens, this is just for fun and science.&lt;br /&gt;
&lt;br /&gt;
What I definitely can do:&lt;br /&gt;
* Capture data from the TTN gateway events API, convert it back to Semtech UP format and forward it somewhere to Helium (just not sure where!)&lt;br /&gt;
* See also my https://github.com/bertrik/ttn-gateway-collector project which contains an initial implementation of TTN-to-UDP conversion&lt;br /&gt;
&lt;br /&gt;
Showstoppers:&lt;br /&gt;
* If you want to be a gateway on the Helium network, you have to *pay Helium*! Obviously I don&#039;t want that, I just want to share data to improve *their* network. &lt;br /&gt;
&lt;br /&gt;
Open work:&lt;br /&gt;
* Investigate if Helium has an open uplink API for their hotspots, if so study it etc, without paying the gateway fee&lt;br /&gt;
* Investigate if Thingsix has an open uplink API for their hotspots, if so study it etc, without paying any gateway fee&lt;br /&gt;
* Investigate if Thingsix is just another Helium, with weird crypto money&lt;br /&gt;
&lt;br /&gt;
Interesting stuff:&lt;br /&gt;
* https://docs.helium.com/use-the-network/setup-a-packet-forwarder unfortunately the link to setting up the &#039;light hotspot client&#039; does not work!&lt;br /&gt;
* https://docs.helium.com/mine-hnt/light-hotspots/&lt;br /&gt;
* https://thingsix.com/&lt;br /&gt;
&lt;br /&gt;
=== Adding BLE GATT interface to sensors ===&lt;br /&gt;
The GATT specification allows measurement properties to be defined and transferred continuously over Bluetooth low-energy.&lt;br /&gt;
&lt;br /&gt;
With GATT you can define a collection of properties (e.g. measurement items like temperature/humidity/particulate matter/noise, etc)&lt;br /&gt;
organised in a simple structure of a BLE service.&lt;br /&gt;
The &#039;notification&#039; method allows you to basically push the data continuously to a connected host, e.g. a smart phone.&lt;br /&gt;
&lt;br /&gt;
Services collects characteristic, a characteristic has values with units.&lt;br /&gt;
Each of these (service, characteristic, unit) have their own unique &amp;quot;UUID&amp;quot;.&lt;br /&gt;
This is described in the so-called [https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20Numbers%20Document.pdf 16-bit UUID numbers document]&lt;br /&gt;
&lt;br /&gt;
Interesting stuff in GATT:&lt;br /&gt;
* See GATT_Specification_Supplement_v5 paragraph 3.151, it has a noise characteristic with 1 dB resolution.&lt;br /&gt;
* 0x27C3 is the GATT *unit* for sound pressure&lt;br /&gt;
* 0x181A is the GATT environmental sensing *service*, document name &amp;quot;ESP_V1.0.0.pdf&amp;quot;&lt;br /&gt;
* 0x2A6E is the GATT Characteristic and Object Type for temperature&lt;br /&gt;
* 0x2A6F is the GATT Characteristic and Object Type for humidity&lt;br /&gt;
* 0x2BD5 is the GATT Characteristic and Object Type for Particulate Matter - PM1 Concentration&lt;br /&gt;
* 0x2BD6 is the GATT Characteristic and Object Type for Particulate Matter - PM2.5 Concentration&lt;br /&gt;
* 0x2BD7 is the GATT Characteristic and Object Type for Particulate Matter - PM10 Concentration&lt;br /&gt;
* Unfortunately I cannot find a characteristic for carbon-dioxide (CO2) in the BLE GATT unit document&lt;br /&gt;
&lt;br /&gt;
See also https://programmaticponderings.com/2020/08/04/getting-started-with-bluetooth-low-energy-ble-and-generic-attribute-profile-gatt-specification-for-iot/&lt;br /&gt;
&lt;br /&gt;
=== Reverse engineering XS-8217 bluetooth air quality meter ===&lt;br /&gt;
This is a thing that measures CO2, humidity, temperature, TVOC and formaldehyde.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.liutyi.info/display/CO2/ZN-2CO3+Inside&lt;br /&gt;
&lt;br /&gt;
This teardown looks a lot like my sensor: https://www.youtube.com/watch?v=APnjhMrJChI&lt;br /&gt;
Mine contains a &amp;quot;TPM-300A&amp;quot; sensor for measuring VOC.&lt;br /&gt;
&lt;br /&gt;
It has a bluetooth interface, device name is XS-8217.&lt;br /&gt;
It has a BLE GATT profile, with the following services&lt;br /&gt;
* service 0xC760&lt;br /&gt;
** characteristic 0xC762 (WRITE)&lt;br /&gt;
** characteristic 0xC761 (NOTIFY)&lt;br /&gt;
*** example data: 0x23 0x06 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
*** example data: 0x23 0x08 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
*** data shown on screen was approximately: CO2=418ppm, HCHO=0.003mg/m3, TVOC=0.013mg/m3, temp=24degC, humi=35%&lt;br /&gt;
&lt;br /&gt;
So data in the characteristic 0xC761 seems to have a 4 byte constant header:&lt;br /&gt;
* 0x23&lt;br /&gt;
* length byte&lt;br /&gt;
&lt;br /&gt;
Then we have for the first message: 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0xF1 is temperature in 0.1 degree Celcius most likely (24.1)&lt;br /&gt;
* 0x00 is ...&lt;br /&gt;
* 0x23 is humidity most likely (35)&lt;br /&gt;
* 0x65 is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
And for the second message: 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0x01 0x9A is the CO2 concentration (410)&lt;br /&gt;
* 0x00 0x0A is TVOC most likely (10)&lt;br /&gt;
* 0x00 0x03 is HCHO most likely (3)&lt;br /&gt;
* 0x0E is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
=== ribbon tweeter for bat audio ===&lt;br /&gt;
Someone gave me this idea:&lt;br /&gt;
Use a ribbon tweeter like this for playing back bat audio:&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/4000973201791.html&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/1005002565880660.html&amp;lt;/s&amp;gt;&lt;br /&gt;
https://nl.aliexpress.com/item/1005002635086050.html&lt;br /&gt;
&lt;br /&gt;
The frequency spectrum shows no sign of dropping off at 20 kHz.&lt;br /&gt;
&lt;br /&gt;
=== 3d glasses ===&lt;br /&gt;
I got some 2nd hand 3d glasses, they look exactly like these ones:&lt;br /&gt;
* GH-15 https://www.dhgate.com/product/g15-dlp-3d-active-shutter-glasses-96-144hz/213983026.html&lt;br /&gt;
* Sintron https://www.amazon.de/Sintron-Kompatibel-TDG-BT500A-TDG-BT400A-Deutschland/dp/B015PCWMZ8&lt;br /&gt;
The common name appears to be &amp;quot;G15-DLP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A tear-down here:&lt;br /&gt;
* https://blog.danman.eu/3d-shutter-glasses-teardown/&lt;br /&gt;
&lt;br /&gt;
Interesting documents:&lt;br /&gt;
* http://cmst.curtin.edu.au/wp-content/uploads/sites/4/2016/05/2012-28-woods-helliwell-cross-compatibility_of_shutter_glasses.pdf&lt;br /&gt;
* http://cmst.curtin.edu.au/local/docs/pubs/2011-17-woods-helliwell-3D-Sync-IR.pdf&lt;br /&gt;
&lt;br /&gt;
Someone claims he got something to work with some hacks:&lt;br /&gt;
https://www.avsforum.com/threads/how-i-got-cheap-dlp-link-glasses-to-work-great.1887145/&lt;br /&gt;
&lt;br /&gt;
=== Waterniveaumeter ===&lt;br /&gt;
Op verschillende plekken in Gouda staat er water in de kruipruimte van huizen van bewoners.&lt;br /&gt;
Kunnen we dat meten en inzichtelijk maken, voor bewoners, op een kaart bijvoorbeeld?&lt;br /&gt;
&lt;br /&gt;
Idee:&lt;br /&gt;
* in de kruipruimte plaats je een module die waterhoogte kan meten&lt;br /&gt;
* de module bestaat uit een microcontroller en een afstandsmeter, die de waterhoogte bepaalt&lt;br /&gt;
* de gegevens worden via WiFi doorgestuurd naar een centraal punt, waar de data wordt verwerkt en gevisualiseerd&lt;br /&gt;
* op een webpagina kan je een overzicht zien van alle meters die online zijn&lt;br /&gt;
* de meting wordt gedaan door bijv. een laser-afstandsmeter of een ultrasoon-afstandsmeter&lt;br /&gt;
* voeding? lastig, hoe krijg je 5v naar een potentieel natte plek?&lt;br /&gt;
* kosten? verwachting &amp;lt; E 40,-&lt;br /&gt;
&lt;br /&gt;
In Gouda wordt op veel verschillende plekken de grondwaterstand gemeten, zie https://opendata.munisense.net/portal/wareco-water2/group/581/Gouda-KJ38A , maar:&lt;br /&gt;
* geen visualisatie op de kaart, je ziet alleen de meetlokaties d.m.v. een icoontje!&lt;br /&gt;
* geen meetpunten in Gouda noord!&lt;br /&gt;
&lt;br /&gt;
=== Online bat detector ===&lt;br /&gt;
Idea: use an ultrasonic microphone, connect it to a WebSDR, so people can tune into bat sounds remotely.&lt;br /&gt;
&lt;br /&gt;
=== Raspberry pi airplane tracking ===&lt;br /&gt;
Apparently now you can also participate in MLAT tracking of planes that don&#039;t transmit GPS coordinates themselves.&lt;br /&gt;
&lt;br /&gt;
=== APRS gateway ===&lt;br /&gt;
http://qso365.co.uk/2017/02/a-guide-to-setting-up-an-aprs-receive-only-igate-using-a-raspberry-pi-and-an-rtl-sdr-dongle/&lt;br /&gt;
&lt;br /&gt;
=== JQ6500 ===&lt;br /&gt;
Small inexpensive modules that play mp3 from an internal flash. Could be nice for a custom door bell for example.&lt;br /&gt;
&lt;br /&gt;
More info at: &lt;br /&gt;
* https://www.elecfreaks.com/wiki/index.php?title=JQ6500_Mini_MP3_Module&lt;br /&gt;
* https://sparks.gogo.co.nz/jq6500/index.html&lt;br /&gt;
&lt;br /&gt;
=== FPGA ===&lt;br /&gt;
Cheap FPGA boards and nice applications:&lt;br /&gt;
* https://bitbucket.org/appanp/artificial-neural-networks/wiki/Home/FPGAsAndNeuralNets.md#!sbcs-and-iot-boards &lt;br /&gt;
* [http://nl.aliexpress.com/item/Altera-fpga-cycloneii-ep2c5t144-learning-board-development-board/872520721.html inexpensive ep2c5t144 board] &lt;br /&gt;
* http://land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board&lt;br /&gt;
&lt;br /&gt;
=== Neural networks on low-end hardware ===&lt;br /&gt;
Investigate if you can run a powerful neural network on relatively low-end/cheap/low-power hardware. For example a Raspberry pi.&lt;br /&gt;
A RPI runs Linux, run python, just like some common neural frameworks.&lt;br /&gt;
Do we need hardware acceleration from the GPU and does the RPI GPU support that?&lt;br /&gt;
&lt;br /&gt;
Read list:&lt;br /&gt;
* https://www.zdnet.com/pictures/raspberry-pi-meets-ai-the-projects-that-put-machine-learning-on-the-35-board/&lt;br /&gt;
* https://www.pyimagesearch.com/2017/12/18/keras-deep-learning-raspberry-pi/&lt;br /&gt;
* https://www.indiegogo.com/projects/sipeed-maix-the-world-first-risc-v-64-ai-module#/&lt;br /&gt;
* https://ai.intel.com/intel-neural-compute-stick-2-smarter-faster-plug-and-play-ai-at-the-edge/&lt;br /&gt;
&lt;br /&gt;
Bought a MaixPy:&lt;br /&gt;
* see https://maixpy.sipeed.com/en/&lt;br /&gt;
* see https://www.youtube.com/watch?v=KResVuAIMb4&lt;br /&gt;
* see http://educ8s.tv/sipeed-m1-dock-review/&lt;br /&gt;
* interesting? https://www.instructables.com/id/Transfer-Learning-With-Sipeed-MaiX-and-Arduino-IDE/&lt;br /&gt;
&lt;br /&gt;
=== mini word clock in dutch ===&lt;br /&gt;
Basically an monochrome 8x8 word clock, in Dutch, showing local time in the Netherlands.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bertrik/miniwordclock This git repo] has the current code.&lt;br /&gt;
&lt;br /&gt;
See [https://plus.google.com/103276078656203197145/posts/7ki7rpJzk3a here for a demo] running on an arduino nano.&lt;br /&gt;
&lt;br /&gt;
The plan is to run this from an ESP8266 instead of an arduino nano, so it can get the time from the internet using NTP.&lt;br /&gt;
Andreas Spiess demonstrated on youtube how existing libraries on the ESP8266 can be used to do the local time (including summer-time) calculations.&lt;br /&gt;
&lt;br /&gt;
=== Cypress PSOC5 ===&lt;br /&gt;
Play with the Cypress PSOC5 platform, which combines a ARM Cortex-m3 processor with configurable analog blocks. I&#039;m thinking of combining it with a 24 GHz doppler radar sensor, to process the signal and present it as a USB audio device (stereo signal contains I and Q parts). See [[RadarOnAStick]].&lt;br /&gt;
&lt;br /&gt;
=== Simple Doppler motion sensors ===&lt;br /&gt;
You can find basic doppler microwave motion sensors based on a single transistor, with some weird traces on the PCB very cheaply, for example&lt;br /&gt;
* https://www.aliexpress.com/item/RCWL-0516-microwave-radar-sensor-module-Human-body-induction-switch-module-Intelligent-sensor/32708877914.html&lt;br /&gt;
&lt;br /&gt;
Typically the microwave part of these consists of a single transistor with a rectangular area on one leg and a meandering trace (with lots of vias to the other side) on the other leg.&lt;br /&gt;
The output of this circuit seems to go into a chip very much like the ones used in PIR sensors.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/jdesbonnet/RCWL-0516 for a reverse engineering effort of these doppler radar modules.&lt;br /&gt;
&lt;br /&gt;
=== Bare-bones Arduino bat detector ===&lt;br /&gt;
This is an idea for a very basic heterodyne bat detector, doing signal processing on an Arduino, requiring minimal external components.&lt;br /&gt;
&lt;br /&gt;
The basic principle of a heterodyne detector is that it just mixes (multiplies) the audio signal with a square wave, low-pass filters the result and puts it on a speaker.&lt;br /&gt;
&lt;br /&gt;
Multiplying with a square wave can also be considered to be just alternatively inverting and not-inverting the signal.&lt;br /&gt;
So if you sample an ultrasonic signal at twice the rate you want to multiply, you can just subtract odd samples from even samples and low-pass filter that.&lt;br /&gt;
&lt;br /&gt;
How this can be done in an AVR Arduino:&lt;br /&gt;
* sample the audio signal at twice the detection frequency, say 84 kHz. An AVR should just be able to do that.&lt;br /&gt;
* apply a 1-pole IIR high-pass filter to remove DC bias, this takes one shift instruction and one addition.&lt;br /&gt;
* multiply by the detection frequency, this means just inverting the odd samples.&lt;br /&gt;
* low-pass filter the signal, this can be done using a moving average filter, say 16 samples long (first null at 5.25 kHz). Theoretically, averaging 16 samples should result in two bits extra accuracy. This operation takes some storage, an addition and a subtraction.&lt;br /&gt;
* output the filtered signal using PWM, possibly at the same rate that we are sampling the input audio.&lt;br /&gt;
&lt;br /&gt;
The microphone can be a 40 kHz piezo transducer, to keep it cheap (but also limited to 40 kHz).&lt;br /&gt;
The pre-amplifier can be a single transistor with some resistors around it, providing about 40x gain.&lt;br /&gt;
The arduino does the signal processing (mixing, low-pass filter) to shift the bat audio to human range.&lt;br /&gt;
The speaker amplifier can just be a simple two transistor push-pull circuit, since the output from the Arduino is digital/PWM.&lt;br /&gt;
&lt;br /&gt;
==== AVR Arduino sample rate ====&lt;br /&gt;
As far as I understand, the ADC clock can be set to 1 MHz.&lt;br /&gt;
Conversion takes 13 cycles, so this can be a problem to reach a sample rate above 80 kHz.&lt;br /&gt;
&lt;br /&gt;
=== Indoor radar speed sign ===&lt;br /&gt;
This idea about placing a simple IQ-output radar sensor indoors in the hacker space, do some basic signal processing on the IQ doppler signal and determine movement speed and direction, then display this on a LED display.&lt;br /&gt;
This is of no immediate practical use other than fun, but helps me to gain a bit more experience with microwave radar sensors and eventually build a more effective setup for detecting/counting bats flying in and out of a roost.&lt;br /&gt;
&lt;br /&gt;
Implement this on a PSOC5 platform or on the STM32 using Arduino.&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35212</id>
		<title>User:Bertrik Sikken</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35212"/>
		<updated>2026-04-18T11:08:46Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Project ideas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Smoel&lt;br /&gt;
 |Name=Bertrik Sikken&lt;br /&gt;
 |Nick=bertrik&lt;br /&gt;
 |Tagline=heb ik niet&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You can reach me at [mailto:bertrik@sikken.nl bertrik@sikken.nl] or [mailto:bertrik@gmail.com bertrik@gmail.com].&lt;br /&gt;
&lt;br /&gt;
Studied Electrical Engineering at Twente University.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Main interests:&lt;br /&gt;
* reverse-engineering things (USB stuff, mp3 players), worked on http://rockbox.org (sansa clip players)&lt;br /&gt;
* studying bats and making electronics for recording/listening to bat sounds&lt;br /&gt;
* radio stuff, in particular software-defined radio, LoRa networks&lt;br /&gt;
* citizen science and open data (particulate matter measurement, noise, water quality)&lt;br /&gt;
* energy-related stuff, visualisation&lt;br /&gt;
&lt;br /&gt;
Projects I work(ed) on ([https://revspace.nl/index.php?title=User:Bertrik_Sikken&amp;amp;action=purge refresh]):&lt;br /&gt;
{{#ask:[[Category:Project]][[Project Contact::bertrik]]&lt;br /&gt;
|?Project Status&lt;br /&gt;
|headers=show&lt;br /&gt;
|link=all&lt;br /&gt;
|order=ASC,ASC&lt;br /&gt;
|sort=Project Status,Project Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project ideas ==&lt;br /&gt;
[[File:always10oclock.jpg|right]]&lt;br /&gt;
[[File:idea.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas I&#039;m thinking about, but have not fully developed into an actual project yet.&lt;br /&gt;
&lt;br /&gt;
https://pine64.com/product/128mb-ox64-sbc-available-on-december-2-2022/&lt;br /&gt;
&lt;br /&gt;
=== Action 32x32 display ===&lt;br /&gt;
Action sells an ACT1026 display. You control it over BLE.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Pupariaa/Bk-Light-AppBypass works to control it&lt;br /&gt;
&lt;br /&gt;
=== investigate thread/matter ===&lt;br /&gt;
Matter/thread is the new IKEA standard for home automation thins apparently. &lt;br /&gt;
Thread is the wireless protocol, matter is a home automation protocol running on top of thread.&lt;br /&gt;
&lt;br /&gt;
I have a couple of nrf52840, these are good in doing thread.&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* check out openthread&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/openthread/openthread.git&lt;br /&gt;
cd openthread&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Prepare development environment:&lt;br /&gt;
  scripts/bootstrap&lt;br /&gt;
* Build it:&lt;br /&gt;
  ./script/build nrf52840 UART_trans -DOT_LOG_LEVEL=OT_LOG_LEVEL_INFO&lt;br /&gt;
&lt;br /&gt;
Thread on ESP32:&lt;br /&gt;
* on ESP32 C6 https://gist.github.com/gtxaspec/d26198daadfb0a8b0a0edeae2d3fd58f&lt;br /&gt;
* https://github.com/espressif/esp-thread-br&lt;br /&gt;
* https://github.com/espressif/esp-idf/tree/master/examples/openthread/ot_rcp&lt;br /&gt;
&lt;br /&gt;
=== action lsc stekker ===&lt;br /&gt;
https://keetsupport.nl/2024/03/20/how-to-flash-lsc-power-plug-with-esphome/&lt;br /&gt;
&lt;br /&gt;
https://community.home-assistant.io/t/detailed-guide-on-how-to-flash-the-new-tuya-beken-chips-with-openbk7231t/437276&lt;br /&gt;
&lt;br /&gt;
=== sipeed maix dock ===&lt;br /&gt;
Bought this a couple of years ago. Get familiar with this board.&lt;br /&gt;
Can I run a chess program on this, for example?&lt;br /&gt;
&lt;br /&gt;
* https://wiki.sipeed.com/soft/maixpy/en/develop_kit_board/maix_dock.html&lt;br /&gt;
&lt;br /&gt;
=== rfid keyfob ===&lt;br /&gt;
* aliexpress page: https://nl.aliexpress.com/item/1005009569496736.html&lt;br /&gt;
* firmware github: &lt;br /&gt;
** https://github.com/RfidResearchGroup/ChameleonUltra&lt;br /&gt;
** https://github.com/GameTec-live/ChameleonUltraGUI&lt;br /&gt;
&lt;br /&gt;
=== advanced lidars for bat detection ===&lt;br /&gt;
livox:&lt;br /&gt;
* github page https://github.com/Livox-SDK/Livox-SDK/tree/master&lt;br /&gt;
* web page: https://www.livoxtech.com/&lt;br /&gt;
&lt;br /&gt;
=== cubecell meshtastic motion detector ===&lt;br /&gt;
I have a cubecell AB01 board.&lt;br /&gt;
This board is focused on low power, has a connection to attach a solar panel and has a lora radio.&lt;br /&gt;
Relatively small amount of RAM, barely enough to run a LoRaWAN stack but probably plenty to run meshtastic&lt;br /&gt;
&lt;br /&gt;
The plan is to build a simple motion detector from this (using a PIR).&lt;br /&gt;
The PIR can wake up the board from low-power, or a timer can wake it periodically.&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/HelTecAutomation/CubeCell-Arduino/tree/master/libraries/Basics/examples/LowPower&lt;br /&gt;
&lt;br /&gt;
=== configure multitech outdoor gateway ===&lt;br /&gt;
https://www.multitech.net/developer/products/multiconnect-conduit-platform/basestation/&lt;br /&gt;
&lt;br /&gt;
https://multitech.com/product/multitech-conduit-mtcdt-246a-868-eu-gb/&lt;br /&gt;
&lt;br /&gt;
emergency procedure:&lt;br /&gt;
https://www.multitech.net/developer/software/mlinux/using-mlinux/flashing-mlinux-firmware-for-conduit/&lt;br /&gt;
&lt;br /&gt;
=== esp32 wtf ===&lt;br /&gt;
* https://forum.arduino.cc/t/ttgo-lilygo-lora-esp32-26mhz-problem/1353750&lt;br /&gt;
* &amp;quot;26 MHz crystal has been deprecated&amp;quot; https://github.com/espressif/arduino-esp32/issues/10117&lt;br /&gt;
&lt;br /&gt;
=== kakofonie counter ===&lt;br /&gt;
Sample room audio, use neural network to distinguish voices to estimate number of people talking in the past 30 seconds or so.&lt;br /&gt;
Show this number on some kind of display, publish it to MQTT, make a nice graph of it.&lt;br /&gt;
&lt;br /&gt;
Stuff to figure out:&lt;br /&gt;
* this is called &#039;speaker diarization&#039;&lt;br /&gt;
* can it run on an ESP32?&lt;br /&gt;
* make a prototype&lt;br /&gt;
&lt;br /&gt;
=== hypno toad ===&lt;br /&gt;
Put these LEDS https://nl.aliexpress.com/item/1005007583528891.html into https://www.action.com/nl-nl/p/2560347/solar-tuinbeeldje/&lt;br /&gt;
&lt;br /&gt;
Turns out that the default circuit is really basic and output a rough step-up waveform to the LED.&lt;br /&gt;
The self-fading LEDs don&#039;t work very well with that.&lt;br /&gt;
&lt;br /&gt;
Also, putting some IPA on hotglue makes it release really easy.&lt;br /&gt;
&lt;br /&gt;
=== wasbeer / kat classifier ===&lt;br /&gt;
ESP32 with resnet50 neural net to distinguish house cats from other animals, see also:&lt;br /&gt;
* https://ieeexplore.ieee.org/document/10556848/&lt;br /&gt;
&lt;br /&gt;
=== Nespresso brew counter ===&lt;br /&gt;
Several hacker spaces have one of these Nespresso cup coffee makers, but there&#039;s no obvious easy way to monitor usage (monitor ALL the things!).&lt;br /&gt;
Inspired by https://hackaday.com/2021/04/25/arduino-mkr-makes-nespresso-monitoring-easy/ this idea is making an even simpler nespresso monitor,&lt;br /&gt;
using an inexpensive WiFi enabled ESP8266 with an ubiquitous I2S microphone such as the INMP441. &lt;br /&gt;
&lt;br /&gt;
Use this sound monitoring project:&lt;br /&gt;
https://github.com/aleiei/ESP8266-BUG-I2S-MIC&lt;br /&gt;
and turn it into a WiFi connected brew counter.&lt;br /&gt;
&lt;br /&gt;
Software for getting microphone data from an ESP8266/I2S mic into Linux https://github.com/bertrik/EspMicServer&lt;br /&gt;
Nespresso sound is typically 50 Hz with overtones.&lt;br /&gt;
In a recording with the ESP8266, it appears that oddly the 17th harmonic (around 850 Hz) is quite strong.&lt;br /&gt;
&lt;br /&gt;
The plan in the short term is this:&lt;br /&gt;
* apply a gentle IIR filter to subtract any DC bias from the microphone signal&lt;br /&gt;
* calculate autocovariance at offsets 0 and 20 ms (inverse of 50 Hz), representing the total energy and the energy at 50 Hz respectively&lt;br /&gt;
* compare amplitudes to decide about presence of 50 Hz signal, e.g. calculate ratio in dB&lt;br /&gt;
* use this to count the length of time that a 50 Hz signal is heard (increments of 100 ms or so)&lt;br /&gt;
* decide about none / espresso / lungo based on time&lt;br /&gt;
&lt;br /&gt;
Might even integrate with esphome / home assistant later.&lt;br /&gt;
&lt;br /&gt;
=== Remote bat box monitor ===&lt;br /&gt;
Idea:&lt;br /&gt;
* goal: check if remote bat boxes are occupied and identify the species&lt;br /&gt;
* challenges:&lt;br /&gt;
** connectivity: need to transport images/videos (no LoRaWAN), possibly out of range of mobile data networks&lt;br /&gt;
** autonomy: cannot reach the bat box once installed&lt;br /&gt;
** power: no fixed power connection, so probably needs a battery + solar panel&lt;br /&gt;
* design&lt;br /&gt;
** wake up every hour, take a picture, go to sleep, upload photos/videos once per day&lt;br /&gt;
** run from batteries, recharge by solar, rules of thumb&lt;br /&gt;
*** batteries should last for about 10 days&lt;br /&gt;
*** battery should be able to charge in 1 day&lt;br /&gt;
*** consider only 10% of peak solar power&lt;br /&gt;
** KPN &amp;quot;4G-op-zee&amp;quot; somewhat confusing article: https://www.kpn.com/zakelijk/mobiel/roaming/noordzee&lt;br /&gt;
* hardware&lt;br /&gt;
** main processor: raspberry pi zero&lt;br /&gt;
*** raspberry pi power consumption overview: https://www.pidramble.com/wiki/benchmarks/power-consumption&lt;br /&gt;
** this hat to wake up the main CPU: https://www.waveshare.com/wiki/Power_Management_HAT_(B) sold at https://www.kiwi-electronics.com/en/power-management-hat-for-raspberry-pi-with-rtc-and-rp2040-mcu-11373&lt;br /&gt;
&lt;br /&gt;
=== KNMI API ===&lt;br /&gt;
Get familiar with https://developer.dataplatform.knmi.nl/open-data-api&lt;br /&gt;
&lt;br /&gt;
=== Grid frequency measurer with web page ===&lt;br /&gt;
See https://github.com/bertrik/GridFrequency&lt;br /&gt;
SSE source is gridfrequency.local/events&lt;br /&gt;
&lt;br /&gt;
=== WeAct CH55x board ===&lt;br /&gt;
Cheap little boards, using a similar chip as used in USB-serial converters.&lt;br /&gt;
&lt;br /&gt;
The hardware&lt;br /&gt;
https://github.com/WeActStudio/WeActStudio.CH552CoreBoard&lt;br /&gt;
&lt;br /&gt;
Flashing it:&lt;br /&gt;
https://hackaday.io/page/137447-flashing-the-ch552-dev-board-from-the-command-line&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://hackaday.io/project/198238-more-weact-ch5xx&lt;br /&gt;
* https://community.platformio.org/t/manually-adding-support-for-ch55x-controller-by-adding-existing-ardunio-core/41138&lt;br /&gt;
&lt;br /&gt;
=== Zigbee device with esp32 ===&lt;br /&gt;
See https://github.com/P-R-O-C-H-Y/arduino-esp32/blob/8169a434c3e46e1bb7711ebcc04f27267db2093c/libraries/ESP32/examples/Zigbee/Zigbee_Light_Bulb/Zigbee_Light_Bulb.ino&lt;br /&gt;
&lt;br /&gt;
See https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Zigbee&lt;br /&gt;
&lt;br /&gt;
Espressif32 arduino platform git: https://github.com/platformio/platform-espressif32&lt;br /&gt;
&lt;br /&gt;
=== Cameratoezicht in Gouda ===&lt;br /&gt;
Gemeente Gouda publiceert een lijst van camera&#039;s in Gouda, zie&lt;br /&gt;
https://gis.gouda.nl/nl/app/Basisviewer_open#!eAGT8uRiNBRy4ZIRYFKSyKkssjJwdzFxNDMz8TKKsLC0cnb0dQ1y5FIByirgkg3xd43ydPYIAQBXGBFm&lt;br /&gt;
&lt;br /&gt;
Aanmelden (semi-automatisch) bij bijvoorbeeld [https://mapcomplete.org/surveillance Surveillance-under-surveillance] ?&lt;br /&gt;
&lt;br /&gt;
=== SolarEdge ===&lt;br /&gt;
Interact with the solar edge api for PV installations.&lt;br /&gt;
&lt;br /&gt;
https://developers.solaredge.com/&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/solaredge-api&lt;br /&gt;
&lt;br /&gt;
=== Stookalert ===&lt;br /&gt;
Idee: gekleurd lampje dat aangeeft of er op dit moment een stookalert actief is&lt;br /&gt;
&lt;br /&gt;
Implementatie:&lt;br /&gt;
* kijk m.b.v. WiFi locatieservice in welke provincie je je bevindt&lt;br /&gt;
* haal JSON op bij https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* toon de bijbehorende kleur op het lampje&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
* Officiele pagina: https://www.atlasleefomgeving.nl/stookwijzer&lt;br /&gt;
* Achterliggende JSON met toestand per provincie: https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* Er moet ook nog ergens een API zijn die fijnmaziger aangeeft wat de toestand is ...&lt;br /&gt;
&lt;br /&gt;
=== Display of current electricity usage ===&lt;br /&gt;
I have a [https://www.zuidwijk.com/product/slimmelezer-plus/ slimme lezer] connected to the P1 port of my smart electricity meter.&lt;br /&gt;
The default firmware exposes meter readings using an event stream (SSE) at http://slimmelezer.local/events&lt;br /&gt;
&lt;br /&gt;
So for example, you can read this with curl:&lt;br /&gt;
  curl http://slimmelezer.local/events&lt;br /&gt;
With result:&lt;br /&gt;
  event: state&lt;br /&gt;
  data: {&amp;quot;id&amp;quot;:&amp;quot;sensor-power_consumed_phase_1&amp;quot;,&amp;quot;value&amp;quot;:0.046,&amp;quot;state&amp;quot;:&amp;quot;0.046 kW&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Specification of SSE: https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
&lt;br /&gt;
What I would like to do is to read these events and control a simple display to display  the current usage number.&lt;br /&gt;
&lt;br /&gt;
=== Participating in ultrasonic sound project ===&lt;br /&gt;
https://bat-migration-europe.netlify.app/project/&lt;br /&gt;
&lt;br /&gt;
Use an audiomoth for this.&lt;br /&gt;
&lt;br /&gt;
=== ESP32 C3 ===&lt;br /&gt;
* [https://www.espressif.com/en/products/socs/esp32-c3 processor page]&lt;br /&gt;
* [https://wiki.luatos.com/chips/esp32c3/index.html luatos basic esp32 c3 board]&lt;br /&gt;
&lt;br /&gt;
=== Flexible LED ticker ===&lt;br /&gt;
Ordered a flexible 32x8 RGB LED display:&lt;br /&gt;
https://nl.aliexpress.com/item/4001296811800.html&lt;br /&gt;
&lt;br /&gt;
Matching diffuser to be 3D printed:&lt;br /&gt;
https://www.thingiverse.com/thing:1903744&lt;br /&gt;
&lt;br /&gt;
=== Washing machine API ===&lt;br /&gt;
https://tratt.net/laurie/blog/2023/displaying_my_washing_machines_remaining_time_with_curl_jq_pizauth.html&lt;br /&gt;
&lt;br /&gt;
=== TinyML ===&lt;br /&gt;
Investigate TinyML, see https://www.tinyml.org/&lt;br /&gt;
Apparently can run on a RP2040 (raspi pi pico).&lt;br /&gt;
&lt;br /&gt;
https://www.hackster.io/mjrobot/esp32-cam-tinyml-image-classification-fruits-vs-veggies-4ab970&lt;br /&gt;
&lt;br /&gt;
=== Bat box busy signal ===&lt;br /&gt;
My brother built little pyramid &#039;blinkies&#039;: solar cell + Lithium-supercapacitor + harvesting circuit + LED encased in clear expoxy.&lt;br /&gt;
&lt;br /&gt;
Can we add a low-power PIR sensor to this, and make a blinky that blinks if movement was detected by the PIR in the past hour?&lt;br /&gt;
&lt;br /&gt;
=== Super tiny RFID ===&lt;br /&gt;
See https://www.sparkfun.com/products/16464 an almost sand grain size RFID chip, 1.25mmx1.25mmx0.55mm&lt;br /&gt;
&lt;br /&gt;
The accompanying reader &amp;quot;M6E Nano&amp;quot; is still quite expensive at $235.95 : https://www.sparkfun.com/products/14066&lt;br /&gt;
&lt;br /&gt;
Uses the MuRata LXMSJZNCMF-198:&lt;br /&gt;
&amp;quot;This product can be used as an ultra small tag and this can be&lt;br /&gt;
fit on any metal objects, non-metal objects, as well as&lt;br /&gt;
embedding into any objects by glue or adhesive and so on.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See also: ISO18000-63 and EPC global Gen2(v2)&lt;br /&gt;
&lt;br /&gt;
Specification:&lt;br /&gt;
* https://www.gs1.org/standards/rfid/uhf-air-interface-protocol&lt;br /&gt;
&lt;br /&gt;
=== TheThingsNetwork-Sondehub bridge ===&lt;br /&gt;
Uploads balloon telemetry to sondehub.&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/ttnhabbridge/issues/6&lt;br /&gt;
&lt;br /&gt;
=== Actually smart boiler ===&lt;br /&gt;
The boiler for hot water is about half of my electricity bill.&lt;br /&gt;
The idea is to use/build a smart switch that switches it on at time when electricity prices are lowest.&lt;br /&gt;
&lt;br /&gt;
Currently have a &amp;quot;Slimme boiler module&amp;quot; from Eneco, which is *not* actually smart,&lt;br /&gt;
since it allows me no control whatsoever when it switches on (besides cutting the power in the meterkast).&lt;br /&gt;
For example, it will switch on mid-day when my price is high and eneco&#039;s price is low, perhaps good for Eneco, not for me. &lt;br /&gt;
Apparently, they even received a [https://nieuws.eneco.nl/slim-apparaatje-bij-boiler-vangt-pieken-wind--en-zonnestroom-op/ subsidy] for this.&lt;br /&gt;
&lt;br /&gt;
A boiler is a pretty big load, about 3 kW, but it is not inductive.&lt;br /&gt;
&lt;br /&gt;
Alternatives:&lt;br /&gt;
* https://www.shelly.cloud/en-nl/products/product-overview/shelly-plus-1-pm-2-pack/shelly-plus-1-pm&lt;br /&gt;
* https://www.solyxenergy.nl/solar-iboost/ to store excess solar energy in hot water, might also be useful for just controlling a boiler to use cheaper rates&lt;br /&gt;
* tuya smartplug, like https://www.wifilampkoning.nl/merken-slimme-verlichting/tuya/tuya-enkele-smartplug-met-energiemeting ?&lt;br /&gt;
* tuya 20A smart plug: https://nl.aliexpress.com/item/1005003347568206.html&lt;br /&gt;
&lt;br /&gt;
=== Receiving gas meters ===&lt;br /&gt;
Apparently gas meters send gas consumption data to the slimme meter using a wireless link in the 868 MHz band.&lt;br /&gt;
Probably just FSK at 38.4, as mentioned here: https://a35.veron.nl/nieuwe-elektra-en-gasmeters/&lt;br /&gt;
&lt;br /&gt;
Interesting leads:&lt;br /&gt;
* https://github.com/stef/smeter&lt;br /&gt;
* https://www.rtl-sdr.com/reading-household-wireless-utility-meters-with-an-rtl-sdr-and-plotting-the-data-in-home-automation-software/&lt;br /&gt;
* https://github.com/bemasher/rtlamr&lt;br /&gt;
&lt;br /&gt;
=== Multi-network wifi manager ===&lt;br /&gt;
Figure out or create software so that ESP8266/ESP32 wifi manager can use multiple networks to connect (not just one),&lt;br /&gt;
so it allowing storing credentials for more than one network. For example, the network at home, the hacker space, at work.&lt;br /&gt;
Instead of reconfiguring the wifi manager for each network, you just *add* your credentials (and the existing credentials&lt;br /&gt;
are not replaced).&lt;br /&gt;
&lt;br /&gt;
See https://github.com/folkertvanheusden/M.A.X.X&lt;br /&gt;
&lt;br /&gt;
Interesting candidates:&lt;br /&gt;
* https://registry.platformio.org/libraries/martinverges/ESP32%20Wifi%20Manager wifi manager for ESP32, has a REST API for managing wifi network, but is incomplete in the sense that you need to write your own code (e.g. javascript) to actually *use* its API&lt;br /&gt;
* https://github.com/arduino-libraries/Arduino_MultiWiFi is the arduino multi wifi library, to allow connecting to multiple different WiFi networks, but it is not a wifi manager, that starts a captive portal, etc&lt;br /&gt;
&lt;br /&gt;
=== Automated bat counting ===&lt;br /&gt;
Can we automatically count the number of bats from the image of a webcam mounted in a bat colony?&lt;br /&gt;
Perhaps using some kind of AI or machine learning algorithm?&lt;br /&gt;
&lt;br /&gt;
The image in question:&lt;br /&gt;
https://stofradar.nl/coenecoop/&lt;br /&gt;
&lt;br /&gt;
=== Use TheThingsIndoorGateway as Helium/ThingSix hotspot ===&lt;br /&gt;
I have a spare TTIG that could perhaps be used as a Helium gateway, investigate what is possible.&lt;br /&gt;
&lt;br /&gt;
One possiblity is to capture the gateway traffic from the TTN gateway events API, convert uplink data to a format that the Helium network understands and forward it.&lt;br /&gt;
I don&#039;t really care about the Helium crypto tokens, this is just for fun and science.&lt;br /&gt;
&lt;br /&gt;
What I definitely can do:&lt;br /&gt;
* Capture data from the TTN gateway events API, convert it back to Semtech UP format and forward it somewhere to Helium (just not sure where!)&lt;br /&gt;
* See also my https://github.com/bertrik/ttn-gateway-collector project which contains an initial implementation of TTN-to-UDP conversion&lt;br /&gt;
&lt;br /&gt;
Showstoppers:&lt;br /&gt;
* If you want to be a gateway on the Helium network, you have to *pay Helium*! Obviously I don&#039;t want that, I just want to share data to improve *their* network. &lt;br /&gt;
&lt;br /&gt;
Open work:&lt;br /&gt;
* Investigate if Helium has an open uplink API for their hotspots, if so study it etc, without paying the gateway fee&lt;br /&gt;
* Investigate if Thingsix has an open uplink API for their hotspots, if so study it etc, without paying any gateway fee&lt;br /&gt;
* Investigate if Thingsix is just another Helium, with weird crypto money&lt;br /&gt;
&lt;br /&gt;
Interesting stuff:&lt;br /&gt;
* https://docs.helium.com/use-the-network/setup-a-packet-forwarder unfortunately the link to setting up the &#039;light hotspot client&#039; does not work!&lt;br /&gt;
* https://docs.helium.com/mine-hnt/light-hotspots/&lt;br /&gt;
* https://thingsix.com/&lt;br /&gt;
&lt;br /&gt;
=== Adding BLE GATT interface to sensors ===&lt;br /&gt;
The GATT specification allows measurement properties to be defined and transferred continuously over Bluetooth low-energy.&lt;br /&gt;
&lt;br /&gt;
With GATT you can define a collection of properties (e.g. measurement items like temperature/humidity/particulate matter/noise, etc)&lt;br /&gt;
organised in a simple structure of a BLE service.&lt;br /&gt;
The &#039;notification&#039; method allows you to basically push the data continuously to a connected host, e.g. a smart phone.&lt;br /&gt;
&lt;br /&gt;
Services collects characteristic, a characteristic has values with units.&lt;br /&gt;
Each of these (service, characteristic, unit) have their own unique &amp;quot;UUID&amp;quot;.&lt;br /&gt;
This is described in the so-called [https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20Numbers%20Document.pdf 16-bit UUID numbers document]&lt;br /&gt;
&lt;br /&gt;
Interesting stuff in GATT:&lt;br /&gt;
* See GATT_Specification_Supplement_v5 paragraph 3.151, it has a noise characteristic with 1 dB resolution.&lt;br /&gt;
* 0x27C3 is the GATT *unit* for sound pressure&lt;br /&gt;
* 0x181A is the GATT environmental sensing *service*, document name &amp;quot;ESP_V1.0.0.pdf&amp;quot;&lt;br /&gt;
* 0x2A6E is the GATT Characteristic and Object Type for temperature&lt;br /&gt;
* 0x2A6F is the GATT Characteristic and Object Type for humidity&lt;br /&gt;
* 0x2BD5 is the GATT Characteristic and Object Type for Particulate Matter - PM1 Concentration&lt;br /&gt;
* 0x2BD6 is the GATT Characteristic and Object Type for Particulate Matter - PM2.5 Concentration&lt;br /&gt;
* 0x2BD7 is the GATT Characteristic and Object Type for Particulate Matter - PM10 Concentration&lt;br /&gt;
* Unfortunately I cannot find a characteristic for carbon-dioxide (CO2) in the BLE GATT unit document&lt;br /&gt;
&lt;br /&gt;
See also https://programmaticponderings.com/2020/08/04/getting-started-with-bluetooth-low-energy-ble-and-generic-attribute-profile-gatt-specification-for-iot/&lt;br /&gt;
&lt;br /&gt;
=== Reverse engineering XS-8217 bluetooth air quality meter ===&lt;br /&gt;
This is a thing that measures CO2, humidity, temperature, TVOC and formaldehyde.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.liutyi.info/display/CO2/ZN-2CO3+Inside&lt;br /&gt;
&lt;br /&gt;
This teardown looks a lot like my sensor: https://www.youtube.com/watch?v=APnjhMrJChI&lt;br /&gt;
Mine contains a &amp;quot;TPM-300A&amp;quot; sensor for measuring VOC.&lt;br /&gt;
&lt;br /&gt;
It has a bluetooth interface, device name is XS-8217.&lt;br /&gt;
It has a BLE GATT profile, with the following services&lt;br /&gt;
* service 0xC760&lt;br /&gt;
** characteristic 0xC762 (WRITE)&lt;br /&gt;
** characteristic 0xC761 (NOTIFY)&lt;br /&gt;
*** example data: 0x23 0x06 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
*** example data: 0x23 0x08 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
*** data shown on screen was approximately: CO2=418ppm, HCHO=0.003mg/m3, TVOC=0.013mg/m3, temp=24degC, humi=35%&lt;br /&gt;
&lt;br /&gt;
So data in the characteristic 0xC761 seems to have a 4 byte constant header:&lt;br /&gt;
* 0x23&lt;br /&gt;
* length byte&lt;br /&gt;
&lt;br /&gt;
Then we have for the first message: 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0xF1 is temperature in 0.1 degree Celcius most likely (24.1)&lt;br /&gt;
* 0x00 is ...&lt;br /&gt;
* 0x23 is humidity most likely (35)&lt;br /&gt;
* 0x65 is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
And for the second message: 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0x01 0x9A is the CO2 concentration (410)&lt;br /&gt;
* 0x00 0x0A is TVOC most likely (10)&lt;br /&gt;
* 0x00 0x03 is HCHO most likely (3)&lt;br /&gt;
* 0x0E is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
=== ribbon tweeter for bat audio ===&lt;br /&gt;
Someone gave me this idea:&lt;br /&gt;
Use a ribbon tweeter like this for playing back bat audio:&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/4000973201791.html&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/1005002565880660.html&amp;lt;/s&amp;gt;&lt;br /&gt;
https://nl.aliexpress.com/item/1005002635086050.html&lt;br /&gt;
&lt;br /&gt;
The frequency spectrum shows no sign of dropping off at 20 kHz.&lt;br /&gt;
&lt;br /&gt;
=== 3d glasses ===&lt;br /&gt;
I got some 2nd hand 3d glasses, they look exactly like these ones:&lt;br /&gt;
* GH-15 https://www.dhgate.com/product/g15-dlp-3d-active-shutter-glasses-96-144hz/213983026.html&lt;br /&gt;
* Sintron https://www.amazon.de/Sintron-Kompatibel-TDG-BT500A-TDG-BT400A-Deutschland/dp/B015PCWMZ8&lt;br /&gt;
The common name appears to be &amp;quot;G15-DLP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A tear-down here:&lt;br /&gt;
* https://blog.danman.eu/3d-shutter-glasses-teardown/&lt;br /&gt;
&lt;br /&gt;
Interesting documents:&lt;br /&gt;
* http://cmst.curtin.edu.au/wp-content/uploads/sites/4/2016/05/2012-28-woods-helliwell-cross-compatibility_of_shutter_glasses.pdf&lt;br /&gt;
* http://cmst.curtin.edu.au/local/docs/pubs/2011-17-woods-helliwell-3D-Sync-IR.pdf&lt;br /&gt;
&lt;br /&gt;
Someone claims he got something to work with some hacks:&lt;br /&gt;
https://www.avsforum.com/threads/how-i-got-cheap-dlp-link-glasses-to-work-great.1887145/&lt;br /&gt;
&lt;br /&gt;
=== Waterniveaumeter ===&lt;br /&gt;
Op verschillende plekken in Gouda staat er water in de kruipruimte van huizen van bewoners.&lt;br /&gt;
Kunnen we dat meten en inzichtelijk maken, voor bewoners, op een kaart bijvoorbeeld?&lt;br /&gt;
&lt;br /&gt;
Idee:&lt;br /&gt;
* in de kruipruimte plaats je een module die waterhoogte kan meten&lt;br /&gt;
* de module bestaat uit een microcontroller en een afstandsmeter, die de waterhoogte bepaalt&lt;br /&gt;
* de gegevens worden via WiFi doorgestuurd naar een centraal punt, waar de data wordt verwerkt en gevisualiseerd&lt;br /&gt;
* op een webpagina kan je een overzicht zien van alle meters die online zijn&lt;br /&gt;
* de meting wordt gedaan door bijv. een laser-afstandsmeter of een ultrasoon-afstandsmeter&lt;br /&gt;
* voeding? lastig, hoe krijg je 5v naar een potentieel natte plek?&lt;br /&gt;
* kosten? verwachting &amp;lt; E 40,-&lt;br /&gt;
&lt;br /&gt;
In Gouda wordt op veel verschillende plekken de grondwaterstand gemeten, zie https://opendata.munisense.net/portal/wareco-water2/group/581/Gouda-KJ38A , maar:&lt;br /&gt;
* geen visualisatie op de kaart, je ziet alleen de meetlokaties d.m.v. een icoontje!&lt;br /&gt;
* geen meetpunten in Gouda noord!&lt;br /&gt;
&lt;br /&gt;
=== Online bat detector ===&lt;br /&gt;
Idea: use an ultrasonic microphone, connect it to a WebSDR, so people can tune into bat sounds remotely.&lt;br /&gt;
&lt;br /&gt;
=== Raspberry pi airplane tracking ===&lt;br /&gt;
Apparently now you can also participate in MLAT tracking of planes that don&#039;t transmit GPS coordinates themselves.&lt;br /&gt;
&lt;br /&gt;
=== APRS gateway ===&lt;br /&gt;
http://qso365.co.uk/2017/02/a-guide-to-setting-up-an-aprs-receive-only-igate-using-a-raspberry-pi-and-an-rtl-sdr-dongle/&lt;br /&gt;
&lt;br /&gt;
=== JQ6500 ===&lt;br /&gt;
Small inexpensive modules that play mp3 from an internal flash. Could be nice for a custom door bell for example.&lt;br /&gt;
&lt;br /&gt;
More info at: &lt;br /&gt;
* https://www.elecfreaks.com/wiki/index.php?title=JQ6500_Mini_MP3_Module&lt;br /&gt;
* https://sparks.gogo.co.nz/jq6500/index.html&lt;br /&gt;
&lt;br /&gt;
=== FPGA ===&lt;br /&gt;
Cheap FPGA boards and nice applications:&lt;br /&gt;
* https://bitbucket.org/appanp/artificial-neural-networks/wiki/Home/FPGAsAndNeuralNets.md#!sbcs-and-iot-boards &lt;br /&gt;
* [http://nl.aliexpress.com/item/Altera-fpga-cycloneii-ep2c5t144-learning-board-development-board/872520721.html inexpensive ep2c5t144 board] &lt;br /&gt;
* http://land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board&lt;br /&gt;
&lt;br /&gt;
=== Neural networks on low-end hardware ===&lt;br /&gt;
Investigate if you can run a powerful neural network on relatively low-end/cheap/low-power hardware. For example a Raspberry pi.&lt;br /&gt;
A RPI runs Linux, run python, just like some common neural frameworks.&lt;br /&gt;
Do we need hardware acceleration from the GPU and does the RPI GPU support that?&lt;br /&gt;
&lt;br /&gt;
Read list:&lt;br /&gt;
* https://www.zdnet.com/pictures/raspberry-pi-meets-ai-the-projects-that-put-machine-learning-on-the-35-board/&lt;br /&gt;
* https://www.pyimagesearch.com/2017/12/18/keras-deep-learning-raspberry-pi/&lt;br /&gt;
* https://www.indiegogo.com/projects/sipeed-maix-the-world-first-risc-v-64-ai-module#/&lt;br /&gt;
* https://ai.intel.com/intel-neural-compute-stick-2-smarter-faster-plug-and-play-ai-at-the-edge/&lt;br /&gt;
&lt;br /&gt;
Bought a MaixPy:&lt;br /&gt;
* see https://maixpy.sipeed.com/en/&lt;br /&gt;
* see https://www.youtube.com/watch?v=KResVuAIMb4&lt;br /&gt;
* see http://educ8s.tv/sipeed-m1-dock-review/&lt;br /&gt;
* interesting? https://www.instructables.com/id/Transfer-Learning-With-Sipeed-MaiX-and-Arduino-IDE/&lt;br /&gt;
&lt;br /&gt;
=== mini word clock in dutch ===&lt;br /&gt;
Basically an monochrome 8x8 word clock, in Dutch, showing local time in the Netherlands.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bertrik/miniwordclock This git repo] has the current code.&lt;br /&gt;
&lt;br /&gt;
See [https://plus.google.com/103276078656203197145/posts/7ki7rpJzk3a here for a demo] running on an arduino nano.&lt;br /&gt;
&lt;br /&gt;
The plan is to run this from an ESP8266 instead of an arduino nano, so it can get the time from the internet using NTP.&lt;br /&gt;
Andreas Spiess demonstrated on youtube how existing libraries on the ESP8266 can be used to do the local time (including summer-time) calculations.&lt;br /&gt;
&lt;br /&gt;
=== Cypress PSOC5 ===&lt;br /&gt;
Play with the Cypress PSOC5 platform, which combines a ARM Cortex-m3 processor with configurable analog blocks. I&#039;m thinking of combining it with a 24 GHz doppler radar sensor, to process the signal and present it as a USB audio device (stereo signal contains I and Q parts). See [[RadarOnAStick]].&lt;br /&gt;
&lt;br /&gt;
=== Simple Doppler motion sensors ===&lt;br /&gt;
You can find basic doppler microwave motion sensors based on a single transistor, with some weird traces on the PCB very cheaply, for example&lt;br /&gt;
* https://www.aliexpress.com/item/RCWL-0516-microwave-radar-sensor-module-Human-body-induction-switch-module-Intelligent-sensor/32708877914.html&lt;br /&gt;
&lt;br /&gt;
Typically the microwave part of these consists of a single transistor with a rectangular area on one leg and a meandering trace (with lots of vias to the other side) on the other leg.&lt;br /&gt;
The output of this circuit seems to go into a chip very much like the ones used in PIR sensors.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/jdesbonnet/RCWL-0516 for a reverse engineering effort of these doppler radar modules.&lt;br /&gt;
&lt;br /&gt;
=== Bare-bones Arduino bat detector ===&lt;br /&gt;
This is an idea for a very basic heterodyne bat detector, doing signal processing on an Arduino, requiring minimal external components.&lt;br /&gt;
&lt;br /&gt;
The basic principle of a heterodyne detector is that it just mixes (multiplies) the audio signal with a square wave, low-pass filters the result and puts it on a speaker.&lt;br /&gt;
&lt;br /&gt;
Multiplying with a square wave can also be considered to be just alternatively inverting and not-inverting the signal.&lt;br /&gt;
So if you sample an ultrasonic signal at twice the rate you want to multiply, you can just subtract odd samples from even samples and low-pass filter that.&lt;br /&gt;
&lt;br /&gt;
How this can be done in an AVR Arduino:&lt;br /&gt;
* sample the audio signal at twice the detection frequency, say 84 kHz. An AVR should just be able to do that.&lt;br /&gt;
* apply a 1-pole IIR high-pass filter to remove DC bias, this takes one shift instruction and one addition.&lt;br /&gt;
* multiply by the detection frequency, this means just inverting the odd samples.&lt;br /&gt;
* low-pass filter the signal, this can be done using a moving average filter, say 16 samples long (first null at 5.25 kHz). Theoretically, averaging 16 samples should result in two bits extra accuracy. This operation takes some storage, an addition and a subtraction.&lt;br /&gt;
* output the filtered signal using PWM, possibly at the same rate that we are sampling the input audio.&lt;br /&gt;
&lt;br /&gt;
The microphone can be a 40 kHz piezo transducer, to keep it cheap (but also limited to 40 kHz).&lt;br /&gt;
The pre-amplifier can be a single transistor with some resistors around it, providing about 40x gain.&lt;br /&gt;
The arduino does the signal processing (mixing, low-pass filter) to shift the bat audio to human range.&lt;br /&gt;
The speaker amplifier can just be a simple two transistor push-pull circuit, since the output from the Arduino is digital/PWM.&lt;br /&gt;
&lt;br /&gt;
==== AVR Arduino sample rate ====&lt;br /&gt;
As far as I understand, the ADC clock can be set to 1 MHz.&lt;br /&gt;
Conversion takes 13 cycles, so this can be a problem to reach a sample rate above 80 kHz.&lt;br /&gt;
&lt;br /&gt;
=== Indoor radar speed sign ===&lt;br /&gt;
This idea about placing a simple IQ-output radar sensor indoors in the hacker space, do some basic signal processing on the IQ doppler signal and determine movement speed and direction, then display this on a LED display.&lt;br /&gt;
This is of no immediate practical use other than fun, but helps me to gain a bit more experience with microwave radar sensors and eventually build a more effective setup for detecting/counting bats flying in and out of a roost.&lt;br /&gt;
&lt;br /&gt;
Implement this on a PSOC5 platform or on the STM32 using Arduino.&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35177</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35177"/>
		<updated>2026-03-25T12:07:14Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Progress */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message:&lt;br /&gt;
* General description: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
* Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
* Meshcore source: https://github.com/meshcore-dev/MeshCore/tree/main/src&lt;br /&gt;
* https://jacksbrain.com/2026/01/a-hitchhiker-s-guide-to-meshcore-cryptography/&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters are relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they dont&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
Done so far:&lt;br /&gt;
* I understand the meshcore packet structure&lt;br /&gt;
* Using an stm32wle5 board (has an sx1262-like built in), we can send a valid group-data packet which is understood by repeaters and repeated&lt;br /&gt;
* Initial Arduino gateway code for an esp32-s3 seeed board&lt;br /&gt;
&lt;br /&gt;
Todo:&lt;br /&gt;
* Write the backend part: listen to MQTT and respond with a valid packet&lt;br /&gt;
* Process the backend packet on the sensor node&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
=== Meshcore security ===&lt;br /&gt;
&lt;br /&gt;
The 16-byte channel key is derived from the channel name, as follows:&lt;br /&gt;
  key = hashlib.sha256(name.encode(&#039;utf-8&#039;)).digest()[0:16]&lt;br /&gt;
where &#039;name&#039; is the channel name, including the &#039;#&#039;&lt;br /&gt;
&lt;br /&gt;
The 1-byte channel hash is derived from the channel key, as follows:&lt;br /&gt;
  hash = hashlib.sha256(key).digest()[0]&lt;br /&gt;
where &#039;key&#039; is the byte array containing the key&lt;br /&gt;
&lt;br /&gt;
Encryption of the payload is done using the key:&lt;br /&gt;
* Payload is padded with 0 to multiple of 16&lt;br /&gt;
* Encrypted using AES-128 ECB (!) mode, initialised with the key&lt;br /&gt;
&lt;br /&gt;
The 2-byte MAC is calculated over the *encrypted* payload, using the key:&lt;br /&gt;
  mac = sha256-hmac(payload)[0:2]&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
=== Communication scheme ===&lt;br /&gt;
The sensor sends measurements.&lt;br /&gt;
The backend returns ACKs, with preferred path information to reach a gateway.&lt;br /&gt;
Not every measurement is ACKed, to keep traffic down (like LoRaWAN does), but only every x messages (say 16).&lt;br /&gt;
&lt;br /&gt;
Escalation ladder when the sensor misses ACKs (or when the path to the gateway is lost):&lt;br /&gt;
* When expecting ACKs, just send  couple more (re)tries along the last known path, e.g. enable a kind of &#039;ACK wanted&#039; flag&lt;br /&gt;
* On start-up, try a quick-start with a zero-hop direct message, to probe if the gateway is perhaps within range of the sensor&lt;br /&gt;
* On start-up, if the quick-start did not work, send a flood message (with larger network impact)&lt;br /&gt;
To be worked out further.&lt;br /&gt;
&lt;br /&gt;
=== Packet structure ===&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Channel hash: 1 byte&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#sensornet&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure (big endian):&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (e.g. &#039;#sensornet&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash to use as the MAC&lt;br /&gt;
* The hash key itself calculated, as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid (big endian)&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). Only the generated hash key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
* Citizen science data is extended with a blake2s 4-byte MAC, based on the deviceid and a counter, calculated using a application/device-specific key&lt;br /&gt;
* Citizen science data is encrypted on the meshcore level using AES128 (CBC mode) with a key based on the meshcore channel name&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35176</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35176"/>
		<updated>2026-03-25T12:06:15Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message:&lt;br /&gt;
* General description: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
* Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
* Meshcore source: https://github.com/meshcore-dev/MeshCore/tree/main/src&lt;br /&gt;
* https://jacksbrain.com/2026/01/a-hitchhiker-s-guide-to-meshcore-cryptography/&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters are relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they dont&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
Done so far:&lt;br /&gt;
* I understand the meshcore packet structure&lt;br /&gt;
* Using an stm32wle5 board (has an sx1262-like built in), we can send a valid group-data packet which is understood by repeaters and repeated&lt;br /&gt;
&lt;br /&gt;
Todo:&lt;br /&gt;
* Implement the gateway part, the plan is to use a S3/SX1262 seeed board.&lt;br /&gt;
* Write the backend part: listen to MQTT and respond with a valid packet&lt;br /&gt;
* Process the backend packet on the sensor node&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
=== Meshcore security ===&lt;br /&gt;
&lt;br /&gt;
The 16-byte channel key is derived from the channel name, as follows:&lt;br /&gt;
  key = hashlib.sha256(name.encode(&#039;utf-8&#039;)).digest()[0:16]&lt;br /&gt;
where &#039;name&#039; is the channel name, including the &#039;#&#039;&lt;br /&gt;
&lt;br /&gt;
The 1-byte channel hash is derived from the channel key, as follows:&lt;br /&gt;
  hash = hashlib.sha256(key).digest()[0]&lt;br /&gt;
where &#039;key&#039; is the byte array containing the key&lt;br /&gt;
&lt;br /&gt;
Encryption of the payload is done using the key:&lt;br /&gt;
* Payload is padded with 0 to multiple of 16&lt;br /&gt;
* Encrypted using AES-128 ECB (!) mode, initialised with the key&lt;br /&gt;
&lt;br /&gt;
The 2-byte MAC is calculated over the *encrypted* payload, using the key:&lt;br /&gt;
  mac = sha256-hmac(payload)[0:2]&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
=== Communication scheme ===&lt;br /&gt;
The sensor sends measurements.&lt;br /&gt;
The backend returns ACKs, with preferred path information to reach a gateway.&lt;br /&gt;
Not every measurement is ACKed, to keep traffic down (like LoRaWAN does), but only every x messages (say 16).&lt;br /&gt;
&lt;br /&gt;
Escalation ladder when the sensor misses ACKs (or when the path to the gateway is lost):&lt;br /&gt;
* When expecting ACKs, just send  couple more (re)tries along the last known path, e.g. enable a kind of &#039;ACK wanted&#039; flag&lt;br /&gt;
* On start-up, try a quick-start with a zero-hop direct message, to probe if the gateway is perhaps within range of the sensor&lt;br /&gt;
* On start-up, if the quick-start did not work, send a flood message (with larger network impact)&lt;br /&gt;
To be worked out further.&lt;br /&gt;
&lt;br /&gt;
=== Packet structure ===&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Channel hash: 1 byte&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#sensornet&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure (big endian):&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (e.g. &#039;#sensornet&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash to use as the MAC&lt;br /&gt;
* The hash key itself calculated, as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid (big endian)&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). Only the generated hash key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
* Citizen science data is extended with a blake2s 4-byte MAC, based on the deviceid and a counter, calculated using a application/device-specific key&lt;br /&gt;
* Citizen science data is encrypted on the meshcore level using AES128 (CBC mode) with a key based on the meshcore channel name&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35175</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35175"/>
		<updated>2026-03-23T12:08:22Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Packet structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message:&lt;br /&gt;
* General description: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
* Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
* Meshcore source: https://github.com/meshcore-dev/MeshCore/tree/main/src&lt;br /&gt;
* https://jacksbrain.com/2026/01/a-hitchhiker-s-guide-to-meshcore-cryptography/&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
Done so far:&lt;br /&gt;
* I understand the meshcore packet structure&lt;br /&gt;
* Using an stm32wle5 board (has an sx1262-like built in), we can send a valid group-data packet which is understood by repeaters and repeated&lt;br /&gt;
&lt;br /&gt;
Todo:&lt;br /&gt;
* Implement the gateway part, the plan is to use a S3/SX1262 seeed board.&lt;br /&gt;
* Write the backend part: listen to MQTT and respond with a valid packet&lt;br /&gt;
* Process the backend packet on the sensor node&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
=== Meshcore security ===&lt;br /&gt;
&lt;br /&gt;
The 16-byte channel key is derived from the channel name, as follows:&lt;br /&gt;
  key = hashlib.sha256(name.encode(&#039;utf-8&#039;)).digest()[0:16]&lt;br /&gt;
where &#039;name&#039; is the channel name, including the &#039;#&#039;&lt;br /&gt;
&lt;br /&gt;
The 1-byte channel hash is derived from the channel key, as follows:&lt;br /&gt;
  hash = hashlib.sha256(key).digest()[0]&lt;br /&gt;
where &#039;key&#039; is the byte array containing the key&lt;br /&gt;
&lt;br /&gt;
Encryption of the payload is done using the key:&lt;br /&gt;
* Payload is padded with 0 to multiple of 16&lt;br /&gt;
* Encrypted using AES-128 ECB (!) mode, initialised with the key&lt;br /&gt;
&lt;br /&gt;
The 2-byte MAC is calculated over the *encrypted* payload, using the key:&lt;br /&gt;
  mac = sha256-hmac(payload)[0:2]&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
=== Communication scheme ===&lt;br /&gt;
The sensor sends measurements.&lt;br /&gt;
The backend returns ACKs, with preferred path information to reach a gateway.&lt;br /&gt;
Not every measurement is ACKed, to keep traffic down (like LoRaWAN does), but only every x messages (say 16).&lt;br /&gt;
&lt;br /&gt;
Escalation ladder when the sensor misses ACKs (or when the path to the gateway is lost):&lt;br /&gt;
* When expecting ACKs, just send  couple more (re)tries along the last known path, e.g. enable a kind of &#039;ACK wanted&#039; flag&lt;br /&gt;
* On start-up, try a quick-start with a zero-hop direct message, to probe if the gateway is perhaps within range of the sensor&lt;br /&gt;
* On start-up, if the quick-start did not work, send a flood message (with larger network impact)&lt;br /&gt;
To be worked out further.&lt;br /&gt;
&lt;br /&gt;
=== Packet structure ===&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Channel hash: 1 byte&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#sensornet&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure (big endian):&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (e.g. &#039;#sensornet&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash to use as the MAC&lt;br /&gt;
* The hash key itself calculated, as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid (big endian)&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). Only the generated hash key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
* Citizen science data is extended with a blake2s 4-byte MAC, based on the deviceid and a counter, calculated using a application/device-specific key&lt;br /&gt;
* Citizen science data is encrypted on the meshcore level using AES128 (CBC mode) with a key based on the meshcore channel name&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35173</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35173"/>
		<updated>2026-03-19T12:23:31Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message:&lt;br /&gt;
* General description: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
* Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
* Meshcore source: https://github.com/meshcore-dev/MeshCore/tree/main/src&lt;br /&gt;
* https://jacksbrain.com/2026/01/a-hitchhiker-s-guide-to-meshcore-cryptography/&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
Done so far:&lt;br /&gt;
* I understand the meshcore packet structure&lt;br /&gt;
* Using an stm32wle5 board (has an sx1262-like built in), we can send a valid group-data packet which is understood by repeaters and repeated&lt;br /&gt;
&lt;br /&gt;
Todo:&lt;br /&gt;
* Implement the gateway part, the plan is to use a S3/SX1262 seeed board.&lt;br /&gt;
* Write the backend part: listen to MQTT and respond with a valid packet&lt;br /&gt;
* Process the backend packet on the sensor node&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
=== Meshcore security ===&lt;br /&gt;
&lt;br /&gt;
The 16-byte channel key is derived from the channel name, as follows:&lt;br /&gt;
  key = hashlib.sha256(name.encode(&#039;utf-8&#039;)).digest()[0:16]&lt;br /&gt;
where &#039;name&#039; is the channel name, including the &#039;#&#039;&lt;br /&gt;
&lt;br /&gt;
The 1-byte channel hash is derived from the channel key, as follows:&lt;br /&gt;
  hash = hashlib.sha256(key).digest()[0]&lt;br /&gt;
where &#039;key&#039; is the byte array containing the key&lt;br /&gt;
&lt;br /&gt;
Encryption of the payload is done using the key:&lt;br /&gt;
* Payload is padded with 0 to multiple of 16&lt;br /&gt;
* Encrypted using AES-128 ECB (!) mode, initialised with the key&lt;br /&gt;
&lt;br /&gt;
The 2-byte MAC is calculated over the *encrypted* payload, using the key:&lt;br /&gt;
  mac = sha256-hmac(payload)[0:2]&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
=== Communication scheme ===&lt;br /&gt;
The sensor sends measurements.&lt;br /&gt;
The backend returns ACKs, with preferred path information to reach a gateway.&lt;br /&gt;
Not every measurement is ACKed, to keep traffic down (like LoRaWAN does), but only every x messages (say 16).&lt;br /&gt;
&lt;br /&gt;
Escalation ladder when the sensor misses ACKs (or when the path to the gateway is lost):&lt;br /&gt;
* When expecting ACKs, just send  couple more (re)tries along the last known path, e.g. enable a kind of &#039;ACK wanted&#039; flag&lt;br /&gt;
* On start-up, try a quick-start with a zero-hop direct message, to probe if the gateway is perhaps within range of the sensor&lt;br /&gt;
* On start-up, if the quick-start did not work, send a flood message (with larger network impact)&lt;br /&gt;
To be worked out further.&lt;br /&gt;
&lt;br /&gt;
=== Packet structure ===&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Channel hash: 1 byte&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#sensornet&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure (big endian):&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (e.g. &#039;#sensornet&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash to use as the MAC&lt;br /&gt;
* The hash key itself calculated, as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid (big endian)&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). Only the generated hash key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35172</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35172"/>
		<updated>2026-03-16T12:15:41Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Packet structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message:&lt;br /&gt;
* General description: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
* Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
* Meshcore source: https://github.com/meshcore-dev/MeshCore/tree/main/src&lt;br /&gt;
* https://jacksbrain.com/2026/01/a-hitchhiker-s-guide-to-meshcore-cryptography/&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
=== Meshcore security ===&lt;br /&gt;
&lt;br /&gt;
The 16-byte channel key is derived from the channel name, as follows:&lt;br /&gt;
  key = hashlib.sha256(name.encode(&#039;utf-8&#039;)).digest()[0:16]&lt;br /&gt;
where &#039;name&#039; is the channel name, including the &#039;#&#039;&lt;br /&gt;
&lt;br /&gt;
The 1-byte channel hash is derived from the channel key, as follows:&lt;br /&gt;
  hash = hashlib.sha256(key).digest()[0]&lt;br /&gt;
where &#039;key&#039; is the byte array containing the key&lt;br /&gt;
&lt;br /&gt;
Encryption of the payload is done using the key:&lt;br /&gt;
* Payload is padded with 0 to multiple of 16&lt;br /&gt;
* Encrypted using AES-128 ECB (!) mode, initialised with the key&lt;br /&gt;
&lt;br /&gt;
The 2-byte MAC is calculated over the *encrypted* payload, using the key:&lt;br /&gt;
  mac = sha256-hmac(payload)[0:2]&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
=== Communication scheme ===&lt;br /&gt;
The sensor sends measurements.&lt;br /&gt;
The backend returns ACKs, with preferred path information to reach a gateway.&lt;br /&gt;
Not every measurement is ACKed, to keep traffic down (like LoRaWAN does), but only every x messages (say 16).&lt;br /&gt;
&lt;br /&gt;
Escalation ladder when the sensor misses ACKs (or when the path to the gateway is lost):&lt;br /&gt;
* When expecting ACKs, just send  couple more (re)tries along the last known path, e.g. enable a kind of &#039;ACK wanted&#039; flag&lt;br /&gt;
* On start-up, try a quick-start with a zero-hop direct message, to probe if the gateway is perhaps within range of the sensor&lt;br /&gt;
* On start-up, if the quick-start did not work, send a flood message (with larger network impact)&lt;br /&gt;
To be worked out further.&lt;br /&gt;
&lt;br /&gt;
=== Packet structure ===&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Channel hash: 1 byte&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#sensornet&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure (big endian):&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (e.g. &#039;#sensornet&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash to use as the MAC&lt;br /&gt;
* The hash key itself calculated, as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid (big endian)&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). Only the generated hash key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35171</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35171"/>
		<updated>2026-03-16T12:14:37Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Packet structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message:&lt;br /&gt;
* General description: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
* Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
* Meshcore source: https://github.com/meshcore-dev/MeshCore/tree/main/src&lt;br /&gt;
* https://jacksbrain.com/2026/01/a-hitchhiker-s-guide-to-meshcore-cryptography/&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
=== Meshcore security ===&lt;br /&gt;
&lt;br /&gt;
The 16-byte channel key is derived from the channel name, as follows:&lt;br /&gt;
  key = hashlib.sha256(name.encode(&#039;utf-8&#039;)).digest()[0:16]&lt;br /&gt;
where &#039;name&#039; is the channel name, including the &#039;#&#039;&lt;br /&gt;
&lt;br /&gt;
The 1-byte channel hash is derived from the channel key, as follows:&lt;br /&gt;
  hash = hashlib.sha256(key).digest()[0]&lt;br /&gt;
where &#039;key&#039; is the byte array containing the key&lt;br /&gt;
&lt;br /&gt;
Encryption of the payload is done using the key:&lt;br /&gt;
* Payload is padded with 0 to multiple of 16&lt;br /&gt;
* Encrypted using AES-128 ECB (!) mode, initialised with the key&lt;br /&gt;
&lt;br /&gt;
The 2-byte MAC is calculated over the *encrypted* payload, using the key:&lt;br /&gt;
  mac = sha256-hmac(payload)[0:2]&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
=== Communication scheme ===&lt;br /&gt;
The sensor sends measurements.&lt;br /&gt;
The backend returns ACKs, with preferred path information to reach a gateway.&lt;br /&gt;
Not every measurement is ACKed, to keep traffic down (like LoRaWAN does), but only every x messages (say 16).&lt;br /&gt;
&lt;br /&gt;
Escalation ladder when the sensor misses ACKs (or when the path to the gateway is lost):&lt;br /&gt;
* When expecting ACKs, just send  couple more (re)tries along the last known path, e.g. enable a kind of &#039;ACK wanted&#039; flag&lt;br /&gt;
* On start-up, try a quick-start with a zero-hop direct message, to probe if the gateway is perhaps within range of the sensor&lt;br /&gt;
* On start-up, if the quick-start did not work, send a flood message (with larger network impact)&lt;br /&gt;
To be worked out further.&lt;br /&gt;
&lt;br /&gt;
=== Packet structure ===&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Channel hash: 1 byte&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#sensornet&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure (big endian):&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (e.g. &#039;#sensornet&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash to use as the MAC&lt;br /&gt;
* The hash key itself calculated, as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid (big endian)&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35119</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35119"/>
		<updated>2026-03-06T16:56:02Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message:&lt;br /&gt;
* General description: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
* Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
* Meshcore source: https://github.com/meshcore-dev/MeshCore/tree/main/src&lt;br /&gt;
* https://jacksbrain.com/2026/01/a-hitchhiker-s-guide-to-meshcore-cryptography/&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
=== Meshcore security ===&lt;br /&gt;
&lt;br /&gt;
The 16-byte channel key is derived from the channel name, as follows:&lt;br /&gt;
  key = hashlib.sha256(name.encode(&#039;utf-8&#039;)).digest()[0:16]&lt;br /&gt;
where &#039;name&#039; is the channel name, including the &#039;#&#039;&lt;br /&gt;
&lt;br /&gt;
The 1-byte channel hash is derived from the channel key, as follows:&lt;br /&gt;
  hash = hashlib.sha256(key).digest()[0]&lt;br /&gt;
where &#039;key&#039; is the byte array containing the key&lt;br /&gt;
&lt;br /&gt;
Encryption of the payload is done using the key:&lt;br /&gt;
* Payload is padded with 0 to multiple of 16&lt;br /&gt;
* Encrypted using AES-128 ECB (!) mode, initialised with the key&lt;br /&gt;
&lt;br /&gt;
The 2-byte MAC is calculated over the *encrypted* payload, using the key:&lt;br /&gt;
  mac = sha256-hmac(payload)[0:2]&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
=== Communication scheme ===&lt;br /&gt;
The sensor sends measurements.&lt;br /&gt;
The backend returns ACKs, with preferred path information to reach a gateway.&lt;br /&gt;
Not every measurement is ACKed, to keep traffic down (like LoRaWAN does), but only every x messages (say 16).&lt;br /&gt;
&lt;br /&gt;
Escalation ladder when the sensor misses ACKs (or when the path to the gateway is lost):&lt;br /&gt;
* When expecting ACKs, just send  couple more (re)tries along the last known path, e.g. enable a kind of &#039;ACK wanted&#039; flag&lt;br /&gt;
* On start-up, try a quick-start with a zero-hop direct message, to probe if the gateway is perhaps within range of the sensor&lt;br /&gt;
* On start-up, if the quick-start did not work, send a flood message (with larger network impact)&lt;br /&gt;
To be worked out further.&lt;br /&gt;
&lt;br /&gt;
=== Packet structure ===&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Channel hash: 1 byte&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#meshcore-sensor-net&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure (big endian):&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (e.g. &#039;#sensornet&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash to use as the MAC&lt;br /&gt;
* The hash key itself calculated, as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid (big endian)&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35117</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35117"/>
		<updated>2026-03-05T11:45:45Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message:&lt;br /&gt;
* General description: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
* Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
* Meshcore source: https://github.com/meshcore-dev/MeshCore/tree/main/src&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
=== Meshcore security ===&lt;br /&gt;
&lt;br /&gt;
The 16-byte channel key is derived from the channel name, as follows:&lt;br /&gt;
  key = hashlib.sha256(name.encode(&#039;utf-8&#039;)).digest()[0:16]&lt;br /&gt;
where &#039;name&#039; is the channel name, including the &#039;#&#039;&lt;br /&gt;
&lt;br /&gt;
The 1-byte channel hash is derived from the channel key, as follows:&lt;br /&gt;
  hash = hashlib.sha256(key).digest()[0]&lt;br /&gt;
where &#039;key&#039; is the byte array containing the key&lt;br /&gt;
&lt;br /&gt;
Encryption of the payload is done using the key:&lt;br /&gt;
* Payload is padded with 0 to multiple of 16&lt;br /&gt;
* Encrypted using AES-128 ECB (!) mode, initialised with the key&lt;br /&gt;
&lt;br /&gt;
The 2-byte MAC is calculated over the *encrypted* payload, using the key:&lt;br /&gt;
  mac = sha256-hmac(payload)[0:2]&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
=== Communication scheme ===&lt;br /&gt;
The sensor sends measurements.&lt;br /&gt;
The backend returns ACKs, with preferred path information to reach a gateway.&lt;br /&gt;
Not every measurement is ACKed, to keep traffic down (like LoRaWAN does), but only every x messages (say 16).&lt;br /&gt;
&lt;br /&gt;
Escalation ladder when the sensor misses ACKs (or when the path to the gateway is lost):&lt;br /&gt;
* When expecting ACKs, just send  couple more (re)tries along the last known path, e.g. enable a kind of &#039;ACK wanted&#039; flag&lt;br /&gt;
* On start-up, try a quick-start with a zero-hop direct message, to probe if the gateway is perhaps within range of the sensor&lt;br /&gt;
* On start-up, if the quick-start did not work, send a flood message (with larger network impact)&lt;br /&gt;
To be worked out further.&lt;br /&gt;
&lt;br /&gt;
=== Packet structure ===&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Channel hash: 1 byte&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#meshcore-sensor-net&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure (big endian):&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (e.g. &#039;#sensornet&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash to use as the MAC&lt;br /&gt;
* The hash key itself calculated, as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid (big endian)&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35112</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35112"/>
		<updated>2026-03-02T23:21:32Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Meshcore security */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message:&lt;br /&gt;
* General description: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
* Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
* Meshcore source: https://github.com/meshcore-dev/MeshCore/tree/main/src&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
=== Meshcore security ===&lt;br /&gt;
&lt;br /&gt;
The 16-byte channel key is derived from the channel name, as follows:&lt;br /&gt;
  key = hashlib.sha256(name.encode(&#039;utf-8&#039;)).digest()[0:16]&lt;br /&gt;
where &#039;name&#039; is the channel name, including the &#039;#&#039;&lt;br /&gt;
&lt;br /&gt;
The 1-byte channel hash is derived from the channel key, as follows:&lt;br /&gt;
  hash = hashlib.sha256(key).digest()[0]&lt;br /&gt;
where &#039;key&#039; is the byte array containing the key&lt;br /&gt;
&lt;br /&gt;
Encryption of the payload is done using the key:&lt;br /&gt;
* Payload is padded with 0 to multiple of 16&lt;br /&gt;
* Encrypted using AES-128 ECB (!) mode, initialised with the key&lt;br /&gt;
&lt;br /&gt;
The 2-byte MAC is calculated over the *encrypted* payload, using the key:&lt;br /&gt;
  mac = sha256-hmac(payload)[0:2]&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
Initially flood mode, normally direct mode.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Channel hash: 1 byte&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#meshcore-sensor-net&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (&#039;#meshcore-sensor-net&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The hash key itself also calculated as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35111</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35111"/>
		<updated>2026-03-02T20:31:06Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Meshcore security */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message:&lt;br /&gt;
* General description: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
* Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
* Meshcore source: https://github.com/meshcore-dev/MeshCore/tree/main/src&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
=== Meshcore security ===&lt;br /&gt;
&lt;br /&gt;
The 16-byte channel key is derived from the channel name, as follows:&lt;br /&gt;
  key = hashlib.sha256(name.encode(&#039;utf-8&#039;)).digest()[0:16]&lt;br /&gt;
where &#039;name&#039; is the channel name, including the &#039;#&#039;&lt;br /&gt;
&lt;br /&gt;
The 1-byte channel hash is derived from the channel key, as follows:&lt;br /&gt;
  hash = hashlib.sha256(key).digest()[0]&lt;br /&gt;
where &#039;key&#039; is the byte array containing the key&lt;br /&gt;
&lt;br /&gt;
Encryption of the payload is done using the key:&lt;br /&gt;
* Payload is padded with 0 to multiple of 16&lt;br /&gt;
* Encrypted using AES ECB mode, initialised with the key&lt;br /&gt;
&lt;br /&gt;
The 2-byte MAC is calculated over the *encrypted* payload, using the key:&lt;br /&gt;
  mac = sha256-hmac(payload)[0:2]&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
Initially flood mode, normally direct mode.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Channel hash: 1 byte&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#meshcore-sensor-net&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (&#039;#meshcore-sensor-net&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The hash key itself also calculated as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35110</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35110"/>
		<updated>2026-03-02T20:03:45Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Investigation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message:&lt;br /&gt;
* General description: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
* Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
* Meshcore source: https://github.com/meshcore-dev/MeshCore/tree/main/src&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
=== Meshcore security ===&lt;br /&gt;
&lt;br /&gt;
The 16-byte channel key is derived from the channel name, as follows (python code)&lt;br /&gt;
  key = hashlib.sha256(name.encode(&#039;utf-8&#039;)).digest()[0:16]&lt;br /&gt;
where &#039;name&#039; is the channel name, including the &#039;#&#039;&lt;br /&gt;
&lt;br /&gt;
The 1-byte channel hash is derived from the channel key, as follows&lt;br /&gt;
  hash = hashlib.sha256(key).digest()[0]&lt;br /&gt;
where &#039;key&#039; is the byte array containing the key&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
Initially flood mode, normally direct mode.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Channel hash: 1 byte&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#meshcore-sensor-net&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (&#039;#meshcore-sensor-net&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The hash key itself also calculated as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35109</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35109"/>
		<updated>2026-03-02T17:01:17Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message:&lt;br /&gt;
* General description: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
* Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
* Meshcore source: https://github.com/meshcore-dev/MeshCore/tree/main/src&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
Initially flood mode, normally direct mode.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Channel hash: 1 byte&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#meshcore-sensor-net&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (&#039;#meshcore-sensor-net&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The hash key itself also calculated as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35108</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35108"/>
		<updated>2026-03-02T16:59:43Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message:&lt;br /&gt;
* General description: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
* Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
* Meshcore source: https://github.com/meshcore-dev/MeshCore/tree/main/src&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
Initially flood mode, normally direct mode.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#meshcore-sensor-net&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (&#039;#meshcore-sensor-net&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The hash key itself also calculated as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35107</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35107"/>
		<updated>2026-03-02T14:27:25Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
Initially flood mode, normally direct mode.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#meshcore-sensor-net&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (&#039;#meshcore-sensor-net&#039;), but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application and device&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The hash key itself also calculated as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35106</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35106"/>
		<updated>2026-03-02T12:33:21Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
Initially flood mode, normally direct mode.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#meshcore-sensor-net&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, it is encrypted with a key derived from the channel name (&#039;#meshcore-sensor-net&#039;),&lt;br /&gt;
but we do add a cryptographic checksum to recognize authentic messages belonging to a specific application&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The hash key itself also calculated as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35105</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35105"/>
		<updated>2026-03-02T08:36:58Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used for meshcore almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* explicit header, CRC enabled&lt;br /&gt;
* sync word 0x12&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
Initially flood mode, normally direct mode.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#meshcore-sensor-net&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, but we do add a cryptographic checksum to recognize authentic messages&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The hash key itself also calculated as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35104</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35104"/>
		<updated>2026-03-02T08:35:30Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
&lt;br /&gt;
869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
header enabled&lt;br /&gt;
sync word XXXX&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
Initially flood mode, normally direct mode.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#meshcore-sensor-net&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, but we do add a cryptographic checksum to recognize authentic messages&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The hash key itself also calculated as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35103</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35103"/>
		<updated>2026-03-02T08:34:52Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=Initializing&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
&lt;br /&gt;
869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
header enabled&lt;br /&gt;
sync word XXXX&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;PAYLOAD_TYPE_GRP_DATA&amp;quot;.&lt;br /&gt;
Initially flood mode, normally direct mode.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type PAYLOAD_TYPE_GRP_DATA + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* MAC: 2 bytes, according to PAYLOAD_TYPE_GRP_DATA format&lt;br /&gt;
* Encrypted payload: citizen science payload structure, encrypted with key derived from &amp;quot;channel name&amp;quot; (e.g. &#039;#meshcore-sensor-net&#039;)&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The PAYLOAD_TYPE_GRP_DATA payload follows the meshcore structure: 2-byte MAC + encrypted payload&lt;br /&gt;
* The citizen science data is not secret, but we do add a cryptographic checksum to recognize authentic messages&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The hash key itself also calculated as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35078</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35078"/>
		<updated>2026-02-25T14:02:18Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=Initializing&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
&lt;br /&gt;
869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
header enabled&lt;br /&gt;
sync word XXXX&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;RawCustom&amp;quot;.&lt;br /&gt;
Initially flood mode, normally direct mode.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type RawCustom + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Payload: citizen science payload structure&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The citizen science data is not secret, so it is not encrypted, but we do add a cryptographic checksum to recognize authentic messages&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The hash key itself also calculated as follows:&lt;br /&gt;
** Blake2s hash with key, where key = application secret&lt;br /&gt;
** Fields included in hash: application name, deviceid&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35077</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35077"/>
		<updated>2026-02-25T13:51:07Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=Initializing&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
&lt;br /&gt;
869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
header enabled&lt;br /&gt;
sync word XXXX&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;RawCustom&amp;quot;.&lt;br /&gt;
Initially flood mode, normally direct mode.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type RawCustom + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Payload: citizen science payload structure&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The citizen science data is not secret, so it is not encrypted, but we do add a cryptographic checksum to recognize authentic messages&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Blake2s hash with key (32-bytes)&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The hash key itself is also calculated using blake2s:&lt;br /&gt;
** key = blake2s(data = application name || deviceid, key = application secret)&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage of the sensor.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35076</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35076"/>
		<updated>2026-02-23T22:13:42Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=Initializing&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
&lt;br /&gt;
869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
header enabled&lt;br /&gt;
sync word XXXX&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;RawCustom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type RawCustom + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Payload: citizen science payload structure&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The citizen science data is not secret, so it is not encrypted, but we do add a cryptographic checksum to recognize authentic messages&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Keyed hash mode with a 32-byte key, calculated using blake2s&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The hash key itself is also calculated using blake2s:&lt;br /&gt;
** key = blake2s(data = application name || deviceid, key = application secret)&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35074</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35074"/>
		<updated>2026-02-23T17:33:01Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=Initializing&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
&lt;br /&gt;
869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
header enabled&lt;br /&gt;
sync word XXXX&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;RawCustom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type RawCustom + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Payload: citizen science payload structure&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The citizen science data is not secret, so it is not encrypted, but we do add a cryptographic checksum to recognize authentic messages&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Keyed hash mode with a 32-byte key, calculated using blake2s HMAC&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The secret hash key is itself calculated using blake2s:&lt;br /&gt;
** Initial step: calculate key as blake2s(salt || deviceid || passphrase)&lt;br /&gt;
** Repeat this 10000 times: calculate key as blake2s(salt || deviceid || key)&lt;br /&gt;
* The salt used is actually the &amp;quot;application name&amp;quot;, and the passphrase is the &amp;quot;application secret&amp;quot;&lt;br /&gt;
* The application name is part of the program image, the deviceid is derived from a unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35072</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35072"/>
		<updated>2026-02-22T22:57:44Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=Initializing&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
&lt;br /&gt;
869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
header enabled&lt;br /&gt;
sync word XXXX&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;RawCustom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type RawCustom + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Payload: citizen science payload structure&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes deviceid&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The citizen science data is not secret, so it is not encrypted, but we do add a cryptographic checksum to prove authenticity&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Keyed hash mode with a 32-byte key, calculated using blake2s HMAC&lt;br /&gt;
** Fields included in hash: deviceid, counter, citizen science data&lt;br /&gt;
** We retain 4 bytes of the hash&lt;br /&gt;
* The secret hash key is itself calculated using blake2s:&lt;br /&gt;
** Initial step: calculate key as blake2s(salt || deviceid || passphrase)&lt;br /&gt;
** Repeat this 10000 times: calculate key as blake2s(salt || deviceid || key)&lt;br /&gt;
* The salt used is actually the &amp;quot;application name&amp;quot;, and the passphrase is the &amp;quot;application secret&amp;quot;&lt;br /&gt;
* The application name is part of the program image, the deviceid is read from some unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35071</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35071"/>
		<updated>2026-02-22T22:51:38Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=Initializing&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
&lt;br /&gt;
869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
header enabled&lt;br /&gt;
sync word XXXX&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use payload type &amp;quot;RawCustom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Meshcore packet structure from sensor:&lt;br /&gt;
* Header: 1 byte = payload type RawCustom + (flood or direct)&lt;br /&gt;
* Path: length + path bytes (0 in case of flood)&lt;br /&gt;
* Payload: citizen science payload structure&lt;br /&gt;
&lt;br /&gt;
Citizen science payload structure:&lt;br /&gt;
* 4 bytes device address&lt;br /&gt;
* 4 bytes counter&lt;br /&gt;
* x bytes citizen science data&lt;br /&gt;
* 4 bytes MAC&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
* The citizen science payload is not secret, so it is not encrypted, but we do add a cryptographic checksum to prove authenticity&lt;br /&gt;
* The checksum is calculated using the blake2s algorithm, calculated as follows:&lt;br /&gt;
** Keyed hash mode with a 32-byte key&lt;br /&gt;
** Source device, 4-bytes&lt;br /&gt;
** Message counter, 4 bytes&lt;br /&gt;
** Message payload, x bytes&lt;br /&gt;
** Retain 4 bytes of the hash&lt;br /&gt;
* The secret hash key is also calculated using blake2s:&lt;br /&gt;
** Initial step: calculate key as blake2s(salt || deviceid || passphrase)&lt;br /&gt;
** Repeat this 10000 times: calculate key as blake2s(salt || deviceid || key)&lt;br /&gt;
* The salt used is actually the &amp;quot;application name&amp;quot;, and the passphrase is the &amp;quot;application secret&amp;quot;&lt;br /&gt;
* The application name is part of the program image, the deviceid is read from some unique hardware id, the application secret is entered only during key generation (never stored on device). The resulting key is written to non-volatile storage.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35070</id>
		<title>User:Bertrik Sikken</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35070"/>
		<updated>2026-02-22T19:00:36Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Project ideas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Smoel&lt;br /&gt;
 |Name=Bertrik Sikken&lt;br /&gt;
 |Nick=bertrik&lt;br /&gt;
 |Tagline=heb ik niet&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You can reach me at [mailto:bertrik@sikken.nl bertrik@sikken.nl] or [mailto:bertrik@gmail.com bertrik@gmail.com].&lt;br /&gt;
&lt;br /&gt;
Studied Electrical Engineering at Twente University.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Main interests:&lt;br /&gt;
* reverse-engineering things (USB stuff, mp3 players), worked on http://rockbox.org (sansa clip players)&lt;br /&gt;
* studying bats and making electronics for recording/listening to bat sounds&lt;br /&gt;
* radio stuff, in particular software-defined radio, LoRa networks&lt;br /&gt;
* citizen science and open data (particulate matter measurement, noise, water quality)&lt;br /&gt;
* energy-related stuff, visualisation&lt;br /&gt;
&lt;br /&gt;
Projects I work(ed) on ([https://revspace.nl/index.php?title=User:Bertrik_Sikken&amp;amp;action=purge refresh]):&lt;br /&gt;
{{#ask:[[Category:Project]][[Project Contact::bertrik]]&lt;br /&gt;
|?Project Status&lt;br /&gt;
|headers=show&lt;br /&gt;
|link=all&lt;br /&gt;
|order=ASC,ASC&lt;br /&gt;
|sort=Project Status,Project Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project ideas ==&lt;br /&gt;
[[File:always10oclock.jpg|right]]&lt;br /&gt;
[[File:idea.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas I&#039;m thinking about, but have not fully developed into an actual project yet.&lt;br /&gt;
&lt;br /&gt;
https://pine64.com/product/128mb-ox64-sbc-available-on-december-2-2022/&lt;br /&gt;
&lt;br /&gt;
=== investigate thread/matter ===&lt;br /&gt;
Matter/thread is the new IKEA standard for home automation thins apparently. &lt;br /&gt;
Thread is the wireless protocol, matter is a home automation protocol running on top of thread.&lt;br /&gt;
&lt;br /&gt;
I have a couple of nrf52840, these are good in doing thread.&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* check out openthread&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/openthread/openthread.git&lt;br /&gt;
cd openthread&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Prepare development environment:&lt;br /&gt;
  scripts/bootstrap&lt;br /&gt;
* Build it:&lt;br /&gt;
  ./script/build nrf52840 UART_trans -DOT_LOG_LEVEL=OT_LOG_LEVEL_INFO&lt;br /&gt;
&lt;br /&gt;
Thread on ESP32:&lt;br /&gt;
* on ESP32 C6 https://gist.github.com/gtxaspec/d26198daadfb0a8b0a0edeae2d3fd58f&lt;br /&gt;
* https://github.com/espressif/esp-thread-br&lt;br /&gt;
* https://github.com/espressif/esp-idf/tree/master/examples/openthread/ot_rcp&lt;br /&gt;
&lt;br /&gt;
=== action lsc stekker ===&lt;br /&gt;
https://keetsupport.nl/2024/03/20/how-to-flash-lsc-power-plug-with-esphome/&lt;br /&gt;
&lt;br /&gt;
https://community.home-assistant.io/t/detailed-guide-on-how-to-flash-the-new-tuya-beken-chips-with-openbk7231t/437276&lt;br /&gt;
&lt;br /&gt;
=== sipeed maix dock ===&lt;br /&gt;
Bought this a couple of years ago. Get familiar with this board.&lt;br /&gt;
Can I run a chess program on this, for example?&lt;br /&gt;
&lt;br /&gt;
* https://wiki.sipeed.com/soft/maixpy/en/develop_kit_board/maix_dock.html&lt;br /&gt;
&lt;br /&gt;
=== rfid keyfob ===&lt;br /&gt;
* aliexpress page: https://nl.aliexpress.com/item/1005009569496736.html&lt;br /&gt;
* firmware github: &lt;br /&gt;
** https://github.com/RfidResearchGroup/ChameleonUltra&lt;br /&gt;
** https://github.com/GameTec-live/ChameleonUltraGUI&lt;br /&gt;
&lt;br /&gt;
=== advanced lidars for bat detection ===&lt;br /&gt;
livox:&lt;br /&gt;
* github page https://github.com/Livox-SDK/Livox-SDK/tree/master&lt;br /&gt;
* web page: https://www.livoxtech.com/&lt;br /&gt;
&lt;br /&gt;
=== cubecell meshtastic motion detector ===&lt;br /&gt;
I have a cubecell AB01 board.&lt;br /&gt;
This board is focused on low power, has a connection to attach a solar panel and has a lora radio.&lt;br /&gt;
Relatively small amount of RAM, barely enough to run a LoRaWAN stack but probably plenty to run meshtastic&lt;br /&gt;
&lt;br /&gt;
The plan is to build a simple motion detector from this (using a PIR).&lt;br /&gt;
The PIR can wake up the board from low-power, or a timer can wake it periodically.&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/HelTecAutomation/CubeCell-Arduino/tree/master/libraries/Basics/examples/LowPower&lt;br /&gt;
&lt;br /&gt;
=== configure multitech outdoor gateway ===&lt;br /&gt;
https://www.multitech.net/developer/products/multiconnect-conduit-platform/basestation/&lt;br /&gt;
&lt;br /&gt;
https://multitech.com/product/multitech-conduit-mtcdt-246a-868-eu-gb/&lt;br /&gt;
&lt;br /&gt;
emergency procedure:&lt;br /&gt;
https://www.multitech.net/developer/software/mlinux/using-mlinux/flashing-mlinux-firmware-for-conduit/&lt;br /&gt;
&lt;br /&gt;
=== esp32 wtf ===&lt;br /&gt;
* https://forum.arduino.cc/t/ttgo-lilygo-lora-esp32-26mhz-problem/1353750&lt;br /&gt;
* &amp;quot;26 MHz crystal has been deprecated&amp;quot; https://github.com/espressif/arduino-esp32/issues/10117&lt;br /&gt;
&lt;br /&gt;
=== kakofonie counter ===&lt;br /&gt;
Sample room audio, use neural network to distinguish voices to estimate number of people talking in the past 30 seconds or so.&lt;br /&gt;
Show this number on some kind of display, publish it to MQTT, make a nice graph of it.&lt;br /&gt;
&lt;br /&gt;
Stuff to figure out:&lt;br /&gt;
* this is called &#039;speaker diarization&#039;&lt;br /&gt;
* can it run on an ESP32?&lt;br /&gt;
* make a prototype&lt;br /&gt;
&lt;br /&gt;
=== hypno toad ===&lt;br /&gt;
Put these LEDS https://nl.aliexpress.com/item/1005007583528891.html into https://www.action.com/nl-nl/p/2560347/solar-tuinbeeldje/&lt;br /&gt;
&lt;br /&gt;
Turns out that the default circuit is really basic and output a rough step-up waveform to the LED.&lt;br /&gt;
The self-fading LEDs don&#039;t work very well with that.&lt;br /&gt;
&lt;br /&gt;
Also, putting some IPA on hotglue makes it release really easy.&lt;br /&gt;
&lt;br /&gt;
=== wasbeer / kat classifier ===&lt;br /&gt;
ESP32 with resnet50 neural net to distinguish house cats from other animals, see also:&lt;br /&gt;
* https://ieeexplore.ieee.org/document/10556848/&lt;br /&gt;
&lt;br /&gt;
=== Nespresso brew counter ===&lt;br /&gt;
Several hacker spaces have one of these Nespresso cup coffee makers, but there&#039;s no obvious easy way to monitor usage (monitor ALL the things!).&lt;br /&gt;
Inspired by https://hackaday.com/2021/04/25/arduino-mkr-makes-nespresso-monitoring-easy/ this idea is making an even simpler nespresso monitor,&lt;br /&gt;
using an inexpensive WiFi enabled ESP8266 with an ubiquitous I2S microphone such as the INMP441. &lt;br /&gt;
&lt;br /&gt;
Use this sound monitoring project:&lt;br /&gt;
https://github.com/aleiei/ESP8266-BUG-I2S-MIC&lt;br /&gt;
and turn it into a WiFi connected brew counter.&lt;br /&gt;
&lt;br /&gt;
Software for getting microphone data from an ESP8266/I2S mic into Linux https://github.com/bertrik/EspMicServer&lt;br /&gt;
Nespresso sound is typically 50 Hz with overtones.&lt;br /&gt;
In a recording with the ESP8266, it appears that oddly the 17th harmonic (around 850 Hz) is quite strong.&lt;br /&gt;
&lt;br /&gt;
The plan in the short term is this:&lt;br /&gt;
* apply a gentle IIR filter to subtract any DC bias from the microphone signal&lt;br /&gt;
* calculate autocovariance at offsets 0 and 20 ms (inverse of 50 Hz), representing the total energy and the energy at 50 Hz respectively&lt;br /&gt;
* compare amplitudes to decide about presence of 50 Hz signal, e.g. calculate ratio in dB&lt;br /&gt;
* use this to count the length of time that a 50 Hz signal is heard (increments of 100 ms or so)&lt;br /&gt;
* decide about none / espresso / lungo based on time&lt;br /&gt;
&lt;br /&gt;
Might even integrate with esphome / home assistant later.&lt;br /&gt;
&lt;br /&gt;
=== Remote bat box monitor ===&lt;br /&gt;
Idea:&lt;br /&gt;
* goal: check if remote bat boxes are occupied and identify the species&lt;br /&gt;
* challenges:&lt;br /&gt;
** connectivity: need to transport images/videos (no LoRaWAN), possibly out of range of mobile data networks&lt;br /&gt;
** autonomy: cannot reach the bat box once installed&lt;br /&gt;
** power: no fixed power connection, so probably needs a battery + solar panel&lt;br /&gt;
* design&lt;br /&gt;
** wake up every hour, take a picture, go to sleep, upload photos/videos once per day&lt;br /&gt;
** run from batteries, recharge by solar, rules of thumb&lt;br /&gt;
*** batteries should last for about 10 days&lt;br /&gt;
*** battery should be able to charge in 1 day&lt;br /&gt;
*** consider only 10% of peak solar power&lt;br /&gt;
** KPN &amp;quot;4G-op-zee&amp;quot; somewhat confusing article: https://www.kpn.com/zakelijk/mobiel/roaming/noordzee&lt;br /&gt;
* hardware&lt;br /&gt;
** main processor: raspberry pi zero&lt;br /&gt;
*** raspberry pi power consumption overview: https://www.pidramble.com/wiki/benchmarks/power-consumption&lt;br /&gt;
** this hat to wake up the main CPU: https://www.waveshare.com/wiki/Power_Management_HAT_(B) sold at https://www.kiwi-electronics.com/en/power-management-hat-for-raspberry-pi-with-rtc-and-rp2040-mcu-11373&lt;br /&gt;
&lt;br /&gt;
=== KNMI API ===&lt;br /&gt;
Get familiar with https://developer.dataplatform.knmi.nl/open-data-api&lt;br /&gt;
&lt;br /&gt;
=== Grid frequency measurer with web page ===&lt;br /&gt;
See https://github.com/bertrik/GridFrequency&lt;br /&gt;
SSE source is gridfrequency.local/events&lt;br /&gt;
&lt;br /&gt;
=== WeAct CH55x board ===&lt;br /&gt;
Cheap little boards, using a similar chip as used in USB-serial converters.&lt;br /&gt;
&lt;br /&gt;
The hardware&lt;br /&gt;
https://github.com/WeActStudio/WeActStudio.CH552CoreBoard&lt;br /&gt;
&lt;br /&gt;
Flashing it:&lt;br /&gt;
https://hackaday.io/page/137447-flashing-the-ch552-dev-board-from-the-command-line&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://hackaday.io/project/198238-more-weact-ch5xx&lt;br /&gt;
* https://community.platformio.org/t/manually-adding-support-for-ch55x-controller-by-adding-existing-ardunio-core/41138&lt;br /&gt;
&lt;br /&gt;
=== Zigbee device with esp32 ===&lt;br /&gt;
See https://github.com/P-R-O-C-H-Y/arduino-esp32/blob/8169a434c3e46e1bb7711ebcc04f27267db2093c/libraries/ESP32/examples/Zigbee/Zigbee_Light_Bulb/Zigbee_Light_Bulb.ino&lt;br /&gt;
&lt;br /&gt;
See https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Zigbee&lt;br /&gt;
&lt;br /&gt;
Espressif32 arduino platform git: https://github.com/platformio/platform-espressif32&lt;br /&gt;
&lt;br /&gt;
=== Cameratoezicht in Gouda ===&lt;br /&gt;
Gemeente Gouda publiceert een lijst van camera&#039;s in Gouda, zie&lt;br /&gt;
https://gis.gouda.nl/nl/app/Basisviewer_open#!eAGT8uRiNBRy4ZIRYFKSyKkssjJwdzFxNDMz8TKKsLC0cnb0dQ1y5FIByirgkg3xd43ydPYIAQBXGBFm&lt;br /&gt;
&lt;br /&gt;
Aanmelden (semi-automatisch) bij bijvoorbeeld [https://mapcomplete.org/surveillance Surveillance-under-surveillance] ?&lt;br /&gt;
&lt;br /&gt;
=== SolarEdge ===&lt;br /&gt;
Interact with the solar edge api for PV installations.&lt;br /&gt;
&lt;br /&gt;
https://developers.solaredge.com/&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/solaredge-api&lt;br /&gt;
&lt;br /&gt;
=== Stookalert ===&lt;br /&gt;
Idee: gekleurd lampje dat aangeeft of er op dit moment een stookalert actief is&lt;br /&gt;
&lt;br /&gt;
Implementatie:&lt;br /&gt;
* kijk m.b.v. WiFi locatieservice in welke provincie je je bevindt&lt;br /&gt;
* haal JSON op bij https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* toon de bijbehorende kleur op het lampje&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
* Officiele pagina: https://www.atlasleefomgeving.nl/stookwijzer&lt;br /&gt;
* Achterliggende JSON met toestand per provincie: https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* Er moet ook nog ergens een API zijn die fijnmaziger aangeeft wat de toestand is ...&lt;br /&gt;
&lt;br /&gt;
=== Display of current electricity usage ===&lt;br /&gt;
I have a [https://www.zuidwijk.com/product/slimmelezer-plus/ slimme lezer] connected to the P1 port of my smart electricity meter.&lt;br /&gt;
The default firmware exposes meter readings using an event stream (SSE) at http://slimmelezer.local/events&lt;br /&gt;
&lt;br /&gt;
So for example, you can read this with curl:&lt;br /&gt;
  curl http://slimmelezer.local/events&lt;br /&gt;
With result:&lt;br /&gt;
  event: state&lt;br /&gt;
  data: {&amp;quot;id&amp;quot;:&amp;quot;sensor-power_consumed_phase_1&amp;quot;,&amp;quot;value&amp;quot;:0.046,&amp;quot;state&amp;quot;:&amp;quot;0.046 kW&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Specification of SSE: https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
&lt;br /&gt;
What I would like to do is to read these events and control a simple display to display  the current usage number.&lt;br /&gt;
&lt;br /&gt;
=== Participating in ultrasonic sound project ===&lt;br /&gt;
https://bat-migration-europe.netlify.app/project/&lt;br /&gt;
&lt;br /&gt;
Use an audiomoth for this.&lt;br /&gt;
&lt;br /&gt;
=== ESP32 C3 ===&lt;br /&gt;
* [https://www.espressif.com/en/products/socs/esp32-c3 processor page]&lt;br /&gt;
* [https://wiki.luatos.com/chips/esp32c3/index.html luatos basic esp32 c3 board]&lt;br /&gt;
&lt;br /&gt;
=== Flexible LED ticker ===&lt;br /&gt;
Ordered a flexible 32x8 RGB LED display:&lt;br /&gt;
https://nl.aliexpress.com/item/4001296811800.html&lt;br /&gt;
&lt;br /&gt;
Matching diffuser to be 3D printed:&lt;br /&gt;
https://www.thingiverse.com/thing:1903744&lt;br /&gt;
&lt;br /&gt;
=== Washing machine API ===&lt;br /&gt;
https://tratt.net/laurie/blog/2023/displaying_my_washing_machines_remaining_time_with_curl_jq_pizauth.html&lt;br /&gt;
&lt;br /&gt;
=== TinyML ===&lt;br /&gt;
Investigate TinyML, see https://www.tinyml.org/&lt;br /&gt;
Apparently can run on a RP2040 (raspi pi pico).&lt;br /&gt;
&lt;br /&gt;
https://www.hackster.io/mjrobot/esp32-cam-tinyml-image-classification-fruits-vs-veggies-4ab970&lt;br /&gt;
&lt;br /&gt;
=== Bat box busy signal ===&lt;br /&gt;
My brother built little pyramid &#039;blinkies&#039;: solar cell + Lithium-supercapacitor + harvesting circuit + LED encased in clear expoxy.&lt;br /&gt;
&lt;br /&gt;
Can we add a low-power PIR sensor to this, and make a blinky that blinks if movement was detected by the PIR in the past hour?&lt;br /&gt;
&lt;br /&gt;
=== Super tiny RFID ===&lt;br /&gt;
See https://www.sparkfun.com/products/16464 an almost sand grain size RFID chip, 1.25mmx1.25mmx0.55mm&lt;br /&gt;
&lt;br /&gt;
The accompanying reader &amp;quot;M6E Nano&amp;quot; is still quite expensive at $235.95 : https://www.sparkfun.com/products/14066&lt;br /&gt;
&lt;br /&gt;
Uses the MuRata LXMSJZNCMF-198:&lt;br /&gt;
&amp;quot;This product can be used as an ultra small tag and this can be&lt;br /&gt;
fit on any metal objects, non-metal objects, as well as&lt;br /&gt;
embedding into any objects by glue or adhesive and so on.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See also: ISO18000-63 and EPC global Gen2(v2)&lt;br /&gt;
&lt;br /&gt;
Specification:&lt;br /&gt;
* https://www.gs1.org/standards/rfid/uhf-air-interface-protocol&lt;br /&gt;
&lt;br /&gt;
=== TheThingsNetwork-Sondehub bridge ===&lt;br /&gt;
Uploads balloon telemetry to sondehub.&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/ttnhabbridge/issues/6&lt;br /&gt;
&lt;br /&gt;
=== Actually smart boiler ===&lt;br /&gt;
The boiler for hot water is about half of my electricity bill.&lt;br /&gt;
The idea is to use/build a smart switch that switches it on at time when electricity prices are lowest.&lt;br /&gt;
&lt;br /&gt;
Currently have a &amp;quot;Slimme boiler module&amp;quot; from Eneco, which is *not* actually smart,&lt;br /&gt;
since it allows me no control whatsoever when it switches on (besides cutting the power in the meterkast).&lt;br /&gt;
For example, it will switch on mid-day when my price is high and eneco&#039;s price is low, perhaps good for Eneco, not for me. &lt;br /&gt;
Apparently, they even received a [https://nieuws.eneco.nl/slim-apparaatje-bij-boiler-vangt-pieken-wind--en-zonnestroom-op/ subsidy] for this.&lt;br /&gt;
&lt;br /&gt;
A boiler is a pretty big load, about 3 kW, but it is not inductive.&lt;br /&gt;
&lt;br /&gt;
Alternatives:&lt;br /&gt;
* https://www.shelly.cloud/en-nl/products/product-overview/shelly-plus-1-pm-2-pack/shelly-plus-1-pm&lt;br /&gt;
* https://www.solyxenergy.nl/solar-iboost/ to store excess solar energy in hot water, might also be useful for just controlling a boiler to use cheaper rates&lt;br /&gt;
* tuya smartplug, like https://www.wifilampkoning.nl/merken-slimme-verlichting/tuya/tuya-enkele-smartplug-met-energiemeting ?&lt;br /&gt;
* tuya 20A smart plug: https://nl.aliexpress.com/item/1005003347568206.html&lt;br /&gt;
&lt;br /&gt;
=== Receiving gas meters ===&lt;br /&gt;
Apparently gas meters send gas consumption data to the slimme meter using a wireless link in the 868 MHz band.&lt;br /&gt;
Probably just FSK at 38.4, as mentioned here: https://a35.veron.nl/nieuwe-elektra-en-gasmeters/&lt;br /&gt;
&lt;br /&gt;
Interesting leads:&lt;br /&gt;
* https://github.com/stef/smeter&lt;br /&gt;
* https://www.rtl-sdr.com/reading-household-wireless-utility-meters-with-an-rtl-sdr-and-plotting-the-data-in-home-automation-software/&lt;br /&gt;
* https://github.com/bemasher/rtlamr&lt;br /&gt;
&lt;br /&gt;
=== Multi-network wifi manager ===&lt;br /&gt;
Figure out or create software so that ESP8266/ESP32 wifi manager can use multiple networks to connect (not just one),&lt;br /&gt;
so it allowing storing credentials for more than one network. For example, the network at home, the hacker space, at work.&lt;br /&gt;
Instead of reconfiguring the wifi manager for each network, you just *add* your credentials (and the existing credentials&lt;br /&gt;
are not replaced).&lt;br /&gt;
&lt;br /&gt;
See https://github.com/folkertvanheusden/M.A.X.X&lt;br /&gt;
&lt;br /&gt;
Interesting candidates:&lt;br /&gt;
* https://registry.platformio.org/libraries/martinverges/ESP32%20Wifi%20Manager wifi manager for ESP32, has a REST API for managing wifi network, but is incomplete in the sense that you need to write your own code (e.g. javascript) to actually *use* its API&lt;br /&gt;
* https://github.com/arduino-libraries/Arduino_MultiWiFi is the arduino multi wifi library, to allow connecting to multiple different WiFi networks, but it is not a wifi manager, that starts a captive portal, etc&lt;br /&gt;
&lt;br /&gt;
=== Automated bat counting ===&lt;br /&gt;
Can we automatically count the number of bats from the image of a webcam mounted in a bat colony?&lt;br /&gt;
Perhaps using some kind of AI or machine learning algorithm?&lt;br /&gt;
&lt;br /&gt;
The image in question:&lt;br /&gt;
https://stofradar.nl/coenecoop/&lt;br /&gt;
&lt;br /&gt;
=== Use TheThingsIndoorGateway as Helium/ThingSix hotspot ===&lt;br /&gt;
I have a spare TTIG that could perhaps be used as a Helium gateway, investigate what is possible.&lt;br /&gt;
&lt;br /&gt;
One possiblity is to capture the gateway traffic from the TTN gateway events API, convert uplink data to a format that the Helium network understands and forward it.&lt;br /&gt;
I don&#039;t really care about the Helium crypto tokens, this is just for fun and science.&lt;br /&gt;
&lt;br /&gt;
What I definitely can do:&lt;br /&gt;
* Capture data from the TTN gateway events API, convert it back to Semtech UP format and forward it somewhere to Helium (just not sure where!)&lt;br /&gt;
* See also my https://github.com/bertrik/ttn-gateway-collector project which contains an initial implementation of TTN-to-UDP conversion&lt;br /&gt;
&lt;br /&gt;
Showstoppers:&lt;br /&gt;
* If you want to be a gateway on the Helium network, you have to *pay Helium*! Obviously I don&#039;t want that, I just want to share data to improve *their* network. &lt;br /&gt;
&lt;br /&gt;
Open work:&lt;br /&gt;
* Investigate if Helium has an open uplink API for their hotspots, if so study it etc, without paying the gateway fee&lt;br /&gt;
* Investigate if Thingsix has an open uplink API for their hotspots, if so study it etc, without paying any gateway fee&lt;br /&gt;
* Investigate if Thingsix is just another Helium, with weird crypto money&lt;br /&gt;
&lt;br /&gt;
Interesting stuff:&lt;br /&gt;
* https://docs.helium.com/use-the-network/setup-a-packet-forwarder unfortunately the link to setting up the &#039;light hotspot client&#039; does not work!&lt;br /&gt;
* https://docs.helium.com/mine-hnt/light-hotspots/&lt;br /&gt;
* https://thingsix.com/&lt;br /&gt;
&lt;br /&gt;
=== Adding BLE GATT interface to sensors ===&lt;br /&gt;
The GATT specification allows measurement properties to be defined and transferred continuously over Bluetooth low-energy.&lt;br /&gt;
&lt;br /&gt;
With GATT you can define a collection of properties (e.g. measurement items like temperature/humidity/particulate matter/noise, etc)&lt;br /&gt;
organised in a simple structure of a BLE service.&lt;br /&gt;
The &#039;notification&#039; method allows you to basically push the data continuously to a connected host, e.g. a smart phone.&lt;br /&gt;
&lt;br /&gt;
Services collects characteristic, a characteristic has values with units.&lt;br /&gt;
Each of these (service, characteristic, unit) have their own unique &amp;quot;UUID&amp;quot;.&lt;br /&gt;
This is described in the so-called [https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20Numbers%20Document.pdf 16-bit UUID numbers document]&lt;br /&gt;
&lt;br /&gt;
Interesting stuff in GATT:&lt;br /&gt;
* See GATT_Specification_Supplement_v5 paragraph 3.151, it has a noise characteristic with 1 dB resolution.&lt;br /&gt;
* 0x27C3 is the GATT *unit* for sound pressure&lt;br /&gt;
* 0x181A is the GATT environmental sensing *service*, document name &amp;quot;ESP_V1.0.0.pdf&amp;quot;&lt;br /&gt;
* 0x2A6E is the GATT Characteristic and Object Type for temperature&lt;br /&gt;
* 0x2A6F is the GATT Characteristic and Object Type for humidity&lt;br /&gt;
* 0x2BD5 is the GATT Characteristic and Object Type for Particulate Matter - PM1 Concentration&lt;br /&gt;
* 0x2BD6 is the GATT Characteristic and Object Type for Particulate Matter - PM2.5 Concentration&lt;br /&gt;
* 0x2BD7 is the GATT Characteristic and Object Type for Particulate Matter - PM10 Concentration&lt;br /&gt;
* Unfortunately I cannot find a characteristic for carbon-dioxide (CO2) in the BLE GATT unit document&lt;br /&gt;
&lt;br /&gt;
See also https://programmaticponderings.com/2020/08/04/getting-started-with-bluetooth-low-energy-ble-and-generic-attribute-profile-gatt-specification-for-iot/&lt;br /&gt;
&lt;br /&gt;
=== Reverse engineering XS-8217 bluetooth air quality meter ===&lt;br /&gt;
This is a thing that measures CO2, humidity, temperature, TVOC and formaldehyde.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.liutyi.info/display/CO2/ZN-2CO3+Inside&lt;br /&gt;
&lt;br /&gt;
This teardown looks a lot like my sensor: https://www.youtube.com/watch?v=APnjhMrJChI&lt;br /&gt;
Mine contains a &amp;quot;TPM-300A&amp;quot; sensor for measuring VOC.&lt;br /&gt;
&lt;br /&gt;
It has a bluetooth interface, device name is XS-8217.&lt;br /&gt;
It has a BLE GATT profile, with the following services&lt;br /&gt;
* service 0xC760&lt;br /&gt;
** characteristic 0xC762 (WRITE)&lt;br /&gt;
** characteristic 0xC761 (NOTIFY)&lt;br /&gt;
*** example data: 0x23 0x06 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
*** example data: 0x23 0x08 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
*** data shown on screen was approximately: CO2=418ppm, HCHO=0.003mg/m3, TVOC=0.013mg/m3, temp=24degC, humi=35%&lt;br /&gt;
&lt;br /&gt;
So data in the characteristic 0xC761 seems to have a 4 byte constant header:&lt;br /&gt;
* 0x23&lt;br /&gt;
* length byte&lt;br /&gt;
&lt;br /&gt;
Then we have for the first message: 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0xF1 is temperature in 0.1 degree Celcius most likely (24.1)&lt;br /&gt;
* 0x00 is ...&lt;br /&gt;
* 0x23 is humidity most likely (35)&lt;br /&gt;
* 0x65 is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
And for the second message: 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0x01 0x9A is the CO2 concentration (410)&lt;br /&gt;
* 0x00 0x0A is TVOC most likely (10)&lt;br /&gt;
* 0x00 0x03 is HCHO most likely (3)&lt;br /&gt;
* 0x0E is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
=== ribbon tweeter for bat audio ===&lt;br /&gt;
Someone gave me this idea:&lt;br /&gt;
Use a ribbon tweeter like this for playing back bat audio:&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/4000973201791.html&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/1005002565880660.html&amp;lt;/s&amp;gt;&lt;br /&gt;
https://nl.aliexpress.com/item/1005002635086050.html&lt;br /&gt;
&lt;br /&gt;
The frequency spectrum shows no sign of dropping off at 20 kHz.&lt;br /&gt;
&lt;br /&gt;
=== 3d glasses ===&lt;br /&gt;
I got some 2nd hand 3d glasses, they look exactly like these ones:&lt;br /&gt;
* GH-15 https://www.dhgate.com/product/g15-dlp-3d-active-shutter-glasses-96-144hz/213983026.html&lt;br /&gt;
* Sintron https://www.amazon.de/Sintron-Kompatibel-TDG-BT500A-TDG-BT400A-Deutschland/dp/B015PCWMZ8&lt;br /&gt;
The common name appears to be &amp;quot;G15-DLP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A tear-down here:&lt;br /&gt;
* https://blog.danman.eu/3d-shutter-glasses-teardown/&lt;br /&gt;
&lt;br /&gt;
Interesting documents:&lt;br /&gt;
* http://cmst.curtin.edu.au/wp-content/uploads/sites/4/2016/05/2012-28-woods-helliwell-cross-compatibility_of_shutter_glasses.pdf&lt;br /&gt;
* http://cmst.curtin.edu.au/local/docs/pubs/2011-17-woods-helliwell-3D-Sync-IR.pdf&lt;br /&gt;
&lt;br /&gt;
Someone claims he got something to work with some hacks:&lt;br /&gt;
https://www.avsforum.com/threads/how-i-got-cheap-dlp-link-glasses-to-work-great.1887145/&lt;br /&gt;
&lt;br /&gt;
=== Waterniveaumeter ===&lt;br /&gt;
Op verschillende plekken in Gouda staat er water in de kruipruimte van huizen van bewoners.&lt;br /&gt;
Kunnen we dat meten en inzichtelijk maken, voor bewoners, op een kaart bijvoorbeeld?&lt;br /&gt;
&lt;br /&gt;
Idee:&lt;br /&gt;
* in de kruipruimte plaats je een module die waterhoogte kan meten&lt;br /&gt;
* de module bestaat uit een microcontroller en een afstandsmeter, die de waterhoogte bepaalt&lt;br /&gt;
* de gegevens worden via WiFi doorgestuurd naar een centraal punt, waar de data wordt verwerkt en gevisualiseerd&lt;br /&gt;
* op een webpagina kan je een overzicht zien van alle meters die online zijn&lt;br /&gt;
* de meting wordt gedaan door bijv. een laser-afstandsmeter of een ultrasoon-afstandsmeter&lt;br /&gt;
* voeding? lastig, hoe krijg je 5v naar een potentieel natte plek?&lt;br /&gt;
* kosten? verwachting &amp;lt; E 40,-&lt;br /&gt;
&lt;br /&gt;
In Gouda wordt op veel verschillende plekken de grondwaterstand gemeten, zie https://opendata.munisense.net/portal/wareco-water2/group/581/Gouda-KJ38A , maar:&lt;br /&gt;
* geen visualisatie op de kaart, je ziet alleen de meetlokaties d.m.v. een icoontje!&lt;br /&gt;
* geen meetpunten in Gouda noord!&lt;br /&gt;
&lt;br /&gt;
=== Online bat detector ===&lt;br /&gt;
Idea: use an ultrasonic microphone, connect it to a WebSDR, so people can tune into bat sounds remotely.&lt;br /&gt;
&lt;br /&gt;
=== Raspberry pi airplane tracking ===&lt;br /&gt;
Apparently now you can also participate in MLAT tracking of planes that don&#039;t transmit GPS coordinates themselves.&lt;br /&gt;
&lt;br /&gt;
=== APRS gateway ===&lt;br /&gt;
http://qso365.co.uk/2017/02/a-guide-to-setting-up-an-aprs-receive-only-igate-using-a-raspberry-pi-and-an-rtl-sdr-dongle/&lt;br /&gt;
&lt;br /&gt;
=== JQ6500 ===&lt;br /&gt;
Small inexpensive modules that play mp3 from an internal flash. Could be nice for a custom door bell for example.&lt;br /&gt;
&lt;br /&gt;
More info at: &lt;br /&gt;
* https://www.elecfreaks.com/wiki/index.php?title=JQ6500_Mini_MP3_Module&lt;br /&gt;
* https://sparks.gogo.co.nz/jq6500/index.html&lt;br /&gt;
&lt;br /&gt;
=== FPGA ===&lt;br /&gt;
Cheap FPGA boards and nice applications:&lt;br /&gt;
* https://bitbucket.org/appanp/artificial-neural-networks/wiki/Home/FPGAsAndNeuralNets.md#!sbcs-and-iot-boards &lt;br /&gt;
* [http://nl.aliexpress.com/item/Altera-fpga-cycloneii-ep2c5t144-learning-board-development-board/872520721.html inexpensive ep2c5t144 board] &lt;br /&gt;
* http://land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board&lt;br /&gt;
&lt;br /&gt;
=== Neural networks on low-end hardware ===&lt;br /&gt;
Investigate if you can run a powerful neural network on relatively low-end/cheap/low-power hardware. For example a Raspberry pi.&lt;br /&gt;
A RPI runs Linux, run python, just like some common neural frameworks.&lt;br /&gt;
Do we need hardware acceleration from the GPU and does the RPI GPU support that?&lt;br /&gt;
&lt;br /&gt;
Read list:&lt;br /&gt;
* https://www.zdnet.com/pictures/raspberry-pi-meets-ai-the-projects-that-put-machine-learning-on-the-35-board/&lt;br /&gt;
* https://www.pyimagesearch.com/2017/12/18/keras-deep-learning-raspberry-pi/&lt;br /&gt;
* https://www.indiegogo.com/projects/sipeed-maix-the-world-first-risc-v-64-ai-module#/&lt;br /&gt;
* https://ai.intel.com/intel-neural-compute-stick-2-smarter-faster-plug-and-play-ai-at-the-edge/&lt;br /&gt;
&lt;br /&gt;
Bought a MaixPy:&lt;br /&gt;
* see https://maixpy.sipeed.com/en/&lt;br /&gt;
* see https://www.youtube.com/watch?v=KResVuAIMb4&lt;br /&gt;
* see http://educ8s.tv/sipeed-m1-dock-review/&lt;br /&gt;
* interesting? https://www.instructables.com/id/Transfer-Learning-With-Sipeed-MaiX-and-Arduino-IDE/&lt;br /&gt;
&lt;br /&gt;
=== mini word clock in dutch ===&lt;br /&gt;
Basically an monochrome 8x8 word clock, in Dutch, showing local time in the Netherlands.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bertrik/miniwordclock This git repo] has the current code.&lt;br /&gt;
&lt;br /&gt;
See [https://plus.google.com/103276078656203197145/posts/7ki7rpJzk3a here for a demo] running on an arduino nano.&lt;br /&gt;
&lt;br /&gt;
The plan is to run this from an ESP8266 instead of an arduino nano, so it can get the time from the internet using NTP.&lt;br /&gt;
Andreas Spiess demonstrated on youtube how existing libraries on the ESP8266 can be used to do the local time (including summer-time) calculations.&lt;br /&gt;
&lt;br /&gt;
=== Cypress PSOC5 ===&lt;br /&gt;
Play with the Cypress PSOC5 platform, which combines a ARM Cortex-m3 processor with configurable analog blocks. I&#039;m thinking of combining it with a 24 GHz doppler radar sensor, to process the signal and present it as a USB audio device (stereo signal contains I and Q parts). See [[RadarOnAStick]].&lt;br /&gt;
&lt;br /&gt;
=== Simple Doppler motion sensors ===&lt;br /&gt;
You can find basic doppler microwave motion sensors based on a single transistor, with some weird traces on the PCB very cheaply, for example&lt;br /&gt;
* https://www.aliexpress.com/item/RCWL-0516-microwave-radar-sensor-module-Human-body-induction-switch-module-Intelligent-sensor/32708877914.html&lt;br /&gt;
&lt;br /&gt;
Typically the microwave part of these consists of a single transistor with a rectangular area on one leg and a meandering trace (with lots of vias to the other side) on the other leg.&lt;br /&gt;
The output of this circuit seems to go into a chip very much like the ones used in PIR sensors.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/jdesbonnet/RCWL-0516 for a reverse engineering effort of these doppler radar modules.&lt;br /&gt;
&lt;br /&gt;
=== Bare-bones Arduino bat detector ===&lt;br /&gt;
This is an idea for a very basic heterodyne bat detector, doing signal processing on an Arduino, requiring minimal external components.&lt;br /&gt;
&lt;br /&gt;
The basic principle of a heterodyne detector is that it just mixes (multiplies) the audio signal with a square wave, low-pass filters the result and puts it on a speaker.&lt;br /&gt;
&lt;br /&gt;
Multiplying with a square wave can also be considered to be just alternatively inverting and not-inverting the signal.&lt;br /&gt;
So if you sample an ultrasonic signal at twice the rate you want to multiply, you can just subtract odd samples from even samples and low-pass filter that.&lt;br /&gt;
&lt;br /&gt;
How this can be done in an AVR Arduino:&lt;br /&gt;
* sample the audio signal at twice the detection frequency, say 84 kHz. An AVR should just be able to do that.&lt;br /&gt;
* apply a 1-pole IIR high-pass filter to remove DC bias, this takes one shift instruction and one addition.&lt;br /&gt;
* multiply by the detection frequency, this means just inverting the odd samples.&lt;br /&gt;
* low-pass filter the signal, this can be done using a moving average filter, say 16 samples long (first null at 5.25 kHz). Theoretically, averaging 16 samples should result in two bits extra accuracy. This operation takes some storage, an addition and a subtraction.&lt;br /&gt;
* output the filtered signal using PWM, possibly at the same rate that we are sampling the input audio.&lt;br /&gt;
&lt;br /&gt;
The microphone can be a 40 kHz piezo transducer, to keep it cheap (but also limited to 40 kHz).&lt;br /&gt;
The pre-amplifier can be a single transistor with some resistors around it, providing about 40x gain.&lt;br /&gt;
The arduino does the signal processing (mixing, low-pass filter) to shift the bat audio to human range.&lt;br /&gt;
The speaker amplifier can just be a simple two transistor push-pull circuit, since the output from the Arduino is digital/PWM.&lt;br /&gt;
&lt;br /&gt;
==== AVR Arduino sample rate ====&lt;br /&gt;
As far as I understand, the ADC clock can be set to 1 MHz.&lt;br /&gt;
Conversion takes 13 cycles, so this can be a problem to reach a sample rate above 80 kHz.&lt;br /&gt;
&lt;br /&gt;
=== Indoor radar speed sign ===&lt;br /&gt;
This idea about placing a simple IQ-output radar sensor indoors in the hacker space, do some basic signal processing on the IQ doppler signal and determine movement speed and direction, then display this on a LED display.&lt;br /&gt;
This is of no immediate practical use other than fun, but helps me to gain a bit more experience with microwave radar sensors and eventually build a more effective setup for detecting/counting bats flying in and out of a roost.&lt;br /&gt;
&lt;br /&gt;
Implement this on a PSOC5 platform or on the STM32 using Arduino.&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35069</id>
		<title>Meshcore-sensor-net</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore-sensor-net&amp;diff=35069"/>
		<updated>2026-02-22T19:00:03Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: Created page with &amp;quot;  {{Project    |Name=meshcore-sensor-net    |Status=Initializing    |Picture=yunopicture.png    |Contact=bertrik   }}  == Introduction == This project is an investigation for using meshcore as a transport layer for citizen science data.  Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=meshcore-sensor-net&lt;br /&gt;
   |Status=Initializing&lt;br /&gt;
   |Picture=yunopicture.png&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is an investigation for using meshcore as a transport layer for citizen science data.&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of radio repeaters for lora messages with a specific radio setting. The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
&lt;br /&gt;
869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
header enabled&lt;br /&gt;
sync word XXXX&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
&lt;br /&gt;
Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
== Investigation ==&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35067</id>
		<title>User:Bertrik Sikken</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35067"/>
		<updated>2026-02-21T22:27:10Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Meshcore as citizen science data transport */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Smoel&lt;br /&gt;
 |Name=Bertrik Sikken&lt;br /&gt;
 |Nick=bertrik&lt;br /&gt;
 |Tagline=heb ik niet&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You can reach me at [mailto:bertrik@sikken.nl bertrik@sikken.nl] or [mailto:bertrik@gmail.com bertrik@gmail.com].&lt;br /&gt;
&lt;br /&gt;
Studied Electrical Engineering at Twente University.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Main interests:&lt;br /&gt;
* reverse-engineering things (USB stuff, mp3 players), worked on http://rockbox.org (sansa clip players)&lt;br /&gt;
* studying bats and making electronics for recording/listening to bat sounds&lt;br /&gt;
* radio stuff, in particular software-defined radio, LoRa networks&lt;br /&gt;
* citizen science and open data (particulate matter measurement, noise, water quality)&lt;br /&gt;
* energy-related stuff, visualisation&lt;br /&gt;
&lt;br /&gt;
Projects I work(ed) on ([https://revspace.nl/index.php?title=User:Bertrik_Sikken&amp;amp;action=purge refresh]):&lt;br /&gt;
{{#ask:[[Category:Project]][[Project Contact::bertrik]]&lt;br /&gt;
|?Project Status&lt;br /&gt;
|headers=show&lt;br /&gt;
|link=all&lt;br /&gt;
|order=ASC,ASC&lt;br /&gt;
|sort=Project Status,Project Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project ideas ==&lt;br /&gt;
[[File:always10oclock.jpg|right]]&lt;br /&gt;
[[File:idea.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas I&#039;m thinking about, but have not fully developed into an actual project yet.&lt;br /&gt;
&lt;br /&gt;
https://pine64.com/product/128mb-ox64-sbc-available-on-december-2-2022/&lt;br /&gt;
&lt;br /&gt;
=== Meshcore as citizen science data transport ===&lt;br /&gt;
See https://github.com/bertrik/meshcore-sensor-net&lt;br /&gt;
&lt;br /&gt;
Meshcore is basically a network of repeaters for lora messages with a specific setting.&lt;br /&gt;
The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* header enabled &lt;br /&gt;
* sync word XXXX&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
* Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
* At some point the discovery packets reaches a special internet-connected gateway that forwards it to the backend software.&lt;br /&gt;
* The backend software processes the data payload and sends back an acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
=== investigate thread/matter ===&lt;br /&gt;
Matter/thread is the new IKEA standard for home automation thins apparently. &lt;br /&gt;
Thread is the wireless protocol, matter is a home automation protocol running on top of thread.&lt;br /&gt;
&lt;br /&gt;
I have a couple of nrf52840, these are good in doing thread.&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* check out openthread&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/openthread/openthread.git&lt;br /&gt;
cd openthread&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Prepare development environment:&lt;br /&gt;
  scripts/bootstrap&lt;br /&gt;
* Build it:&lt;br /&gt;
  ./script/build nrf52840 UART_trans -DOT_LOG_LEVEL=OT_LOG_LEVEL_INFO&lt;br /&gt;
&lt;br /&gt;
Thread on ESP32:&lt;br /&gt;
* on ESP32 C6 https://gist.github.com/gtxaspec/d26198daadfb0a8b0a0edeae2d3fd58f&lt;br /&gt;
* https://github.com/espressif/esp-thread-br&lt;br /&gt;
* https://github.com/espressif/esp-idf/tree/master/examples/openthread/ot_rcp&lt;br /&gt;
&lt;br /&gt;
=== action lsc stekker ===&lt;br /&gt;
https://keetsupport.nl/2024/03/20/how-to-flash-lsc-power-plug-with-esphome/&lt;br /&gt;
&lt;br /&gt;
https://community.home-assistant.io/t/detailed-guide-on-how-to-flash-the-new-tuya-beken-chips-with-openbk7231t/437276&lt;br /&gt;
&lt;br /&gt;
=== sipeed maix dock ===&lt;br /&gt;
Bought this a couple of years ago. Get familiar with this board.&lt;br /&gt;
Can I run a chess program on this, for example?&lt;br /&gt;
&lt;br /&gt;
* https://wiki.sipeed.com/soft/maixpy/en/develop_kit_board/maix_dock.html&lt;br /&gt;
&lt;br /&gt;
=== rfid keyfob ===&lt;br /&gt;
* aliexpress page: https://nl.aliexpress.com/item/1005009569496736.html&lt;br /&gt;
* firmware github: &lt;br /&gt;
** https://github.com/RfidResearchGroup/ChameleonUltra&lt;br /&gt;
** https://github.com/GameTec-live/ChameleonUltraGUI&lt;br /&gt;
&lt;br /&gt;
=== advanced lidars for bat detection ===&lt;br /&gt;
livox:&lt;br /&gt;
* github page https://github.com/Livox-SDK/Livox-SDK/tree/master&lt;br /&gt;
* web page: https://www.livoxtech.com/&lt;br /&gt;
&lt;br /&gt;
=== cubecell meshtastic motion detector ===&lt;br /&gt;
I have a cubecell AB01 board.&lt;br /&gt;
This board is focused on low power, has a connection to attach a solar panel and has a lora radio.&lt;br /&gt;
Relatively small amount of RAM, barely enough to run a LoRaWAN stack but probably plenty to run meshtastic&lt;br /&gt;
&lt;br /&gt;
The plan is to build a simple motion detector from this (using a PIR).&lt;br /&gt;
The PIR can wake up the board from low-power, or a timer can wake it periodically.&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/HelTecAutomation/CubeCell-Arduino/tree/master/libraries/Basics/examples/LowPower&lt;br /&gt;
&lt;br /&gt;
=== configure multitech outdoor gateway ===&lt;br /&gt;
https://www.multitech.net/developer/products/multiconnect-conduit-platform/basestation/&lt;br /&gt;
&lt;br /&gt;
https://multitech.com/product/multitech-conduit-mtcdt-246a-868-eu-gb/&lt;br /&gt;
&lt;br /&gt;
emergency procedure:&lt;br /&gt;
https://www.multitech.net/developer/software/mlinux/using-mlinux/flashing-mlinux-firmware-for-conduit/&lt;br /&gt;
&lt;br /&gt;
=== esp32 wtf ===&lt;br /&gt;
* https://forum.arduino.cc/t/ttgo-lilygo-lora-esp32-26mhz-problem/1353750&lt;br /&gt;
* &amp;quot;26 MHz crystal has been deprecated&amp;quot; https://github.com/espressif/arduino-esp32/issues/10117&lt;br /&gt;
&lt;br /&gt;
=== kakofonie counter ===&lt;br /&gt;
Sample room audio, use neural network to distinguish voices to estimate number of people talking in the past 30 seconds or so.&lt;br /&gt;
Show this number on some kind of display, publish it to MQTT, make a nice graph of it.&lt;br /&gt;
&lt;br /&gt;
Stuff to figure out:&lt;br /&gt;
* this is called &#039;speaker diarization&#039;&lt;br /&gt;
* can it run on an ESP32?&lt;br /&gt;
* make a prototype&lt;br /&gt;
&lt;br /&gt;
=== hypno toad ===&lt;br /&gt;
Put these LEDS https://nl.aliexpress.com/item/1005007583528891.html into https://www.action.com/nl-nl/p/2560347/solar-tuinbeeldje/&lt;br /&gt;
&lt;br /&gt;
Turns out that the default circuit is really basic and output a rough step-up waveform to the LED.&lt;br /&gt;
The self-fading LEDs don&#039;t work very well with that.&lt;br /&gt;
&lt;br /&gt;
Also, putting some IPA on hotglue makes it release really easy.&lt;br /&gt;
&lt;br /&gt;
=== wasbeer / kat classifier ===&lt;br /&gt;
ESP32 with resnet50 neural net to distinguish house cats from other animals, see also:&lt;br /&gt;
* https://ieeexplore.ieee.org/document/10556848/&lt;br /&gt;
&lt;br /&gt;
=== Nespresso brew counter ===&lt;br /&gt;
Several hacker spaces have one of these Nespresso cup coffee makers, but there&#039;s no obvious easy way to monitor usage (monitor ALL the things!).&lt;br /&gt;
Inspired by https://hackaday.com/2021/04/25/arduino-mkr-makes-nespresso-monitoring-easy/ this idea is making an even simpler nespresso monitor,&lt;br /&gt;
using an inexpensive WiFi enabled ESP8266 with an ubiquitous I2S microphone such as the INMP441. &lt;br /&gt;
&lt;br /&gt;
Use this sound monitoring project:&lt;br /&gt;
https://github.com/aleiei/ESP8266-BUG-I2S-MIC&lt;br /&gt;
and turn it into a WiFi connected brew counter.&lt;br /&gt;
&lt;br /&gt;
Software for getting microphone data from an ESP8266/I2S mic into Linux https://github.com/bertrik/EspMicServer&lt;br /&gt;
Nespresso sound is typically 50 Hz with overtones.&lt;br /&gt;
In a recording with the ESP8266, it appears that oddly the 17th harmonic (around 850 Hz) is quite strong.&lt;br /&gt;
&lt;br /&gt;
The plan in the short term is this:&lt;br /&gt;
* apply a gentle IIR filter to subtract any DC bias from the microphone signal&lt;br /&gt;
* calculate autocovariance at offsets 0 and 20 ms (inverse of 50 Hz), representing the total energy and the energy at 50 Hz respectively&lt;br /&gt;
* compare amplitudes to decide about presence of 50 Hz signal, e.g. calculate ratio in dB&lt;br /&gt;
* use this to count the length of time that a 50 Hz signal is heard (increments of 100 ms or so)&lt;br /&gt;
* decide about none / espresso / lungo based on time&lt;br /&gt;
&lt;br /&gt;
Might even integrate with esphome / home assistant later.&lt;br /&gt;
&lt;br /&gt;
=== Remote bat box monitor ===&lt;br /&gt;
Idea:&lt;br /&gt;
* goal: check if remote bat boxes are occupied and identify the species&lt;br /&gt;
* challenges:&lt;br /&gt;
** connectivity: need to transport images/videos (no LoRaWAN), possibly out of range of mobile data networks&lt;br /&gt;
** autonomy: cannot reach the bat box once installed&lt;br /&gt;
** power: no fixed power connection, so probably needs a battery + solar panel&lt;br /&gt;
* design&lt;br /&gt;
** wake up every hour, take a picture, go to sleep, upload photos/videos once per day&lt;br /&gt;
** run from batteries, recharge by solar, rules of thumb&lt;br /&gt;
*** batteries should last for about 10 days&lt;br /&gt;
*** battery should be able to charge in 1 day&lt;br /&gt;
*** consider only 10% of peak solar power&lt;br /&gt;
** KPN &amp;quot;4G-op-zee&amp;quot; somewhat confusing article: https://www.kpn.com/zakelijk/mobiel/roaming/noordzee&lt;br /&gt;
* hardware&lt;br /&gt;
** main processor: raspberry pi zero&lt;br /&gt;
*** raspberry pi power consumption overview: https://www.pidramble.com/wiki/benchmarks/power-consumption&lt;br /&gt;
** this hat to wake up the main CPU: https://www.waveshare.com/wiki/Power_Management_HAT_(B) sold at https://www.kiwi-electronics.com/en/power-management-hat-for-raspberry-pi-with-rtc-and-rp2040-mcu-11373&lt;br /&gt;
&lt;br /&gt;
=== KNMI API ===&lt;br /&gt;
Get familiar with https://developer.dataplatform.knmi.nl/open-data-api&lt;br /&gt;
&lt;br /&gt;
=== Grid frequency measurer with web page ===&lt;br /&gt;
See https://github.com/bertrik/GridFrequency&lt;br /&gt;
SSE source is gridfrequency.local/events&lt;br /&gt;
&lt;br /&gt;
=== WeAct CH55x board ===&lt;br /&gt;
Cheap little boards, using a similar chip as used in USB-serial converters.&lt;br /&gt;
&lt;br /&gt;
The hardware&lt;br /&gt;
https://github.com/WeActStudio/WeActStudio.CH552CoreBoard&lt;br /&gt;
&lt;br /&gt;
Flashing it:&lt;br /&gt;
https://hackaday.io/page/137447-flashing-the-ch552-dev-board-from-the-command-line&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://hackaday.io/project/198238-more-weact-ch5xx&lt;br /&gt;
* https://community.platformio.org/t/manually-adding-support-for-ch55x-controller-by-adding-existing-ardunio-core/41138&lt;br /&gt;
&lt;br /&gt;
=== Zigbee device with esp32 ===&lt;br /&gt;
See https://github.com/P-R-O-C-H-Y/arduino-esp32/blob/8169a434c3e46e1bb7711ebcc04f27267db2093c/libraries/ESP32/examples/Zigbee/Zigbee_Light_Bulb/Zigbee_Light_Bulb.ino&lt;br /&gt;
&lt;br /&gt;
See https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Zigbee&lt;br /&gt;
&lt;br /&gt;
Espressif32 arduino platform git: https://github.com/platformio/platform-espressif32&lt;br /&gt;
&lt;br /&gt;
=== Cameratoezicht in Gouda ===&lt;br /&gt;
Gemeente Gouda publiceert een lijst van camera&#039;s in Gouda, zie&lt;br /&gt;
https://gis.gouda.nl/nl/app/Basisviewer_open#!eAGT8uRiNBRy4ZIRYFKSyKkssjJwdzFxNDMz8TKKsLC0cnb0dQ1y5FIByirgkg3xd43ydPYIAQBXGBFm&lt;br /&gt;
&lt;br /&gt;
Aanmelden (semi-automatisch) bij bijvoorbeeld [https://mapcomplete.org/surveillance Surveillance-under-surveillance] ?&lt;br /&gt;
&lt;br /&gt;
=== SolarEdge ===&lt;br /&gt;
Interact with the solar edge api for PV installations.&lt;br /&gt;
&lt;br /&gt;
https://developers.solaredge.com/&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/solaredge-api&lt;br /&gt;
&lt;br /&gt;
=== Stookalert ===&lt;br /&gt;
Idee: gekleurd lampje dat aangeeft of er op dit moment een stookalert actief is&lt;br /&gt;
&lt;br /&gt;
Implementatie:&lt;br /&gt;
* kijk m.b.v. WiFi locatieservice in welke provincie je je bevindt&lt;br /&gt;
* haal JSON op bij https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* toon de bijbehorende kleur op het lampje&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
* Officiele pagina: https://www.atlasleefomgeving.nl/stookwijzer&lt;br /&gt;
* Achterliggende JSON met toestand per provincie: https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* Er moet ook nog ergens een API zijn die fijnmaziger aangeeft wat de toestand is ...&lt;br /&gt;
&lt;br /&gt;
=== Display of current electricity usage ===&lt;br /&gt;
I have a [https://www.zuidwijk.com/product/slimmelezer-plus/ slimme lezer] connected to the P1 port of my smart electricity meter.&lt;br /&gt;
The default firmware exposes meter readings using an event stream (SSE) at http://slimmelezer.local/events&lt;br /&gt;
&lt;br /&gt;
So for example, you can read this with curl:&lt;br /&gt;
  curl http://slimmelezer.local/events&lt;br /&gt;
With result:&lt;br /&gt;
  event: state&lt;br /&gt;
  data: {&amp;quot;id&amp;quot;:&amp;quot;sensor-power_consumed_phase_1&amp;quot;,&amp;quot;value&amp;quot;:0.046,&amp;quot;state&amp;quot;:&amp;quot;0.046 kW&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Specification of SSE: https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
&lt;br /&gt;
What I would like to do is to read these events and control a simple display to display  the current usage number.&lt;br /&gt;
&lt;br /&gt;
=== Participating in ultrasonic sound project ===&lt;br /&gt;
https://bat-migration-europe.netlify.app/project/&lt;br /&gt;
&lt;br /&gt;
Use an audiomoth for this.&lt;br /&gt;
&lt;br /&gt;
=== ESP32 C3 ===&lt;br /&gt;
* [https://www.espressif.com/en/products/socs/esp32-c3 processor page]&lt;br /&gt;
* [https://wiki.luatos.com/chips/esp32c3/index.html luatos basic esp32 c3 board]&lt;br /&gt;
&lt;br /&gt;
=== Flexible LED ticker ===&lt;br /&gt;
Ordered a flexible 32x8 RGB LED display:&lt;br /&gt;
https://nl.aliexpress.com/item/4001296811800.html&lt;br /&gt;
&lt;br /&gt;
Matching diffuser to be 3D printed:&lt;br /&gt;
https://www.thingiverse.com/thing:1903744&lt;br /&gt;
&lt;br /&gt;
=== Washing machine API ===&lt;br /&gt;
https://tratt.net/laurie/blog/2023/displaying_my_washing_machines_remaining_time_with_curl_jq_pizauth.html&lt;br /&gt;
&lt;br /&gt;
=== TinyML ===&lt;br /&gt;
Investigate TinyML, see https://www.tinyml.org/&lt;br /&gt;
Apparently can run on a RP2040 (raspi pi pico).&lt;br /&gt;
&lt;br /&gt;
https://www.hackster.io/mjrobot/esp32-cam-tinyml-image-classification-fruits-vs-veggies-4ab970&lt;br /&gt;
&lt;br /&gt;
=== Bat box busy signal ===&lt;br /&gt;
My brother built little pyramid &#039;blinkies&#039;: solar cell + Lithium-supercapacitor + harvesting circuit + LED encased in clear expoxy.&lt;br /&gt;
&lt;br /&gt;
Can we add a low-power PIR sensor to this, and make a blinky that blinks if movement was detected by the PIR in the past hour?&lt;br /&gt;
&lt;br /&gt;
=== Super tiny RFID ===&lt;br /&gt;
See https://www.sparkfun.com/products/16464 an almost sand grain size RFID chip, 1.25mmx1.25mmx0.55mm&lt;br /&gt;
&lt;br /&gt;
The accompanying reader &amp;quot;M6E Nano&amp;quot; is still quite expensive at $235.95 : https://www.sparkfun.com/products/14066&lt;br /&gt;
&lt;br /&gt;
Uses the MuRata LXMSJZNCMF-198:&lt;br /&gt;
&amp;quot;This product can be used as an ultra small tag and this can be&lt;br /&gt;
fit on any metal objects, non-metal objects, as well as&lt;br /&gt;
embedding into any objects by glue or adhesive and so on.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See also: ISO18000-63 and EPC global Gen2(v2)&lt;br /&gt;
&lt;br /&gt;
Specification:&lt;br /&gt;
* https://www.gs1.org/standards/rfid/uhf-air-interface-protocol&lt;br /&gt;
&lt;br /&gt;
=== TheThingsNetwork-Sondehub bridge ===&lt;br /&gt;
Uploads balloon telemetry to sondehub.&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/ttnhabbridge/issues/6&lt;br /&gt;
&lt;br /&gt;
=== Actually smart boiler ===&lt;br /&gt;
The boiler for hot water is about half of my electricity bill.&lt;br /&gt;
The idea is to use/build a smart switch that switches it on at time when electricity prices are lowest.&lt;br /&gt;
&lt;br /&gt;
Currently have a &amp;quot;Slimme boiler module&amp;quot; from Eneco, which is *not* actually smart,&lt;br /&gt;
since it allows me no control whatsoever when it switches on (besides cutting the power in the meterkast).&lt;br /&gt;
For example, it will switch on mid-day when my price is high and eneco&#039;s price is low, perhaps good for Eneco, not for me. &lt;br /&gt;
Apparently, they even received a [https://nieuws.eneco.nl/slim-apparaatje-bij-boiler-vangt-pieken-wind--en-zonnestroom-op/ subsidy] for this.&lt;br /&gt;
&lt;br /&gt;
A boiler is a pretty big load, about 3 kW, but it is not inductive.&lt;br /&gt;
&lt;br /&gt;
Alternatives:&lt;br /&gt;
* https://www.shelly.cloud/en-nl/products/product-overview/shelly-plus-1-pm-2-pack/shelly-plus-1-pm&lt;br /&gt;
* https://www.solyxenergy.nl/solar-iboost/ to store excess solar energy in hot water, might also be useful for just controlling a boiler to use cheaper rates&lt;br /&gt;
* tuya smartplug, like https://www.wifilampkoning.nl/merken-slimme-verlichting/tuya/tuya-enkele-smartplug-met-energiemeting ?&lt;br /&gt;
* tuya 20A smart plug: https://nl.aliexpress.com/item/1005003347568206.html&lt;br /&gt;
&lt;br /&gt;
=== Receiving gas meters ===&lt;br /&gt;
Apparently gas meters send gas consumption data to the slimme meter using a wireless link in the 868 MHz band.&lt;br /&gt;
Probably just FSK at 38.4, as mentioned here: https://a35.veron.nl/nieuwe-elektra-en-gasmeters/&lt;br /&gt;
&lt;br /&gt;
Interesting leads:&lt;br /&gt;
* https://github.com/stef/smeter&lt;br /&gt;
* https://www.rtl-sdr.com/reading-household-wireless-utility-meters-with-an-rtl-sdr-and-plotting-the-data-in-home-automation-software/&lt;br /&gt;
* https://github.com/bemasher/rtlamr&lt;br /&gt;
&lt;br /&gt;
=== Multi-network wifi manager ===&lt;br /&gt;
Figure out or create software so that ESP8266/ESP32 wifi manager can use multiple networks to connect (not just one),&lt;br /&gt;
so it allowing storing credentials for more than one network. For example, the network at home, the hacker space, at work.&lt;br /&gt;
Instead of reconfiguring the wifi manager for each network, you just *add* your credentials (and the existing credentials&lt;br /&gt;
are not replaced).&lt;br /&gt;
&lt;br /&gt;
See https://github.com/folkertvanheusden/M.A.X.X&lt;br /&gt;
&lt;br /&gt;
Interesting candidates:&lt;br /&gt;
* https://registry.platformio.org/libraries/martinverges/ESP32%20Wifi%20Manager wifi manager for ESP32, has a REST API for managing wifi network, but is incomplete in the sense that you need to write your own code (e.g. javascript) to actually *use* its API&lt;br /&gt;
* https://github.com/arduino-libraries/Arduino_MultiWiFi is the arduino multi wifi library, to allow connecting to multiple different WiFi networks, but it is not a wifi manager, that starts a captive portal, etc&lt;br /&gt;
&lt;br /&gt;
=== Automated bat counting ===&lt;br /&gt;
Can we automatically count the number of bats from the image of a webcam mounted in a bat colony?&lt;br /&gt;
Perhaps using some kind of AI or machine learning algorithm?&lt;br /&gt;
&lt;br /&gt;
The image in question:&lt;br /&gt;
https://stofradar.nl/coenecoop/&lt;br /&gt;
&lt;br /&gt;
=== Use TheThingsIndoorGateway as Helium/ThingSix hotspot ===&lt;br /&gt;
I have a spare TTIG that could perhaps be used as a Helium gateway, investigate what is possible.&lt;br /&gt;
&lt;br /&gt;
One possiblity is to capture the gateway traffic from the TTN gateway events API, convert uplink data to a format that the Helium network understands and forward it.&lt;br /&gt;
I don&#039;t really care about the Helium crypto tokens, this is just for fun and science.&lt;br /&gt;
&lt;br /&gt;
What I definitely can do:&lt;br /&gt;
* Capture data from the TTN gateway events API, convert it back to Semtech UP format and forward it somewhere to Helium (just not sure where!)&lt;br /&gt;
* See also my https://github.com/bertrik/ttn-gateway-collector project which contains an initial implementation of TTN-to-UDP conversion&lt;br /&gt;
&lt;br /&gt;
Showstoppers:&lt;br /&gt;
* If you want to be a gateway on the Helium network, you have to *pay Helium*! Obviously I don&#039;t want that, I just want to share data to improve *their* network. &lt;br /&gt;
&lt;br /&gt;
Open work:&lt;br /&gt;
* Investigate if Helium has an open uplink API for their hotspots, if so study it etc, without paying the gateway fee&lt;br /&gt;
* Investigate if Thingsix has an open uplink API for their hotspots, if so study it etc, without paying any gateway fee&lt;br /&gt;
* Investigate if Thingsix is just another Helium, with weird crypto money&lt;br /&gt;
&lt;br /&gt;
Interesting stuff:&lt;br /&gt;
* https://docs.helium.com/use-the-network/setup-a-packet-forwarder unfortunately the link to setting up the &#039;light hotspot client&#039; does not work!&lt;br /&gt;
* https://docs.helium.com/mine-hnt/light-hotspots/&lt;br /&gt;
* https://thingsix.com/&lt;br /&gt;
&lt;br /&gt;
=== Adding BLE GATT interface to sensors ===&lt;br /&gt;
The GATT specification allows measurement properties to be defined and transferred continuously over Bluetooth low-energy.&lt;br /&gt;
&lt;br /&gt;
With GATT you can define a collection of properties (e.g. measurement items like temperature/humidity/particulate matter/noise, etc)&lt;br /&gt;
organised in a simple structure of a BLE service.&lt;br /&gt;
The &#039;notification&#039; method allows you to basically push the data continuously to a connected host, e.g. a smart phone.&lt;br /&gt;
&lt;br /&gt;
Services collects characteristic, a characteristic has values with units.&lt;br /&gt;
Each of these (service, characteristic, unit) have their own unique &amp;quot;UUID&amp;quot;.&lt;br /&gt;
This is described in the so-called [https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20Numbers%20Document.pdf 16-bit UUID numbers document]&lt;br /&gt;
&lt;br /&gt;
Interesting stuff in GATT:&lt;br /&gt;
* See GATT_Specification_Supplement_v5 paragraph 3.151, it has a noise characteristic with 1 dB resolution.&lt;br /&gt;
* 0x27C3 is the GATT *unit* for sound pressure&lt;br /&gt;
* 0x181A is the GATT environmental sensing *service*, document name &amp;quot;ESP_V1.0.0.pdf&amp;quot;&lt;br /&gt;
* 0x2A6E is the GATT Characteristic and Object Type for temperature&lt;br /&gt;
* 0x2A6F is the GATT Characteristic and Object Type for humidity&lt;br /&gt;
* 0x2BD5 is the GATT Characteristic and Object Type for Particulate Matter - PM1 Concentration&lt;br /&gt;
* 0x2BD6 is the GATT Characteristic and Object Type for Particulate Matter - PM2.5 Concentration&lt;br /&gt;
* 0x2BD7 is the GATT Characteristic and Object Type for Particulate Matter - PM10 Concentration&lt;br /&gt;
* Unfortunately I cannot find a characteristic for carbon-dioxide (CO2) in the BLE GATT unit document&lt;br /&gt;
&lt;br /&gt;
See also https://programmaticponderings.com/2020/08/04/getting-started-with-bluetooth-low-energy-ble-and-generic-attribute-profile-gatt-specification-for-iot/&lt;br /&gt;
&lt;br /&gt;
=== Reverse engineering XS-8217 bluetooth air quality meter ===&lt;br /&gt;
This is a thing that measures CO2, humidity, temperature, TVOC and formaldehyde.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.liutyi.info/display/CO2/ZN-2CO3+Inside&lt;br /&gt;
&lt;br /&gt;
This teardown looks a lot like my sensor: https://www.youtube.com/watch?v=APnjhMrJChI&lt;br /&gt;
Mine contains a &amp;quot;TPM-300A&amp;quot; sensor for measuring VOC.&lt;br /&gt;
&lt;br /&gt;
It has a bluetooth interface, device name is XS-8217.&lt;br /&gt;
It has a BLE GATT profile, with the following services&lt;br /&gt;
* service 0xC760&lt;br /&gt;
** characteristic 0xC762 (WRITE)&lt;br /&gt;
** characteristic 0xC761 (NOTIFY)&lt;br /&gt;
*** example data: 0x23 0x06 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
*** example data: 0x23 0x08 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
*** data shown on screen was approximately: CO2=418ppm, HCHO=0.003mg/m3, TVOC=0.013mg/m3, temp=24degC, humi=35%&lt;br /&gt;
&lt;br /&gt;
So data in the characteristic 0xC761 seems to have a 4 byte constant header:&lt;br /&gt;
* 0x23&lt;br /&gt;
* length byte&lt;br /&gt;
&lt;br /&gt;
Then we have for the first message: 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0xF1 is temperature in 0.1 degree Celcius most likely (24.1)&lt;br /&gt;
* 0x00 is ...&lt;br /&gt;
* 0x23 is humidity most likely (35)&lt;br /&gt;
* 0x65 is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
And for the second message: 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0x01 0x9A is the CO2 concentration (410)&lt;br /&gt;
* 0x00 0x0A is TVOC most likely (10)&lt;br /&gt;
* 0x00 0x03 is HCHO most likely (3)&lt;br /&gt;
* 0x0E is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
=== ribbon tweeter for bat audio ===&lt;br /&gt;
Someone gave me this idea:&lt;br /&gt;
Use a ribbon tweeter like this for playing back bat audio:&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/4000973201791.html&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/1005002565880660.html&amp;lt;/s&amp;gt;&lt;br /&gt;
https://nl.aliexpress.com/item/1005002635086050.html&lt;br /&gt;
&lt;br /&gt;
The frequency spectrum shows no sign of dropping off at 20 kHz.&lt;br /&gt;
&lt;br /&gt;
=== 3d glasses ===&lt;br /&gt;
I got some 2nd hand 3d glasses, they look exactly like these ones:&lt;br /&gt;
* GH-15 https://www.dhgate.com/product/g15-dlp-3d-active-shutter-glasses-96-144hz/213983026.html&lt;br /&gt;
* Sintron https://www.amazon.de/Sintron-Kompatibel-TDG-BT500A-TDG-BT400A-Deutschland/dp/B015PCWMZ8&lt;br /&gt;
The common name appears to be &amp;quot;G15-DLP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A tear-down here:&lt;br /&gt;
* https://blog.danman.eu/3d-shutter-glasses-teardown/&lt;br /&gt;
&lt;br /&gt;
Interesting documents:&lt;br /&gt;
* http://cmst.curtin.edu.au/wp-content/uploads/sites/4/2016/05/2012-28-woods-helliwell-cross-compatibility_of_shutter_glasses.pdf&lt;br /&gt;
* http://cmst.curtin.edu.au/local/docs/pubs/2011-17-woods-helliwell-3D-Sync-IR.pdf&lt;br /&gt;
&lt;br /&gt;
Someone claims he got something to work with some hacks:&lt;br /&gt;
https://www.avsforum.com/threads/how-i-got-cheap-dlp-link-glasses-to-work-great.1887145/&lt;br /&gt;
&lt;br /&gt;
=== Waterniveaumeter ===&lt;br /&gt;
Op verschillende plekken in Gouda staat er water in de kruipruimte van huizen van bewoners.&lt;br /&gt;
Kunnen we dat meten en inzichtelijk maken, voor bewoners, op een kaart bijvoorbeeld?&lt;br /&gt;
&lt;br /&gt;
Idee:&lt;br /&gt;
* in de kruipruimte plaats je een module die waterhoogte kan meten&lt;br /&gt;
* de module bestaat uit een microcontroller en een afstandsmeter, die de waterhoogte bepaalt&lt;br /&gt;
* de gegevens worden via WiFi doorgestuurd naar een centraal punt, waar de data wordt verwerkt en gevisualiseerd&lt;br /&gt;
* op een webpagina kan je een overzicht zien van alle meters die online zijn&lt;br /&gt;
* de meting wordt gedaan door bijv. een laser-afstandsmeter of een ultrasoon-afstandsmeter&lt;br /&gt;
* voeding? lastig, hoe krijg je 5v naar een potentieel natte plek?&lt;br /&gt;
* kosten? verwachting &amp;lt; E 40,-&lt;br /&gt;
&lt;br /&gt;
In Gouda wordt op veel verschillende plekken de grondwaterstand gemeten, zie https://opendata.munisense.net/portal/wareco-water2/group/581/Gouda-KJ38A , maar:&lt;br /&gt;
* geen visualisatie op de kaart, je ziet alleen de meetlokaties d.m.v. een icoontje!&lt;br /&gt;
* geen meetpunten in Gouda noord!&lt;br /&gt;
&lt;br /&gt;
=== Online bat detector ===&lt;br /&gt;
Idea: use an ultrasonic microphone, connect it to a WebSDR, so people can tune into bat sounds remotely.&lt;br /&gt;
&lt;br /&gt;
=== Raspberry pi airplane tracking ===&lt;br /&gt;
Apparently now you can also participate in MLAT tracking of planes that don&#039;t transmit GPS coordinates themselves.&lt;br /&gt;
&lt;br /&gt;
=== APRS gateway ===&lt;br /&gt;
http://qso365.co.uk/2017/02/a-guide-to-setting-up-an-aprs-receive-only-igate-using-a-raspberry-pi-and-an-rtl-sdr-dongle/&lt;br /&gt;
&lt;br /&gt;
=== JQ6500 ===&lt;br /&gt;
Small inexpensive modules that play mp3 from an internal flash. Could be nice for a custom door bell for example.&lt;br /&gt;
&lt;br /&gt;
More info at: &lt;br /&gt;
* https://www.elecfreaks.com/wiki/index.php?title=JQ6500_Mini_MP3_Module&lt;br /&gt;
* https://sparks.gogo.co.nz/jq6500/index.html&lt;br /&gt;
&lt;br /&gt;
=== FPGA ===&lt;br /&gt;
Cheap FPGA boards and nice applications:&lt;br /&gt;
* https://bitbucket.org/appanp/artificial-neural-networks/wiki/Home/FPGAsAndNeuralNets.md#!sbcs-and-iot-boards &lt;br /&gt;
* [http://nl.aliexpress.com/item/Altera-fpga-cycloneii-ep2c5t144-learning-board-development-board/872520721.html inexpensive ep2c5t144 board] &lt;br /&gt;
* http://land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board&lt;br /&gt;
&lt;br /&gt;
=== Neural networks on low-end hardware ===&lt;br /&gt;
Investigate if you can run a powerful neural network on relatively low-end/cheap/low-power hardware. For example a Raspberry pi.&lt;br /&gt;
A RPI runs Linux, run python, just like some common neural frameworks.&lt;br /&gt;
Do we need hardware acceleration from the GPU and does the RPI GPU support that?&lt;br /&gt;
&lt;br /&gt;
Read list:&lt;br /&gt;
* https://www.zdnet.com/pictures/raspberry-pi-meets-ai-the-projects-that-put-machine-learning-on-the-35-board/&lt;br /&gt;
* https://www.pyimagesearch.com/2017/12/18/keras-deep-learning-raspberry-pi/&lt;br /&gt;
* https://www.indiegogo.com/projects/sipeed-maix-the-world-first-risc-v-64-ai-module#/&lt;br /&gt;
* https://ai.intel.com/intel-neural-compute-stick-2-smarter-faster-plug-and-play-ai-at-the-edge/&lt;br /&gt;
&lt;br /&gt;
Bought a MaixPy:&lt;br /&gt;
* see https://maixpy.sipeed.com/en/&lt;br /&gt;
* see https://www.youtube.com/watch?v=KResVuAIMb4&lt;br /&gt;
* see http://educ8s.tv/sipeed-m1-dock-review/&lt;br /&gt;
* interesting? https://www.instructables.com/id/Transfer-Learning-With-Sipeed-MaiX-and-Arduino-IDE/&lt;br /&gt;
&lt;br /&gt;
=== mini word clock in dutch ===&lt;br /&gt;
Basically an monochrome 8x8 word clock, in Dutch, showing local time in the Netherlands.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bertrik/miniwordclock This git repo] has the current code.&lt;br /&gt;
&lt;br /&gt;
See [https://plus.google.com/103276078656203197145/posts/7ki7rpJzk3a here for a demo] running on an arduino nano.&lt;br /&gt;
&lt;br /&gt;
The plan is to run this from an ESP8266 instead of an arduino nano, so it can get the time from the internet using NTP.&lt;br /&gt;
Andreas Spiess demonstrated on youtube how existing libraries on the ESP8266 can be used to do the local time (including summer-time) calculations.&lt;br /&gt;
&lt;br /&gt;
=== Cypress PSOC5 ===&lt;br /&gt;
Play with the Cypress PSOC5 platform, which combines a ARM Cortex-m3 processor with configurable analog blocks. I&#039;m thinking of combining it with a 24 GHz doppler radar sensor, to process the signal and present it as a USB audio device (stereo signal contains I and Q parts). See [[RadarOnAStick]].&lt;br /&gt;
&lt;br /&gt;
=== Simple Doppler motion sensors ===&lt;br /&gt;
You can find basic doppler microwave motion sensors based on a single transistor, with some weird traces on the PCB very cheaply, for example&lt;br /&gt;
* https://www.aliexpress.com/item/RCWL-0516-microwave-radar-sensor-module-Human-body-induction-switch-module-Intelligent-sensor/32708877914.html&lt;br /&gt;
&lt;br /&gt;
Typically the microwave part of these consists of a single transistor with a rectangular area on one leg and a meandering trace (with lots of vias to the other side) on the other leg.&lt;br /&gt;
The output of this circuit seems to go into a chip very much like the ones used in PIR sensors.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/jdesbonnet/RCWL-0516 for a reverse engineering effort of these doppler radar modules.&lt;br /&gt;
&lt;br /&gt;
=== Bare-bones Arduino bat detector ===&lt;br /&gt;
This is an idea for a very basic heterodyne bat detector, doing signal processing on an Arduino, requiring minimal external components.&lt;br /&gt;
&lt;br /&gt;
The basic principle of a heterodyne detector is that it just mixes (multiplies) the audio signal with a square wave, low-pass filters the result and puts it on a speaker.&lt;br /&gt;
&lt;br /&gt;
Multiplying with a square wave can also be considered to be just alternatively inverting and not-inverting the signal.&lt;br /&gt;
So if you sample an ultrasonic signal at twice the rate you want to multiply, you can just subtract odd samples from even samples and low-pass filter that.&lt;br /&gt;
&lt;br /&gt;
How this can be done in an AVR Arduino:&lt;br /&gt;
* sample the audio signal at twice the detection frequency, say 84 kHz. An AVR should just be able to do that.&lt;br /&gt;
* apply a 1-pole IIR high-pass filter to remove DC bias, this takes one shift instruction and one addition.&lt;br /&gt;
* multiply by the detection frequency, this means just inverting the odd samples.&lt;br /&gt;
* low-pass filter the signal, this can be done using a moving average filter, say 16 samples long (first null at 5.25 kHz). Theoretically, averaging 16 samples should result in two bits extra accuracy. This operation takes some storage, an addition and a subtraction.&lt;br /&gt;
* output the filtered signal using PWM, possibly at the same rate that we are sampling the input audio.&lt;br /&gt;
&lt;br /&gt;
The microphone can be a 40 kHz piezo transducer, to keep it cheap (but also limited to 40 kHz).&lt;br /&gt;
The pre-amplifier can be a single transistor with some resistors around it, providing about 40x gain.&lt;br /&gt;
The arduino does the signal processing (mixing, low-pass filter) to shift the bat audio to human range.&lt;br /&gt;
The speaker amplifier can just be a simple two transistor push-pull circuit, since the output from the Arduino is digital/PWM.&lt;br /&gt;
&lt;br /&gt;
==== AVR Arduino sample rate ====&lt;br /&gt;
As far as I understand, the ADC clock can be set to 1 MHz.&lt;br /&gt;
Conversion takes 13 cycles, so this can be a problem to reach a sample rate above 80 kHz.&lt;br /&gt;
&lt;br /&gt;
=== Indoor radar speed sign ===&lt;br /&gt;
This idea about placing a simple IQ-output radar sensor indoors in the hacker space, do some basic signal processing on the IQ doppler signal and determine movement speed and direction, then display this on a LED display.&lt;br /&gt;
This is of no immediate practical use other than fun, but helps me to gain a bit more experience with microwave radar sensors and eventually build a more effective setup for detecting/counting bats flying in and out of a roost.&lt;br /&gt;
&lt;br /&gt;
Implement this on a PSOC5 platform or on the STM32 using Arduino.&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Karaburan&amp;diff=35046</id>
		<title>Karaburan</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Karaburan&amp;diff=35046"/>
		<updated>2026-02-07T21:47:40Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Water measurement probes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
 |Name=Karaburan&lt;br /&gt;
 |Picture=karaburan.png&lt;br /&gt;
 |Omschrijving=Monitoring water quality&lt;br /&gt;
 |Status=In progress&lt;br /&gt;
 |Contact=bertrik&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Next steps ==&lt;br /&gt;
* &amp;lt;s&amp;gt;engage with PX4 community on getting a feel if this is useful to use and if so, how to get started&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;figure out how to duplicate an MQTT stream&amp;lt;/s&amp;gt; don&#039;t bother&lt;br /&gt;
* write python scripts&lt;br /&gt;
** &amp;lt;s&amp;gt;arduino turbidity&amp;lt;/s&amp;gt; don&#039;t bother&lt;br /&gt;
** &amp;lt;s&amp;gt;turbidity-to-mqtt&amp;lt;/s&amp;gt; maybe make this ROS module&lt;br /&gt;
** &amp;lt;s&amp;gt;HID-to-mqtt&amp;lt;/s&amp;gt; maybe make this ROS module&lt;br /&gt;
** position/velocity listener script: latitude, longitude, altitude, heading/bearing/track/whatever, velocity&lt;br /&gt;
* hook things into systemd / udev&lt;br /&gt;
* analoog in op de pi:&lt;br /&gt;
** https://elektronicavoorjou.nl/product/adc-pi/&lt;br /&gt;
** https://www.123materialen.com/products/zeer-nauwkeurige-ads1256-dac8552-ad-da-board-voor-raspberry-pi_1676153&lt;br /&gt;
** FreeJoy project&lt;br /&gt;
* UPS voor pi: https://elektronicavoorjou.nl/product/raspberry-pi-ups-hat/&lt;br /&gt;
* 1-wire stuff:&lt;br /&gt;
** 1-wire adapter emulation on an stm32: https://github.com/alitekin2fx/stm32_ds2480_emu&lt;br /&gt;
** owfs.org for easy interfacing with multiple 1-wire devices in a hierarchical way on linux&lt;br /&gt;
* Figure out the udev/hotplug mess, we probably need this because many of our peripherals use a serial port:&lt;br /&gt;
** in how many places can we store the udev renaming logic (config files)&lt;br /&gt;
** can we automate this, make it user friendlier, e.g. some kind of &amp;quot;insert device X now&amp;quot; script&lt;br /&gt;
&lt;br /&gt;
Check:&lt;br /&gt;
* https://www.rtvnoord.nl/natuur/1215705/vuilrobot-maakt-jachthaven-winschoten-schoon-beter-dan-met-een-schepnet&lt;br /&gt;
&lt;br /&gt;
=== USB HID as analog input ===&lt;br /&gt;
An stm32 based bluepill board can be flashed with firmware to allow its analog inputs to be exposed as USB HID sliders.&lt;br /&gt;
&lt;br /&gt;
Flashing the bluepill with openocd to the freejoy firmware:&lt;br /&gt;
* install openocd&lt;br /&gt;
  sudo apt install openocd&lt;br /&gt;
* connect an stlinkv2 to an stm32 bluepill, connect the stlinkv2 to USB&lt;br /&gt;
* flash the freejoy firmware as follows:&lt;br /&gt;
** download the firmware from https://github.com/FreeJoy-Team/FreeJoy&lt;br /&gt;
** create a symlink to the hex file called firmware.hex&lt;br /&gt;
** flash the firmware from the command line&lt;br /&gt;
  openocd -s /usr/share/openocd/scripts -f interface/stlink.cfg -f target/stm32f1x.cfg -c init -c &amp;quot;program firmware.hex verify reset exit&amp;quot;&lt;br /&gt;
* watch the kernel logs&lt;br /&gt;
  sudo dmesg -w&lt;br /&gt;
* connect the stm32 using a USB cable&lt;br /&gt;
* download the freejoy configurator from https://github.com/FreeJoy-Team/FreeJoyConfiguratorQt&lt;br /&gt;
* start the configurator and load the karaburan.cfg setting&lt;br /&gt;
* Write config to device -&amp;gt; it should reboot now and come up with the new settings&lt;br /&gt;
&lt;br /&gt;
Verify that it works:&lt;br /&gt;
* install the evtest package&lt;br /&gt;
* run&lt;br /&gt;
  evtest /dev/input/by-id/usb-FreeJoy_FreeJoy_v1.7.1-event-if00&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/vostrenkov/EazyJoy&lt;br /&gt;
&lt;br /&gt;
=== influxdb ===&lt;br /&gt;
See https://hub.docker.com/_/influxdb&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/karaburan/tree/master/influxdb&lt;br /&gt;
&lt;br /&gt;
=== ROS ===&lt;br /&gt;
Investigation:&lt;br /&gt;
* Use ROS 2, not the old ROS 1&lt;br /&gt;
* Cannot work comfortably with debian, works best with ubuntu&lt;br /&gt;
* Using gpsd:&lt;br /&gt;
** install ros-jazzy-desktop&lt;br /&gt;
** ros2 launch gpsd_client gpsd_client-launch.py&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Topics:&lt;br /&gt;
* air quality sensors&lt;br /&gt;
** ammonia&lt;br /&gt;
** NOx&lt;br /&gt;
* water chemical analysis&lt;br /&gt;
** nitrates&lt;br /&gt;
** ammonia&lt;br /&gt;
** dissolved oxygen&lt;br /&gt;
** sulfide/sulfate&lt;br /&gt;
** phosphates?&lt;br /&gt;
** salinity (chlorides?)&lt;br /&gt;
* water physical analysis&lt;br /&gt;
** temperature&lt;br /&gt;
** clarity/turbidity -&amp;gt; investigate standard ways of measuring/expressing this&lt;br /&gt;
** conductivity/total dissolved solids&lt;br /&gt;
** water properties by light reflection, hyperspectral/polarity&lt;br /&gt;
** depth?&lt;br /&gt;
* boat control&lt;br /&gt;
** trajectory -&amp;gt; steering&lt;br /&gt;
** idea: interface with the remote control, not with the boat&lt;br /&gt;
** idea: find a boat with easily hackable remote control protocol&lt;br /&gt;
** idea: can we get sensor data over this link too, e.g. GPS?&lt;br /&gt;
* camera control&lt;br /&gt;
* post-processing&lt;br /&gt;
** data presentation&lt;br /&gt;
*** video/photo stitching&lt;br /&gt;
*** time lapse view&lt;br /&gt;
*** map view of properties&lt;br /&gt;
* use cases&lt;br /&gt;
** verify with domain experts, how to engage?&lt;br /&gt;
** slootview, under/above water&lt;br /&gt;
** minimum viable prototype&lt;br /&gt;
** high-res measurement by location, by time&lt;br /&gt;
* materials&lt;br /&gt;
** boat selection&lt;br /&gt;
** processing platform selection&lt;br /&gt;
** communication platform selection&lt;br /&gt;
&lt;br /&gt;
== Investigate RTK GPS ==&lt;br /&gt;
Goal: figure out if it is practically possible to achieve cm resolution with a 200-euro GPS and a free correction service: YES&lt;br /&gt;
&lt;br /&gt;
* https://www.nsgi.nl/referentiepunten-en-gnss-data/gnss-data/real-time-streams public correction data service&lt;br /&gt;
* https://www.ardusimple.nl/rtk-in-5-minutes/&lt;br /&gt;
* RTK in action https://www.youtube.com/watch?v=Oc1LBFDj2MA&lt;br /&gt;
* Use with Linux / gpsd: https://stackoverflow.com/questions/77314115/drotek-gpsd-and-ntrip-correction-data-for-precise-positioning ?&lt;br /&gt;
* Chipsets&lt;br /&gt;
** Quectel LC29H (default: 115200 bps)&lt;br /&gt;
*** review: see https://rtklibexplorer.wordpress.com/2024/04/28/dual-frequency-rtk-for-less-than-60-with-the-quectel-lc29hea/&lt;br /&gt;
*** configuration: https://rtklibexplorer.wordpress.com/2024/05/06/configuring-the-quectel-lc29hea-receiver-for-real-time-rtk-solutions/&lt;br /&gt;
** uBLOX ZED-F9P&lt;br /&gt;
* Boards&lt;br /&gt;
** UM980 / UM982&lt;br /&gt;
&lt;br /&gt;
Edit /etc/default/gpsd, set GPSD_OPTIONS:&lt;br /&gt;
  GPSD_OPTIONS=&amp;quot;-Gn ntrip://user:pass@ntrip.kadaster.nl:2101/CBW100NLD0&amp;quot;&lt;br /&gt;
Option -G exposes the control socket on all network interfaces, option -n keeps the GPS active if there is no one currently connected.&lt;br /&gt;
&lt;br /&gt;
Plotting live location on a map:&lt;br /&gt;
* Configure gpsd to expose its socket to the outside world: last section of https://gpsd.gitlab.io/gpsd/troubleshooting.html&lt;br /&gt;
* In QGIS, press ctrl+0 to show the GPS information tab, enter the name of the remote gpsd (port 2947)&lt;br /&gt;
&lt;br /&gt;
Station at Stolwijk (close to Gouda): https://gnss1.tudelft.nl/dpga/station/Stolwijk.html#STWK ?&lt;br /&gt;
&lt;br /&gt;
Starting from the command line:&lt;br /&gt;
* stop gpsd.socket&lt;br /&gt;
  sudo systemctl stop gpsd.socket&lt;br /&gt;
* run from command line&lt;br /&gt;
  sudo /usr/sbin/gpsd -Gn -D 1 -N /dev/ttyUSB0 .... (not sure yet)&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
How to show that RTK GPS is actually accurate?&lt;br /&gt;
&lt;br /&gt;
* Relative positioning: with an &amp;quot;fix RTK&amp;quot; solution, place the antenna at 4 points 25cm apart, each point for 20 seconds or so -&amp;gt; you see 4 distinct clusters of points&lt;br /&gt;
* Positioning over short time: put it in a fixed location, make sure that it has &amp;quot;fix RTK&amp;quot; solution, take 100 measurements or so -&amp;gt; determine the radius of the circle that contains 90% of the points&lt;br /&gt;
* Positioning over longer time: do this for (say) an hour&lt;br /&gt;
* Absolute positioning: look up a national reference point, for example &amp;quot;RD-punt 389346&amp;quot;, located on the Sluisdijk between Gouda and Moordrecht. Technical data: https://www.nsgi.nl/iv-api/rdinfo/rdpoint/389346&lt;br /&gt;
** see https://www.nsgi.nl/referentiepunten-en-gnss-data/informatie-referentiepunten/rdinfo and enter 389346&lt;br /&gt;
** latitude: 51° 59&#039; 49,64048&amp;quot; , longitude: 4° 41&#039; 19,90765&amp;quot;, or 51.99712236/4.68886324&lt;br /&gt;
&lt;br /&gt;
==== Comparison with reference coordinate ====&lt;br /&gt;
On october 4th 2024, we took the RTK GPS to a kernnet reference point at 51.99712236/4.68886324, results below:&lt;br /&gt;
&lt;br /&gt;
From https://www.nsgi.nl/iv-api/rdinfo/rdpoint/389346:&lt;br /&gt;
* Year 2021: &amp;quot;51 59 49,64004&amp;quot;, &amp;quot;4 41 19,90584&amp;quot;, 48.039. In decimal degrees that is &lt;br /&gt;
&lt;br /&gt;
Differences between the reference point and the measurements are calculated to easting (&#039;X&#039;) and northing (&#039;Y&#039;), unit meter. To calculate distance in meters, we use a linear approximation:&lt;br /&gt;
* For dy: 40075km/360 = 111,319 m/deg&lt;br /&gt;
* For dx: dy * cos(latitude) = 68,549 m/deg&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Measurements + deviations&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Latitude !! Longitude !! dx (m) !! dy (m) !! absolute (m) !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| Reference 2012 || 51.99712236 || 4.68886324 || - || - || 0 || by definition&lt;br /&gt;
|-&lt;br /&gt;
| Reference 2021 || 51.99712223 || 4.68886273 || - || - || 0 || by definition&lt;br /&gt;
|-&lt;br /&gt;
| Screenshot 1 || 51.99712217 || 4.68886567 || 0.167 || -0.021 || 0.168 || - &lt;br /&gt;
|-&lt;br /&gt;
| Screenshot 2 || 51.99712200 || 4.68886533 || 0.143 || -0.040 || 0.149 || -&lt;br /&gt;
|-&lt;br /&gt;
| Meting 1 || 51.9971220 || 4.6888663 || 0.210 || -0.040 || 0.214 || -&lt;br /&gt;
|-&lt;br /&gt;
| Meting 2 || 51.9971222 || 4.6888660 || 0.189 || -0.018 || 0.190 || -&lt;br /&gt;
|-&lt;br /&gt;
| Average || - || - || 0.177 || -0.030 || 0.180 || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
According to [https://www.unavco.org/software/geodetic-utilities/plate-motion-calculator/plate-motion-calculator.html this page], the rate of movement is about&lt;br /&gt;
15.75mm/year to the north and 17.45 mm/year to the east (ITRF2020 model).&lt;br /&gt;
Over 12 years, that amounts to 0.189m north and 0.209m east.&lt;br /&gt;
&lt;br /&gt;
== Air quality sensors ==&lt;br /&gt;
&lt;br /&gt;
=== Nitrogen compounds in air ===&lt;br /&gt;
According to https://www.rivm.nl/stikstof/monitoren-advies-onderzoek/overzicht-stikstofmetingen/metingen-stikstof-in-de-lucht average (typical?) values of&lt;br /&gt;
* Ammonia (NH3): 6.7 ug/m3 (9.6 ppb)&lt;br /&gt;
* NOx: 27.3 ug/m3&lt;br /&gt;
* NO2: 18.6 ug/m3 (9.9 ppb)&lt;br /&gt;
&lt;br /&gt;
(ppb-conversion using https://www.breeze-technologies.de/blog/air-pollution-how-to-convert-between-mgm3-%C2%B5gm3-ppm-ppb/ )&lt;br /&gt;
&lt;br /&gt;
RIVM report on inexpensive nitrogen-in-air sensors: https://www.samenmeten.nl/sensoren-voor-no2&lt;br /&gt;
Conclusion: most sensors are not sensitive enough to be used in typical outdoor conditions, with perhaps one exception: alphasense NO2-B43F&lt;br /&gt;
&lt;br /&gt;
== Sonar sensors ==&lt;br /&gt;
Investigate this because it allows us to measure depth.&lt;br /&gt;
&lt;br /&gt;
AliExpress has several types of affordable sonar sensors, focused at detecting fish, but also able to measure depth.&lt;br /&gt;
&lt;br /&gt;
I ordered this one: https://nl.aliexpress.com/item/1005006388343879.html&lt;br /&gt;
* 125 kHz main frequency, range up to 200 ft deep (about 60m)&lt;br /&gt;
* bluetooth low-power interface (basically serial-over-BLE)&lt;br /&gt;
* built-in battery, powers on automatically when submerged&lt;br /&gt;
* reports 120-element array with raw sonar return intensity-vs-depth&lt;br /&gt;
* measures water temperature&lt;br /&gt;
* about 45 euro&lt;br /&gt;
&lt;br /&gt;
Fish helper pro application for android https://apkpure.com/fish-helper-pro/com.fishfinderpro.xdx&lt;br /&gt;
&lt;br /&gt;
=== Debug tool ===&lt;br /&gt;
I wrote a python script to connect to it from a linux computer: https://github.com/bertrik/wireless-sonar-sensor&lt;br /&gt;
&lt;br /&gt;
It&#039;s connects to a &amp;quot;Fish Helper Pro&amp;quot; wireless sonar sensor over bluetooth low-energy, reports depth and temperature&lt;br /&gt;
&lt;br /&gt;
=== ROS2 integration ===&lt;br /&gt;
The most appropriate message for a simple range would be: https://docs.ros2.org/foxy/api/sensor_msgs/msg/Range.html&lt;br /&gt;
&lt;br /&gt;
There are other messages to perhaps report the raw echo return array.&lt;br /&gt;
&lt;br /&gt;
== Water physical analysis ==&lt;br /&gt;
=== Turbidity / clarity ===&lt;br /&gt;
See https://en.wikipedia.org/wiki/Turbidity&lt;br /&gt;
&lt;br /&gt;
Aliexpress sensor &#039;&#039;&#039;TS-300B&#039;&#039;&#039;: https://nl.aliexpress.com/item/1005006732956937.html&lt;br /&gt;
Has a range 0 ~ 1000 ± 30 NTU&lt;br /&gt;
&lt;br /&gt;
Order of magnitude for turbidity:&lt;br /&gt;
* Drinking water upper limit: &#039;&#039;&#039;4 NTU&#039;&#039;&#039; (European turbidity standard for drinking water)&lt;br /&gt;
* Ambient water: 10-150 NTU. The US state of Washington use a &amp;quot;background&amp;quot; value of &#039;&#039;&#039;50 NTU&#039;&#039;&#039; as reference.&lt;br /&gt;
&lt;br /&gt;
(see https://en.wikipedia.org/wiki/Turbidity#Standards_and_test_methods )&lt;br /&gt;
&lt;br /&gt;
So the Aliexpress sensor is suited only for &amp;quot;dirty&amp;quot; water.&lt;br /&gt;
&lt;br /&gt;
=== Water measurement probes ===&lt;br /&gt;
I bought this one: Tuya compatible BT785 EC meter: https://nl.aliexpress.com/i/1005007462079781.html inexpensive, focused on EC, runs on 4x LR44.&lt;br /&gt;
Speaks the TuYa protocol (requires a secret key that you can fetch through the developer console).&lt;br /&gt;
This is quite cumbersome: you have to register as a developer, fetch the key before time runs out and developer access is limited.&lt;br /&gt;
&lt;br /&gt;
Does NOT speak the universal serialport access protocol as described here:&lt;br /&gt;
https://developer.tuya.com/en/docs/iot/tuya-cloud-universal-serial-port-access-protocol?id=K9hhi0xxtn9cb&lt;br /&gt;
&lt;br /&gt;
* https://nl.aliexpress.com/item/1005003784454381.html BLE-9908 Inexpensie &amp;quot;Yieryi&amp;quot; PH/EC/Temp probe with bluetooth and app, about E25,- (Uses 3x LR44 coin cell batteries)&lt;br /&gt;
* Several different models: https://nl.aliexpress.com/item/1005007810989801.html&lt;br /&gt;
** EZ9901: TDS/pH/temp&lt;br /&gt;
** EZ9902: EC/pH/temp&lt;br /&gt;
** EZ9908: EC/TDS/pH/temp&lt;br /&gt;
** EZ9909: TDS/EC/pH/salt/temp&lt;br /&gt;
* The bluetooth versions are probably as above, with numbers like BLE9902 and BLE9908&lt;br /&gt;
* Yiery BLE9902: https://shop.yieryimeters.com/products/yieryi-ble-9902-3-in-1-digital-ph-meter-with-bluetooth-ec-and-temperature-measurement-ideal-for-water-quality-testing-in-pools-fish-tanks-hydroponics-more&lt;br /&gt;
* BLE-EC01 is a bluetooth EC meter, can find it here https://www.amazon.com/BLE-EC01-Smart4-TDS-Temp-Meter/dp/B0DPZZC7BV, not on AliExpress?&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Some probes indicate EC (electrical conductivity), other indicate TDS (total dissolved liquids). TDS is derived from EC (knowing the liquid type). EC is the more universal/fundamental property!&lt;br /&gt;
* EC is typically expressed in uS/cm or mS/cm (micro or milli siemens per centimeter), say 500 uS/cm for outdoor water.&lt;br /&gt;
* EC is temperature dependent, typically you need the value extrapolated to 25 degrees Celcius. Temperature-EC correlation rule of thumb: about 2% more conductive per K.&lt;br /&gt;
* pH sensors are almost by definition fragile and last only a limited time, so probably don&#039;t bother trying to use one at all. The pH of outdoor water might not be that interesting to measure.&lt;br /&gt;
* I expect the non-TuYa meters to use an easier to handle bluetooth protocol, avoiding the need for complicated encryption with a key that can only be fetched for a limited time using a tuya developer account.&lt;br /&gt;
&lt;br /&gt;
== Boat control ==&lt;br /&gt;
Typically the wireless link looks like this:&lt;br /&gt;
* 2.4 GHz working frequency&lt;br /&gt;
* 500m range&lt;br /&gt;
&lt;br /&gt;
Interesting links:&lt;br /&gt;
* Flytec-2011 remote control https://nl.aliexpress.com/item/1005002984723718.html&lt;br /&gt;
* Replacement board for various boats with &amp;quot;18&amp;quot; in their type number: https://nl.aliexpress.com/item/1005006115484716.html&lt;br /&gt;
* DIY Multi-protocol module: https://github.com/pascallanger/DIY-Multiprotocol-TX-Module&lt;br /&gt;
&lt;br /&gt;
=== remote control ===&lt;br /&gt;
Image of remote control RF chip:&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
Parts:&lt;br /&gt;
* 12.000 MHz crystal/oscillator&lt;br /&gt;
* 16-pin control chip: 20_CL6L071&lt;br /&gt;
* 6-pin RF chip: 1110 / VKA3, could be an rx/tx switch, amplifier or filter circuit&lt;br /&gt;
&lt;br /&gt;
See also: https://www.open-tx.org/&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* map out the connections between the mainboard and the rf board, expected: VCC, GND, spi ?&lt;br /&gt;
&lt;br /&gt;
== Use cases ==&lt;br /&gt;
material:&lt;br /&gt;
* https://www.youtube.com/watch?v=cMk0bGvIU1E&lt;br /&gt;
* https://iplo.nl/thema/water/oppervlaktewater/kaderrichtlijn-water&lt;br /&gt;
* kaartje: https://krw-nutrend.netlify.app/ -&amp;gt; 2 meetpunten op de reeuwijkse plassen, tijdresolutie is 1 jaar?&lt;br /&gt;
&lt;br /&gt;
Useful distinction, typically used in documents/guidelines:&lt;br /&gt;
* chemical quality, what substances are present in the water?&lt;br /&gt;
* biological / ecology quality, what kind of living organisms live in the water?&lt;br /&gt;
&lt;br /&gt;
=== Reeuwijkse plassen ===&lt;br /&gt;
See&lt;br /&gt;
* https://www.rijnland.net/wat-doet-rijnland/in-uw-buurt/reeuwijkse-plassen/ their stated goal: CLEAR WATER&lt;br /&gt;
* https://www.rijnland.net/regels-op-een-rij/subsidies-en-andere-financi%C3%ABle-bijdragen/&lt;br /&gt;
&lt;br /&gt;
potential applications:&lt;br /&gt;
* inspect water sides (oever) over time&lt;br /&gt;
* underwater camera: detect invasive cray fish&lt;br /&gt;
* sample water properties at high spatial resolution, high time resolution&lt;br /&gt;
* early detection of indicators for cyanobacteria: temperature and nutrients&lt;br /&gt;
&lt;br /&gt;
=== Detect/find pollution source ===&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== udev handling of serial ports ===&lt;br /&gt;
Many peripheral devices are connected through serial.&lt;br /&gt;
The plan is to have an udev config file with renaming rules, so each peripheral gets a stable name in /dev .&lt;br /&gt;
The plan is also to create the udev config using some python: insert device X now -&amp;gt; write line to udev config.&lt;br /&gt;
&lt;br /&gt;
The udev config file is:&lt;br /&gt;
  /etc/udev/rules.d/99-usb-serial.rules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# LIDAR serial converter&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;10c4&amp;quot;, ATTRS{idProduct}==&amp;quot;ea60&amp;quot;, SYMLINK+=&amp;quot;ttyLIDAR&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
# quectel GPS&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;1a86&amp;quot;, ATTRS{idProduct}==&amp;quot;7523&amp;quot;, SYMLINK+=&amp;quot;ttyGPS&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
# ublox GPS&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;0403&amp;quot;, ATTRS{idProduct}==&amp;quot;6001&amp;quot;, SYMLINK+=&amp;quot;ttyGPS&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An USB-nano also appears to have a USB vendor/product id of 1a86/7523 (&amp;quot;USB2.0-Serial&amp;quot;) ... same as the quectel GPS?&lt;br /&gt;
&lt;br /&gt;
Same for &amp;quot;AI thinker&amp;quot; USB-serial: vendor/product id of 1a86/7523 (product: &amp;quot;USB2.0-Serial&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
To (re)load the properties:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo udevadm control --reload-rules&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== reading temperature sensor ===&lt;br /&gt;
The idea is to to use a DB18B20 temperature sensor, read it using an arduino nano board acting as a 1-wire adapter.&lt;br /&gt;
Use openwire-fs as user-side openwire software http://owfs.org&lt;br /&gt;
&lt;br /&gt;
Preparation:&lt;br /&gt;
* Add the regular user to the &#039;dialout&#039; group, so it can access serial ports&lt;br /&gt;
  sudo adduser &amp;lt;name&amp;gt; dialout&lt;br /&gt;
&lt;br /&gt;
Setting up the hardware:&lt;br /&gt;
* connect the DS18B20 to the connector board with the pull-ups&lt;br /&gt;
* wire the connector board to the arduino nano, see ...&lt;br /&gt;
* plug the arduino nano in the pi&lt;br /&gt;
&lt;br /&gt;
Setting up the software:&lt;br /&gt;
* Install openwire fs&lt;br /&gt;
  sudo apt install owfs&lt;br /&gt;
* Create the openwire fs mountpoint&lt;br /&gt;
  sudo mkdir /mnt/1wire&lt;br /&gt;
* Configure owfs, edit /etc/owfs.conf&lt;br /&gt;
  server: device = /dev/ttyUSB0&lt;br /&gt;
  mountpoint = /mnt/1wire&lt;br /&gt;
  allow_other&lt;br /&gt;
  (comment out the line with the FAKE devices)&lt;br /&gt;
* Configure systemd services&lt;br /&gt;
  sudo systemctl enable owserver owhttpd&lt;br /&gt;
  sudo systemctl disable owftpd&lt;br /&gt;
* Start the systemd service&lt;br /&gt;
  sudo systemctl start owserver owhttpd&lt;br /&gt;
* Check the logs&lt;br /&gt;
  sudo journalctl -xeu owserver -f&lt;br /&gt;
* Open a browser to view the web interface&lt;br /&gt;
  http://localhost:2121 or&lt;br /&gt;
  http://raspberrypi.local:2121&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Karaburan&amp;diff=35045</id>
		<title>Karaburan</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Karaburan&amp;diff=35045"/>
		<updated>2026-02-07T21:00:39Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Water measurement probes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
 |Name=Karaburan&lt;br /&gt;
 |Picture=karaburan.png&lt;br /&gt;
 |Omschrijving=Monitoring water quality&lt;br /&gt;
 |Status=In progress&lt;br /&gt;
 |Contact=bertrik&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Next steps ==&lt;br /&gt;
* &amp;lt;s&amp;gt;engage with PX4 community on getting a feel if this is useful to use and if so, how to get started&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;figure out how to duplicate an MQTT stream&amp;lt;/s&amp;gt; don&#039;t bother&lt;br /&gt;
* write python scripts&lt;br /&gt;
** &amp;lt;s&amp;gt;arduino turbidity&amp;lt;/s&amp;gt; don&#039;t bother&lt;br /&gt;
** &amp;lt;s&amp;gt;turbidity-to-mqtt&amp;lt;/s&amp;gt; maybe make this ROS module&lt;br /&gt;
** &amp;lt;s&amp;gt;HID-to-mqtt&amp;lt;/s&amp;gt; maybe make this ROS module&lt;br /&gt;
** position/velocity listener script: latitude, longitude, altitude, heading/bearing/track/whatever, velocity&lt;br /&gt;
* hook things into systemd / udev&lt;br /&gt;
* analoog in op de pi:&lt;br /&gt;
** https://elektronicavoorjou.nl/product/adc-pi/&lt;br /&gt;
** https://www.123materialen.com/products/zeer-nauwkeurige-ads1256-dac8552-ad-da-board-voor-raspberry-pi_1676153&lt;br /&gt;
** FreeJoy project&lt;br /&gt;
* UPS voor pi: https://elektronicavoorjou.nl/product/raspberry-pi-ups-hat/&lt;br /&gt;
* 1-wire stuff:&lt;br /&gt;
** 1-wire adapter emulation on an stm32: https://github.com/alitekin2fx/stm32_ds2480_emu&lt;br /&gt;
** owfs.org for easy interfacing with multiple 1-wire devices in a hierarchical way on linux&lt;br /&gt;
* Figure out the udev/hotplug mess, we probably need this because many of our peripherals use a serial port:&lt;br /&gt;
** in how many places can we store the udev renaming logic (config files)&lt;br /&gt;
** can we automate this, make it user friendlier, e.g. some kind of &amp;quot;insert device X now&amp;quot; script&lt;br /&gt;
&lt;br /&gt;
Check:&lt;br /&gt;
* https://www.rtvnoord.nl/natuur/1215705/vuilrobot-maakt-jachthaven-winschoten-schoon-beter-dan-met-een-schepnet&lt;br /&gt;
&lt;br /&gt;
=== USB HID as analog input ===&lt;br /&gt;
An stm32 based bluepill board can be flashed with firmware to allow its analog inputs to be exposed as USB HID sliders.&lt;br /&gt;
&lt;br /&gt;
Flashing the bluepill with openocd to the freejoy firmware:&lt;br /&gt;
* install openocd&lt;br /&gt;
  sudo apt install openocd&lt;br /&gt;
* connect an stlinkv2 to an stm32 bluepill, connect the stlinkv2 to USB&lt;br /&gt;
* flash the freejoy firmware as follows:&lt;br /&gt;
** download the firmware from https://github.com/FreeJoy-Team/FreeJoy&lt;br /&gt;
** create a symlink to the hex file called firmware.hex&lt;br /&gt;
** flash the firmware from the command line&lt;br /&gt;
  openocd -s /usr/share/openocd/scripts -f interface/stlink.cfg -f target/stm32f1x.cfg -c init -c &amp;quot;program firmware.hex verify reset exit&amp;quot;&lt;br /&gt;
* watch the kernel logs&lt;br /&gt;
  sudo dmesg -w&lt;br /&gt;
* connect the stm32 using a USB cable&lt;br /&gt;
* download the freejoy configurator from https://github.com/FreeJoy-Team/FreeJoyConfiguratorQt&lt;br /&gt;
* start the configurator and load the karaburan.cfg setting&lt;br /&gt;
* Write config to device -&amp;gt; it should reboot now and come up with the new settings&lt;br /&gt;
&lt;br /&gt;
Verify that it works:&lt;br /&gt;
* install the evtest package&lt;br /&gt;
* run&lt;br /&gt;
  evtest /dev/input/by-id/usb-FreeJoy_FreeJoy_v1.7.1-event-if00&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/vostrenkov/EazyJoy&lt;br /&gt;
&lt;br /&gt;
=== influxdb ===&lt;br /&gt;
See https://hub.docker.com/_/influxdb&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/karaburan/tree/master/influxdb&lt;br /&gt;
&lt;br /&gt;
=== ROS ===&lt;br /&gt;
Investigation:&lt;br /&gt;
* Use ROS 2, not the old ROS 1&lt;br /&gt;
* Cannot work comfortably with debian, works best with ubuntu&lt;br /&gt;
* Using gpsd:&lt;br /&gt;
** install ros-jazzy-desktop&lt;br /&gt;
** ros2 launch gpsd_client gpsd_client-launch.py&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Topics:&lt;br /&gt;
* air quality sensors&lt;br /&gt;
** ammonia&lt;br /&gt;
** NOx&lt;br /&gt;
* water chemical analysis&lt;br /&gt;
** nitrates&lt;br /&gt;
** ammonia&lt;br /&gt;
** dissolved oxygen&lt;br /&gt;
** sulfide/sulfate&lt;br /&gt;
** phosphates?&lt;br /&gt;
** salinity (chlorides?)&lt;br /&gt;
* water physical analysis&lt;br /&gt;
** temperature&lt;br /&gt;
** clarity/turbidity -&amp;gt; investigate standard ways of measuring/expressing this&lt;br /&gt;
** conductivity/total dissolved solids&lt;br /&gt;
** water properties by light reflection, hyperspectral/polarity&lt;br /&gt;
** depth?&lt;br /&gt;
* boat control&lt;br /&gt;
** trajectory -&amp;gt; steering&lt;br /&gt;
** idea: interface with the remote control, not with the boat&lt;br /&gt;
** idea: find a boat with easily hackable remote control protocol&lt;br /&gt;
** idea: can we get sensor data over this link too, e.g. GPS?&lt;br /&gt;
* camera control&lt;br /&gt;
* post-processing&lt;br /&gt;
** data presentation&lt;br /&gt;
*** video/photo stitching&lt;br /&gt;
*** time lapse view&lt;br /&gt;
*** map view of properties&lt;br /&gt;
* use cases&lt;br /&gt;
** verify with domain experts, how to engage?&lt;br /&gt;
** slootview, under/above water&lt;br /&gt;
** minimum viable prototype&lt;br /&gt;
** high-res measurement by location, by time&lt;br /&gt;
* materials&lt;br /&gt;
** boat selection&lt;br /&gt;
** processing platform selection&lt;br /&gt;
** communication platform selection&lt;br /&gt;
&lt;br /&gt;
== Investigate RTK GPS ==&lt;br /&gt;
Goal: figure out if it is practically possible to achieve cm resolution with a 200-euro GPS and a free correction service: YES&lt;br /&gt;
&lt;br /&gt;
* https://www.nsgi.nl/referentiepunten-en-gnss-data/gnss-data/real-time-streams public correction data service&lt;br /&gt;
* https://www.ardusimple.nl/rtk-in-5-minutes/&lt;br /&gt;
* RTK in action https://www.youtube.com/watch?v=Oc1LBFDj2MA&lt;br /&gt;
* Use with Linux / gpsd: https://stackoverflow.com/questions/77314115/drotek-gpsd-and-ntrip-correction-data-for-precise-positioning ?&lt;br /&gt;
* Chipsets&lt;br /&gt;
** Quectel LC29H (default: 115200 bps)&lt;br /&gt;
*** review: see https://rtklibexplorer.wordpress.com/2024/04/28/dual-frequency-rtk-for-less-than-60-with-the-quectel-lc29hea/&lt;br /&gt;
*** configuration: https://rtklibexplorer.wordpress.com/2024/05/06/configuring-the-quectel-lc29hea-receiver-for-real-time-rtk-solutions/&lt;br /&gt;
** uBLOX ZED-F9P&lt;br /&gt;
* Boards&lt;br /&gt;
** UM980 / UM982&lt;br /&gt;
&lt;br /&gt;
Edit /etc/default/gpsd, set GPSD_OPTIONS:&lt;br /&gt;
  GPSD_OPTIONS=&amp;quot;-Gn ntrip://user:pass@ntrip.kadaster.nl:2101/CBW100NLD0&amp;quot;&lt;br /&gt;
Option -G exposes the control socket on all network interfaces, option -n keeps the GPS active if there is no one currently connected.&lt;br /&gt;
&lt;br /&gt;
Plotting live location on a map:&lt;br /&gt;
* Configure gpsd to expose its socket to the outside world: last section of https://gpsd.gitlab.io/gpsd/troubleshooting.html&lt;br /&gt;
* In QGIS, press ctrl+0 to show the GPS information tab, enter the name of the remote gpsd (port 2947)&lt;br /&gt;
&lt;br /&gt;
Station at Stolwijk (close to Gouda): https://gnss1.tudelft.nl/dpga/station/Stolwijk.html#STWK ?&lt;br /&gt;
&lt;br /&gt;
Starting from the command line:&lt;br /&gt;
* stop gpsd.socket&lt;br /&gt;
  sudo systemctl stop gpsd.socket&lt;br /&gt;
* run from command line&lt;br /&gt;
  sudo /usr/sbin/gpsd -Gn -D 1 -N /dev/ttyUSB0 .... (not sure yet)&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
How to show that RTK GPS is actually accurate?&lt;br /&gt;
&lt;br /&gt;
* Relative positioning: with an &amp;quot;fix RTK&amp;quot; solution, place the antenna at 4 points 25cm apart, each point for 20 seconds or so -&amp;gt; you see 4 distinct clusters of points&lt;br /&gt;
* Positioning over short time: put it in a fixed location, make sure that it has &amp;quot;fix RTK&amp;quot; solution, take 100 measurements or so -&amp;gt; determine the radius of the circle that contains 90% of the points&lt;br /&gt;
* Positioning over longer time: do this for (say) an hour&lt;br /&gt;
* Absolute positioning: look up a national reference point, for example &amp;quot;RD-punt 389346&amp;quot;, located on the Sluisdijk between Gouda and Moordrecht. Technical data: https://www.nsgi.nl/iv-api/rdinfo/rdpoint/389346&lt;br /&gt;
** see https://www.nsgi.nl/referentiepunten-en-gnss-data/informatie-referentiepunten/rdinfo and enter 389346&lt;br /&gt;
** latitude: 51° 59&#039; 49,64048&amp;quot; , longitude: 4° 41&#039; 19,90765&amp;quot;, or 51.99712236/4.68886324&lt;br /&gt;
&lt;br /&gt;
==== Comparison with reference coordinate ====&lt;br /&gt;
On october 4th 2024, we took the RTK GPS to a kernnet reference point at 51.99712236/4.68886324, results below:&lt;br /&gt;
&lt;br /&gt;
From https://www.nsgi.nl/iv-api/rdinfo/rdpoint/389346:&lt;br /&gt;
* Year 2021: &amp;quot;51 59 49,64004&amp;quot;, &amp;quot;4 41 19,90584&amp;quot;, 48.039. In decimal degrees that is &lt;br /&gt;
&lt;br /&gt;
Differences between the reference point and the measurements are calculated to easting (&#039;X&#039;) and northing (&#039;Y&#039;), unit meter. To calculate distance in meters, we use a linear approximation:&lt;br /&gt;
* For dy: 40075km/360 = 111,319 m/deg&lt;br /&gt;
* For dx: dy * cos(latitude) = 68,549 m/deg&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Measurements + deviations&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Latitude !! Longitude !! dx (m) !! dy (m) !! absolute (m) !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| Reference 2012 || 51.99712236 || 4.68886324 || - || - || 0 || by definition&lt;br /&gt;
|-&lt;br /&gt;
| Reference 2021 || 51.99712223 || 4.68886273 || - || - || 0 || by definition&lt;br /&gt;
|-&lt;br /&gt;
| Screenshot 1 || 51.99712217 || 4.68886567 || 0.167 || -0.021 || 0.168 || - &lt;br /&gt;
|-&lt;br /&gt;
| Screenshot 2 || 51.99712200 || 4.68886533 || 0.143 || -0.040 || 0.149 || -&lt;br /&gt;
|-&lt;br /&gt;
| Meting 1 || 51.9971220 || 4.6888663 || 0.210 || -0.040 || 0.214 || -&lt;br /&gt;
|-&lt;br /&gt;
| Meting 2 || 51.9971222 || 4.6888660 || 0.189 || -0.018 || 0.190 || -&lt;br /&gt;
|-&lt;br /&gt;
| Average || - || - || 0.177 || -0.030 || 0.180 || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
According to [https://www.unavco.org/software/geodetic-utilities/plate-motion-calculator/plate-motion-calculator.html this page], the rate of movement is about&lt;br /&gt;
15.75mm/year to the north and 17.45 mm/year to the east (ITRF2020 model).&lt;br /&gt;
Over 12 years, that amounts to 0.189m north and 0.209m east.&lt;br /&gt;
&lt;br /&gt;
== Air quality sensors ==&lt;br /&gt;
&lt;br /&gt;
=== Nitrogen compounds in air ===&lt;br /&gt;
According to https://www.rivm.nl/stikstof/monitoren-advies-onderzoek/overzicht-stikstofmetingen/metingen-stikstof-in-de-lucht average (typical?) values of&lt;br /&gt;
* Ammonia (NH3): 6.7 ug/m3 (9.6 ppb)&lt;br /&gt;
* NOx: 27.3 ug/m3&lt;br /&gt;
* NO2: 18.6 ug/m3 (9.9 ppb)&lt;br /&gt;
&lt;br /&gt;
(ppb-conversion using https://www.breeze-technologies.de/blog/air-pollution-how-to-convert-between-mgm3-%C2%B5gm3-ppm-ppb/ )&lt;br /&gt;
&lt;br /&gt;
RIVM report on inexpensive nitrogen-in-air sensors: https://www.samenmeten.nl/sensoren-voor-no2&lt;br /&gt;
Conclusion: most sensors are not sensitive enough to be used in typical outdoor conditions, with perhaps one exception: alphasense NO2-B43F&lt;br /&gt;
&lt;br /&gt;
== Sonar sensors ==&lt;br /&gt;
Investigate this because it allows us to measure depth.&lt;br /&gt;
&lt;br /&gt;
AliExpress has several types of affordable sonar sensors, focused at detecting fish, but also able to measure depth.&lt;br /&gt;
&lt;br /&gt;
I ordered this one: https://nl.aliexpress.com/item/1005006388343879.html&lt;br /&gt;
* 125 kHz main frequency, range up to 200 ft deep (about 60m)&lt;br /&gt;
* bluetooth low-power interface (basically serial-over-BLE)&lt;br /&gt;
* built-in battery, powers on automatically when submerged&lt;br /&gt;
* reports 120-element array with raw sonar return intensity-vs-depth&lt;br /&gt;
* measures water temperature&lt;br /&gt;
* about 45 euro&lt;br /&gt;
&lt;br /&gt;
Fish helper pro application for android https://apkpure.com/fish-helper-pro/com.fishfinderpro.xdx&lt;br /&gt;
&lt;br /&gt;
=== Debug tool ===&lt;br /&gt;
I wrote a python script to connect to it from a linux computer: https://github.com/bertrik/wireless-sonar-sensor&lt;br /&gt;
&lt;br /&gt;
It&#039;s connects to a &amp;quot;Fish Helper Pro&amp;quot; wireless sonar sensor over bluetooth low-energy, reports depth and temperature&lt;br /&gt;
&lt;br /&gt;
=== ROS2 integration ===&lt;br /&gt;
The most appropriate message for a simple range would be: https://docs.ros2.org/foxy/api/sensor_msgs/msg/Range.html&lt;br /&gt;
&lt;br /&gt;
There are other messages to perhaps report the raw echo return array.&lt;br /&gt;
&lt;br /&gt;
== Water physical analysis ==&lt;br /&gt;
=== Turbidity / clarity ===&lt;br /&gt;
See https://en.wikipedia.org/wiki/Turbidity&lt;br /&gt;
&lt;br /&gt;
Aliexpress sensor &#039;&#039;&#039;TS-300B&#039;&#039;&#039;: https://nl.aliexpress.com/item/1005006732956937.html&lt;br /&gt;
Has a range 0 ~ 1000 ± 30 NTU&lt;br /&gt;
&lt;br /&gt;
Order of magnitude for turbidity:&lt;br /&gt;
* Drinking water upper limit: &#039;&#039;&#039;4 NTU&#039;&#039;&#039; (European turbidity standard for drinking water)&lt;br /&gt;
* Ambient water: 10-150 NTU. The US state of Washington use a &amp;quot;background&amp;quot; value of &#039;&#039;&#039;50 NTU&#039;&#039;&#039; as reference.&lt;br /&gt;
&lt;br /&gt;
(see https://en.wikipedia.org/wiki/Turbidity#Standards_and_test_methods )&lt;br /&gt;
&lt;br /&gt;
So the Aliexpress sensor is suited only for &amp;quot;dirty&amp;quot; water.&lt;br /&gt;
&lt;br /&gt;
=== Water measurement probes ===&lt;br /&gt;
I bought this one: Tuya compatible BT785 EC meter: https://nl.aliexpress.com/i/1005007462079781.html inexpensive, focused on EC, runs on 4x LR44.&lt;br /&gt;
Speaks the TuYa protocol (requires a secret key that you can fetch through the developer console).&lt;br /&gt;
This is quite cumbersome: you have to register as a developer, fetch the key before time runs out and developer access is limited.&lt;br /&gt;
&lt;br /&gt;
Does NOT speak the universal serialport access protocol as described here:&lt;br /&gt;
https://developer.tuya.com/en/docs/iot/tuya-cloud-universal-serial-port-access-protocol?id=K9hhi0xxtn9cb&lt;br /&gt;
&lt;br /&gt;
* https://nl.aliexpress.com/item/1005003784454381.html BLE-9908 Inexpensie &amp;quot;Yieryi&amp;quot; PH/EC/Temp probe with bluetooth and app, about E25,- (Uses 3x LR44 coin cell batteries)&lt;br /&gt;
* Several different models: https://nl.aliexpress.com/item/1005007810989801.html&lt;br /&gt;
** EZ9901: TDS/pH/temp&lt;br /&gt;
** EZ9902: EC/pH/temp&lt;br /&gt;
** EZ9908: EC/TDS/pH/temp&lt;br /&gt;
** EZ9909: TDS/EC/pH/salt/temp&lt;br /&gt;
* The bluetooth versions are probably as above, with numbers like BLE9902 and BLE9908&lt;br /&gt;
* Yiery BLE9902: https://shop.yieryimeters.com/products/yieryi-ble-9902-3-in-1-digital-ph-meter-with-bluetooth-ec-and-temperature-measurement-ideal-for-water-quality-testing-in-pools-fish-tanks-hydroponics-more&lt;br /&gt;
* BLE-EC01 is a bluetooth EC meter, can find it here https://www.amazon.com/BLE-EC01-Smart4-TDS-Temp-Meter/dp/B0DPZZC7BV, not on AliExpress?&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Some probes indicate EC (electrical conductivity), other indicate TDS (total dissolved liquids). TDS is derived from EC (knowing the liquid type). EC is the more universal/fundamental property!&lt;br /&gt;
* EC is typically expressed in uS/cm or mS/cm (micro or milli siemens per centimeter), say 500 uS/cm for outdoor water.&lt;br /&gt;
* EC is temperature dependent, typically you need the value extrapolated to 25 degrees Celcius. Temperature-EC correlation rule of thumb: about 2% more conductive per K.&lt;br /&gt;
* pH sensors are almost by definition fragile and last only a limited time, so probably don&#039;t bother trying to use one at all. The pH of outdoor water might not be that interesting to measure.&lt;br /&gt;
&lt;br /&gt;
== Boat control ==&lt;br /&gt;
Typically the wireless link looks like this:&lt;br /&gt;
* 2.4 GHz working frequency&lt;br /&gt;
* 500m range&lt;br /&gt;
&lt;br /&gt;
Interesting links:&lt;br /&gt;
* Flytec-2011 remote control https://nl.aliexpress.com/item/1005002984723718.html&lt;br /&gt;
* Replacement board for various boats with &amp;quot;18&amp;quot; in their type number: https://nl.aliexpress.com/item/1005006115484716.html&lt;br /&gt;
* DIY Multi-protocol module: https://github.com/pascallanger/DIY-Multiprotocol-TX-Module&lt;br /&gt;
&lt;br /&gt;
=== remote control ===&lt;br /&gt;
Image of remote control RF chip:&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
Parts:&lt;br /&gt;
* 12.000 MHz crystal/oscillator&lt;br /&gt;
* 16-pin control chip: 20_CL6L071&lt;br /&gt;
* 6-pin RF chip: 1110 / VKA3, could be an rx/tx switch, amplifier or filter circuit&lt;br /&gt;
&lt;br /&gt;
See also: https://www.open-tx.org/&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* map out the connections between the mainboard and the rf board, expected: VCC, GND, spi ?&lt;br /&gt;
&lt;br /&gt;
== Use cases ==&lt;br /&gt;
material:&lt;br /&gt;
* https://www.youtube.com/watch?v=cMk0bGvIU1E&lt;br /&gt;
* https://iplo.nl/thema/water/oppervlaktewater/kaderrichtlijn-water&lt;br /&gt;
* kaartje: https://krw-nutrend.netlify.app/ -&amp;gt; 2 meetpunten op de reeuwijkse plassen, tijdresolutie is 1 jaar?&lt;br /&gt;
&lt;br /&gt;
Useful distinction, typically used in documents/guidelines:&lt;br /&gt;
* chemical quality, what substances are present in the water?&lt;br /&gt;
* biological / ecology quality, what kind of living organisms live in the water?&lt;br /&gt;
&lt;br /&gt;
=== Reeuwijkse plassen ===&lt;br /&gt;
See&lt;br /&gt;
* https://www.rijnland.net/wat-doet-rijnland/in-uw-buurt/reeuwijkse-plassen/ their stated goal: CLEAR WATER&lt;br /&gt;
* https://www.rijnland.net/regels-op-een-rij/subsidies-en-andere-financi%C3%ABle-bijdragen/&lt;br /&gt;
&lt;br /&gt;
potential applications:&lt;br /&gt;
* inspect water sides (oever) over time&lt;br /&gt;
* underwater camera: detect invasive cray fish&lt;br /&gt;
* sample water properties at high spatial resolution, high time resolution&lt;br /&gt;
* early detection of indicators for cyanobacteria: temperature and nutrients&lt;br /&gt;
&lt;br /&gt;
=== Detect/find pollution source ===&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== udev handling of serial ports ===&lt;br /&gt;
Many peripheral devices are connected through serial.&lt;br /&gt;
The plan is to have an udev config file with renaming rules, so each peripheral gets a stable name in /dev .&lt;br /&gt;
The plan is also to create the udev config using some python: insert device X now -&amp;gt; write line to udev config.&lt;br /&gt;
&lt;br /&gt;
The udev config file is:&lt;br /&gt;
  /etc/udev/rules.d/99-usb-serial.rules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# LIDAR serial converter&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;10c4&amp;quot;, ATTRS{idProduct}==&amp;quot;ea60&amp;quot;, SYMLINK+=&amp;quot;ttyLIDAR&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
# quectel GPS&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;1a86&amp;quot;, ATTRS{idProduct}==&amp;quot;7523&amp;quot;, SYMLINK+=&amp;quot;ttyGPS&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
# ublox GPS&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;0403&amp;quot;, ATTRS{idProduct}==&amp;quot;6001&amp;quot;, SYMLINK+=&amp;quot;ttyGPS&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An USB-nano also appears to have a USB vendor/product id of 1a86/7523 (&amp;quot;USB2.0-Serial&amp;quot;) ... same as the quectel GPS?&lt;br /&gt;
&lt;br /&gt;
Same for &amp;quot;AI thinker&amp;quot; USB-serial: vendor/product id of 1a86/7523 (product: &amp;quot;USB2.0-Serial&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
To (re)load the properties:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo udevadm control --reload-rules&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== reading temperature sensor ===&lt;br /&gt;
The idea is to to use a DB18B20 temperature sensor, read it using an arduino nano board acting as a 1-wire adapter.&lt;br /&gt;
Use openwire-fs as user-side openwire software http://owfs.org&lt;br /&gt;
&lt;br /&gt;
Preparation:&lt;br /&gt;
* Add the regular user to the &#039;dialout&#039; group, so it can access serial ports&lt;br /&gt;
  sudo adduser &amp;lt;name&amp;gt; dialout&lt;br /&gt;
&lt;br /&gt;
Setting up the hardware:&lt;br /&gt;
* connect the DS18B20 to the connector board with the pull-ups&lt;br /&gt;
* wire the connector board to the arduino nano, see ...&lt;br /&gt;
* plug the arduino nano in the pi&lt;br /&gt;
&lt;br /&gt;
Setting up the software:&lt;br /&gt;
* Install openwire fs&lt;br /&gt;
  sudo apt install owfs&lt;br /&gt;
* Create the openwire fs mountpoint&lt;br /&gt;
  sudo mkdir /mnt/1wire&lt;br /&gt;
* Configure owfs, edit /etc/owfs.conf&lt;br /&gt;
  server: device = /dev/ttyUSB0&lt;br /&gt;
  mountpoint = /mnt/1wire&lt;br /&gt;
  allow_other&lt;br /&gt;
  (comment out the line with the FAKE devices)&lt;br /&gt;
* Configure systemd services&lt;br /&gt;
  sudo systemctl enable owserver owhttpd&lt;br /&gt;
  sudo systemctl disable owftpd&lt;br /&gt;
* Start the systemd service&lt;br /&gt;
  sudo systemctl start owserver owhttpd&lt;br /&gt;
* Check the logs&lt;br /&gt;
  sudo journalctl -xeu owserver -f&lt;br /&gt;
* Open a browser to view the web interface&lt;br /&gt;
  http://localhost:2121 or&lt;br /&gt;
  http://raspberrypi.local:2121&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Karaburan&amp;diff=35044</id>
		<title>Karaburan</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Karaburan&amp;diff=35044"/>
		<updated>2026-02-07T20:59:17Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Water measurement probes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
 |Name=Karaburan&lt;br /&gt;
 |Picture=karaburan.png&lt;br /&gt;
 |Omschrijving=Monitoring water quality&lt;br /&gt;
 |Status=In progress&lt;br /&gt;
 |Contact=bertrik&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Next steps ==&lt;br /&gt;
* &amp;lt;s&amp;gt;engage with PX4 community on getting a feel if this is useful to use and if so, how to get started&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;figure out how to duplicate an MQTT stream&amp;lt;/s&amp;gt; don&#039;t bother&lt;br /&gt;
* write python scripts&lt;br /&gt;
** &amp;lt;s&amp;gt;arduino turbidity&amp;lt;/s&amp;gt; don&#039;t bother&lt;br /&gt;
** &amp;lt;s&amp;gt;turbidity-to-mqtt&amp;lt;/s&amp;gt; maybe make this ROS module&lt;br /&gt;
** &amp;lt;s&amp;gt;HID-to-mqtt&amp;lt;/s&amp;gt; maybe make this ROS module&lt;br /&gt;
** position/velocity listener script: latitude, longitude, altitude, heading/bearing/track/whatever, velocity&lt;br /&gt;
* hook things into systemd / udev&lt;br /&gt;
* analoog in op de pi:&lt;br /&gt;
** https://elektronicavoorjou.nl/product/adc-pi/&lt;br /&gt;
** https://www.123materialen.com/products/zeer-nauwkeurige-ads1256-dac8552-ad-da-board-voor-raspberry-pi_1676153&lt;br /&gt;
** FreeJoy project&lt;br /&gt;
* UPS voor pi: https://elektronicavoorjou.nl/product/raspberry-pi-ups-hat/&lt;br /&gt;
* 1-wire stuff:&lt;br /&gt;
** 1-wire adapter emulation on an stm32: https://github.com/alitekin2fx/stm32_ds2480_emu&lt;br /&gt;
** owfs.org for easy interfacing with multiple 1-wire devices in a hierarchical way on linux&lt;br /&gt;
* Figure out the udev/hotplug mess, we probably need this because many of our peripherals use a serial port:&lt;br /&gt;
** in how many places can we store the udev renaming logic (config files)&lt;br /&gt;
** can we automate this, make it user friendlier, e.g. some kind of &amp;quot;insert device X now&amp;quot; script&lt;br /&gt;
&lt;br /&gt;
Check:&lt;br /&gt;
* https://www.rtvnoord.nl/natuur/1215705/vuilrobot-maakt-jachthaven-winschoten-schoon-beter-dan-met-een-schepnet&lt;br /&gt;
&lt;br /&gt;
=== USB HID as analog input ===&lt;br /&gt;
An stm32 based bluepill board can be flashed with firmware to allow its analog inputs to be exposed as USB HID sliders.&lt;br /&gt;
&lt;br /&gt;
Flashing the bluepill with openocd to the freejoy firmware:&lt;br /&gt;
* install openocd&lt;br /&gt;
  sudo apt install openocd&lt;br /&gt;
* connect an stlinkv2 to an stm32 bluepill, connect the stlinkv2 to USB&lt;br /&gt;
* flash the freejoy firmware as follows:&lt;br /&gt;
** download the firmware from https://github.com/FreeJoy-Team/FreeJoy&lt;br /&gt;
** create a symlink to the hex file called firmware.hex&lt;br /&gt;
** flash the firmware from the command line&lt;br /&gt;
  openocd -s /usr/share/openocd/scripts -f interface/stlink.cfg -f target/stm32f1x.cfg -c init -c &amp;quot;program firmware.hex verify reset exit&amp;quot;&lt;br /&gt;
* watch the kernel logs&lt;br /&gt;
  sudo dmesg -w&lt;br /&gt;
* connect the stm32 using a USB cable&lt;br /&gt;
* download the freejoy configurator from https://github.com/FreeJoy-Team/FreeJoyConfiguratorQt&lt;br /&gt;
* start the configurator and load the karaburan.cfg setting&lt;br /&gt;
* Write config to device -&amp;gt; it should reboot now and come up with the new settings&lt;br /&gt;
&lt;br /&gt;
Verify that it works:&lt;br /&gt;
* install the evtest package&lt;br /&gt;
* run&lt;br /&gt;
  evtest /dev/input/by-id/usb-FreeJoy_FreeJoy_v1.7.1-event-if00&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/vostrenkov/EazyJoy&lt;br /&gt;
&lt;br /&gt;
=== influxdb ===&lt;br /&gt;
See https://hub.docker.com/_/influxdb&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/karaburan/tree/master/influxdb&lt;br /&gt;
&lt;br /&gt;
=== ROS ===&lt;br /&gt;
Investigation:&lt;br /&gt;
* Use ROS 2, not the old ROS 1&lt;br /&gt;
* Cannot work comfortably with debian, works best with ubuntu&lt;br /&gt;
* Using gpsd:&lt;br /&gt;
** install ros-jazzy-desktop&lt;br /&gt;
** ros2 launch gpsd_client gpsd_client-launch.py&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Topics:&lt;br /&gt;
* air quality sensors&lt;br /&gt;
** ammonia&lt;br /&gt;
** NOx&lt;br /&gt;
* water chemical analysis&lt;br /&gt;
** nitrates&lt;br /&gt;
** ammonia&lt;br /&gt;
** dissolved oxygen&lt;br /&gt;
** sulfide/sulfate&lt;br /&gt;
** phosphates?&lt;br /&gt;
** salinity (chlorides?)&lt;br /&gt;
* water physical analysis&lt;br /&gt;
** temperature&lt;br /&gt;
** clarity/turbidity -&amp;gt; investigate standard ways of measuring/expressing this&lt;br /&gt;
** conductivity/total dissolved solids&lt;br /&gt;
** water properties by light reflection, hyperspectral/polarity&lt;br /&gt;
** depth?&lt;br /&gt;
* boat control&lt;br /&gt;
** trajectory -&amp;gt; steering&lt;br /&gt;
** idea: interface with the remote control, not with the boat&lt;br /&gt;
** idea: find a boat with easily hackable remote control protocol&lt;br /&gt;
** idea: can we get sensor data over this link too, e.g. GPS?&lt;br /&gt;
* camera control&lt;br /&gt;
* post-processing&lt;br /&gt;
** data presentation&lt;br /&gt;
*** video/photo stitching&lt;br /&gt;
*** time lapse view&lt;br /&gt;
*** map view of properties&lt;br /&gt;
* use cases&lt;br /&gt;
** verify with domain experts, how to engage?&lt;br /&gt;
** slootview, under/above water&lt;br /&gt;
** minimum viable prototype&lt;br /&gt;
** high-res measurement by location, by time&lt;br /&gt;
* materials&lt;br /&gt;
** boat selection&lt;br /&gt;
** processing platform selection&lt;br /&gt;
** communication platform selection&lt;br /&gt;
&lt;br /&gt;
== Investigate RTK GPS ==&lt;br /&gt;
Goal: figure out if it is practically possible to achieve cm resolution with a 200-euro GPS and a free correction service: YES&lt;br /&gt;
&lt;br /&gt;
* https://www.nsgi.nl/referentiepunten-en-gnss-data/gnss-data/real-time-streams public correction data service&lt;br /&gt;
* https://www.ardusimple.nl/rtk-in-5-minutes/&lt;br /&gt;
* RTK in action https://www.youtube.com/watch?v=Oc1LBFDj2MA&lt;br /&gt;
* Use with Linux / gpsd: https://stackoverflow.com/questions/77314115/drotek-gpsd-and-ntrip-correction-data-for-precise-positioning ?&lt;br /&gt;
* Chipsets&lt;br /&gt;
** Quectel LC29H (default: 115200 bps)&lt;br /&gt;
*** review: see https://rtklibexplorer.wordpress.com/2024/04/28/dual-frequency-rtk-for-less-than-60-with-the-quectel-lc29hea/&lt;br /&gt;
*** configuration: https://rtklibexplorer.wordpress.com/2024/05/06/configuring-the-quectel-lc29hea-receiver-for-real-time-rtk-solutions/&lt;br /&gt;
** uBLOX ZED-F9P&lt;br /&gt;
* Boards&lt;br /&gt;
** UM980 / UM982&lt;br /&gt;
&lt;br /&gt;
Edit /etc/default/gpsd, set GPSD_OPTIONS:&lt;br /&gt;
  GPSD_OPTIONS=&amp;quot;-Gn ntrip://user:pass@ntrip.kadaster.nl:2101/CBW100NLD0&amp;quot;&lt;br /&gt;
Option -G exposes the control socket on all network interfaces, option -n keeps the GPS active if there is no one currently connected.&lt;br /&gt;
&lt;br /&gt;
Plotting live location on a map:&lt;br /&gt;
* Configure gpsd to expose its socket to the outside world: last section of https://gpsd.gitlab.io/gpsd/troubleshooting.html&lt;br /&gt;
* In QGIS, press ctrl+0 to show the GPS information tab, enter the name of the remote gpsd (port 2947)&lt;br /&gt;
&lt;br /&gt;
Station at Stolwijk (close to Gouda): https://gnss1.tudelft.nl/dpga/station/Stolwijk.html#STWK ?&lt;br /&gt;
&lt;br /&gt;
Starting from the command line:&lt;br /&gt;
* stop gpsd.socket&lt;br /&gt;
  sudo systemctl stop gpsd.socket&lt;br /&gt;
* run from command line&lt;br /&gt;
  sudo /usr/sbin/gpsd -Gn -D 1 -N /dev/ttyUSB0 .... (not sure yet)&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
How to show that RTK GPS is actually accurate?&lt;br /&gt;
&lt;br /&gt;
* Relative positioning: with an &amp;quot;fix RTK&amp;quot; solution, place the antenna at 4 points 25cm apart, each point for 20 seconds or so -&amp;gt; you see 4 distinct clusters of points&lt;br /&gt;
* Positioning over short time: put it in a fixed location, make sure that it has &amp;quot;fix RTK&amp;quot; solution, take 100 measurements or so -&amp;gt; determine the radius of the circle that contains 90% of the points&lt;br /&gt;
* Positioning over longer time: do this for (say) an hour&lt;br /&gt;
* Absolute positioning: look up a national reference point, for example &amp;quot;RD-punt 389346&amp;quot;, located on the Sluisdijk between Gouda and Moordrecht. Technical data: https://www.nsgi.nl/iv-api/rdinfo/rdpoint/389346&lt;br /&gt;
** see https://www.nsgi.nl/referentiepunten-en-gnss-data/informatie-referentiepunten/rdinfo and enter 389346&lt;br /&gt;
** latitude: 51° 59&#039; 49,64048&amp;quot; , longitude: 4° 41&#039; 19,90765&amp;quot;, or 51.99712236/4.68886324&lt;br /&gt;
&lt;br /&gt;
==== Comparison with reference coordinate ====&lt;br /&gt;
On october 4th 2024, we took the RTK GPS to a kernnet reference point at 51.99712236/4.68886324, results below:&lt;br /&gt;
&lt;br /&gt;
From https://www.nsgi.nl/iv-api/rdinfo/rdpoint/389346:&lt;br /&gt;
* Year 2021: &amp;quot;51 59 49,64004&amp;quot;, &amp;quot;4 41 19,90584&amp;quot;, 48.039. In decimal degrees that is &lt;br /&gt;
&lt;br /&gt;
Differences between the reference point and the measurements are calculated to easting (&#039;X&#039;) and northing (&#039;Y&#039;), unit meter. To calculate distance in meters, we use a linear approximation:&lt;br /&gt;
* For dy: 40075km/360 = 111,319 m/deg&lt;br /&gt;
* For dx: dy * cos(latitude) = 68,549 m/deg&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Measurements + deviations&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Latitude !! Longitude !! dx (m) !! dy (m) !! absolute (m) !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| Reference 2012 || 51.99712236 || 4.68886324 || - || - || 0 || by definition&lt;br /&gt;
|-&lt;br /&gt;
| Reference 2021 || 51.99712223 || 4.68886273 || - || - || 0 || by definition&lt;br /&gt;
|-&lt;br /&gt;
| Screenshot 1 || 51.99712217 || 4.68886567 || 0.167 || -0.021 || 0.168 || - &lt;br /&gt;
|-&lt;br /&gt;
| Screenshot 2 || 51.99712200 || 4.68886533 || 0.143 || -0.040 || 0.149 || -&lt;br /&gt;
|-&lt;br /&gt;
| Meting 1 || 51.9971220 || 4.6888663 || 0.210 || -0.040 || 0.214 || -&lt;br /&gt;
|-&lt;br /&gt;
| Meting 2 || 51.9971222 || 4.6888660 || 0.189 || -0.018 || 0.190 || -&lt;br /&gt;
|-&lt;br /&gt;
| Average || - || - || 0.177 || -0.030 || 0.180 || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
According to [https://www.unavco.org/software/geodetic-utilities/plate-motion-calculator/plate-motion-calculator.html this page], the rate of movement is about&lt;br /&gt;
15.75mm/year to the north and 17.45 mm/year to the east (ITRF2020 model).&lt;br /&gt;
Over 12 years, that amounts to 0.189m north and 0.209m east.&lt;br /&gt;
&lt;br /&gt;
== Air quality sensors ==&lt;br /&gt;
&lt;br /&gt;
=== Nitrogen compounds in air ===&lt;br /&gt;
According to https://www.rivm.nl/stikstof/monitoren-advies-onderzoek/overzicht-stikstofmetingen/metingen-stikstof-in-de-lucht average (typical?) values of&lt;br /&gt;
* Ammonia (NH3): 6.7 ug/m3 (9.6 ppb)&lt;br /&gt;
* NOx: 27.3 ug/m3&lt;br /&gt;
* NO2: 18.6 ug/m3 (9.9 ppb)&lt;br /&gt;
&lt;br /&gt;
(ppb-conversion using https://www.breeze-technologies.de/blog/air-pollution-how-to-convert-between-mgm3-%C2%B5gm3-ppm-ppb/ )&lt;br /&gt;
&lt;br /&gt;
RIVM report on inexpensive nitrogen-in-air sensors: https://www.samenmeten.nl/sensoren-voor-no2&lt;br /&gt;
Conclusion: most sensors are not sensitive enough to be used in typical outdoor conditions, with perhaps one exception: alphasense NO2-B43F&lt;br /&gt;
&lt;br /&gt;
== Sonar sensors ==&lt;br /&gt;
Investigate this because it allows us to measure depth.&lt;br /&gt;
&lt;br /&gt;
AliExpress has several types of affordable sonar sensors, focused at detecting fish, but also able to measure depth.&lt;br /&gt;
&lt;br /&gt;
I ordered this one: https://nl.aliexpress.com/item/1005006388343879.html&lt;br /&gt;
* 125 kHz main frequency, range up to 200 ft deep (about 60m)&lt;br /&gt;
* bluetooth low-power interface (basically serial-over-BLE)&lt;br /&gt;
* built-in battery, powers on automatically when submerged&lt;br /&gt;
* reports 120-element array with raw sonar return intensity-vs-depth&lt;br /&gt;
* measures water temperature&lt;br /&gt;
* about 45 euro&lt;br /&gt;
&lt;br /&gt;
Fish helper pro application for android https://apkpure.com/fish-helper-pro/com.fishfinderpro.xdx&lt;br /&gt;
&lt;br /&gt;
=== Debug tool ===&lt;br /&gt;
I wrote a python script to connect to it from a linux computer: https://github.com/bertrik/wireless-sonar-sensor&lt;br /&gt;
&lt;br /&gt;
It&#039;s connects to a &amp;quot;Fish Helper Pro&amp;quot; wireless sonar sensor over bluetooth low-energy, reports depth and temperature&lt;br /&gt;
&lt;br /&gt;
=== ROS2 integration ===&lt;br /&gt;
The most appropriate message for a simple range would be: https://docs.ros2.org/foxy/api/sensor_msgs/msg/Range.html&lt;br /&gt;
&lt;br /&gt;
There are other messages to perhaps report the raw echo return array.&lt;br /&gt;
&lt;br /&gt;
== Water physical analysis ==&lt;br /&gt;
=== Turbidity / clarity ===&lt;br /&gt;
See https://en.wikipedia.org/wiki/Turbidity&lt;br /&gt;
&lt;br /&gt;
Aliexpress sensor &#039;&#039;&#039;TS-300B&#039;&#039;&#039;: https://nl.aliexpress.com/item/1005006732956937.html&lt;br /&gt;
Has a range 0 ~ 1000 ± 30 NTU&lt;br /&gt;
&lt;br /&gt;
Order of magnitude for turbidity:&lt;br /&gt;
* Drinking water upper limit: &#039;&#039;&#039;4 NTU&#039;&#039;&#039; (European turbidity standard for drinking water)&lt;br /&gt;
* Ambient water: 10-150 NTU. The US state of Washington use a &amp;quot;background&amp;quot; value of &#039;&#039;&#039;50 NTU&#039;&#039;&#039; as reference.&lt;br /&gt;
&lt;br /&gt;
(see https://en.wikipedia.org/wiki/Turbidity#Standards_and_test_methods )&lt;br /&gt;
&lt;br /&gt;
So the Aliexpress sensor is suited only for &amp;quot;dirty&amp;quot; water.&lt;br /&gt;
&lt;br /&gt;
=== Water measurement probes ===&lt;br /&gt;
I bought this one: Tuya compatible BT785 EC meter: https://nl.aliexpress.com/i/1005007462079781.html inexpensive, focused on EC, runs on 4x LR44&lt;br /&gt;
&lt;br /&gt;
Speaks the TuYa protocol (requires a secret key that you can fetch through the developer console).&lt;br /&gt;
&lt;br /&gt;
Does NOT speak the universal serialport access protocol as described here:&lt;br /&gt;
https://developer.tuya.com/en/docs/iot/tuya-cloud-universal-serial-port-access-protocol?id=K9hhi0xxtn9cb&lt;br /&gt;
&lt;br /&gt;
* https://nl.aliexpress.com/item/1005003784454381.html BLE-9908 Inexpensie &amp;quot;Yieryi&amp;quot; PH/EC/Temp probe with bluetooth and app, about E25,- (Uses 3x LR44 coin cell batteries)&lt;br /&gt;
* Several different models: https://nl.aliexpress.com/item/1005007810989801.html&lt;br /&gt;
** EZ9901: TDS/pH/temp&lt;br /&gt;
** EZ9902: EC/pH/temp&lt;br /&gt;
** EZ9908: EC/TDS/pH/temp&lt;br /&gt;
** EZ9909: TDS/EC/pH/salt/temp&lt;br /&gt;
* The bluetooth versions are probably as above, with numbers like BLE9902 and BLE9908&lt;br /&gt;
* Yiery BLE9902: https://shop.yieryimeters.com/products/yieryi-ble-9902-3-in-1-digital-ph-meter-with-bluetooth-ec-and-temperature-measurement-ideal-for-water-quality-testing-in-pools-fish-tanks-hydroponics-more&lt;br /&gt;
* BLE-EC01 is a bluetooth EC meter, can find it here https://www.amazon.com/BLE-EC01-Smart4-TDS-Temp-Meter/dp/B0DPZZC7BV, not on AliExpress?&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Some probes indicate EC (electrical conductivity), other indicate TDS (total dissolved liquids). TDS is derived from EC (knowing the liquid type). EC is the more universal/fundamental property!&lt;br /&gt;
* EC is typically expressed in uS/cm or mS/cm (micro or milli siemens per centimeter), say 500 uS/cm for outdoor water.&lt;br /&gt;
* EC is temperature dependent, typically you need the value extrapolated to 25 degrees Celcius. Temperature-EC correlation rule of thumb: about 2% more conductive per K.&lt;br /&gt;
* pH sensors are almost by definition fragile and last only a limited time, so probably don&#039;t bother trying to use one at all. The pH of outdoor water might not be that interesting to measure.&lt;br /&gt;
&lt;br /&gt;
== Boat control ==&lt;br /&gt;
Typically the wireless link looks like this:&lt;br /&gt;
* 2.4 GHz working frequency&lt;br /&gt;
* 500m range&lt;br /&gt;
&lt;br /&gt;
Interesting links:&lt;br /&gt;
* Flytec-2011 remote control https://nl.aliexpress.com/item/1005002984723718.html&lt;br /&gt;
* Replacement board for various boats with &amp;quot;18&amp;quot; in their type number: https://nl.aliexpress.com/item/1005006115484716.html&lt;br /&gt;
* DIY Multi-protocol module: https://github.com/pascallanger/DIY-Multiprotocol-TX-Module&lt;br /&gt;
&lt;br /&gt;
=== remote control ===&lt;br /&gt;
Image of remote control RF chip:&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
Parts:&lt;br /&gt;
* 12.000 MHz crystal/oscillator&lt;br /&gt;
* 16-pin control chip: 20_CL6L071&lt;br /&gt;
* 6-pin RF chip: 1110 / VKA3, could be an rx/tx switch, amplifier or filter circuit&lt;br /&gt;
&lt;br /&gt;
See also: https://www.open-tx.org/&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* map out the connections between the mainboard and the rf board, expected: VCC, GND, spi ?&lt;br /&gt;
&lt;br /&gt;
== Use cases ==&lt;br /&gt;
material:&lt;br /&gt;
* https://www.youtube.com/watch?v=cMk0bGvIU1E&lt;br /&gt;
* https://iplo.nl/thema/water/oppervlaktewater/kaderrichtlijn-water&lt;br /&gt;
* kaartje: https://krw-nutrend.netlify.app/ -&amp;gt; 2 meetpunten op de reeuwijkse plassen, tijdresolutie is 1 jaar?&lt;br /&gt;
&lt;br /&gt;
Useful distinction, typically used in documents/guidelines:&lt;br /&gt;
* chemical quality, what substances are present in the water?&lt;br /&gt;
* biological / ecology quality, what kind of living organisms live in the water?&lt;br /&gt;
&lt;br /&gt;
=== Reeuwijkse plassen ===&lt;br /&gt;
See&lt;br /&gt;
* https://www.rijnland.net/wat-doet-rijnland/in-uw-buurt/reeuwijkse-plassen/ their stated goal: CLEAR WATER&lt;br /&gt;
* https://www.rijnland.net/regels-op-een-rij/subsidies-en-andere-financi%C3%ABle-bijdragen/&lt;br /&gt;
&lt;br /&gt;
potential applications:&lt;br /&gt;
* inspect water sides (oever) over time&lt;br /&gt;
* underwater camera: detect invasive cray fish&lt;br /&gt;
* sample water properties at high spatial resolution, high time resolution&lt;br /&gt;
* early detection of indicators for cyanobacteria: temperature and nutrients&lt;br /&gt;
&lt;br /&gt;
=== Detect/find pollution source ===&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== udev handling of serial ports ===&lt;br /&gt;
Many peripheral devices are connected through serial.&lt;br /&gt;
The plan is to have an udev config file with renaming rules, so each peripheral gets a stable name in /dev .&lt;br /&gt;
The plan is also to create the udev config using some python: insert device X now -&amp;gt; write line to udev config.&lt;br /&gt;
&lt;br /&gt;
The udev config file is:&lt;br /&gt;
  /etc/udev/rules.d/99-usb-serial.rules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# LIDAR serial converter&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;10c4&amp;quot;, ATTRS{idProduct}==&amp;quot;ea60&amp;quot;, SYMLINK+=&amp;quot;ttyLIDAR&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
# quectel GPS&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;1a86&amp;quot;, ATTRS{idProduct}==&amp;quot;7523&amp;quot;, SYMLINK+=&amp;quot;ttyGPS&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
# ublox GPS&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;0403&amp;quot;, ATTRS{idProduct}==&amp;quot;6001&amp;quot;, SYMLINK+=&amp;quot;ttyGPS&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An USB-nano also appears to have a USB vendor/product id of 1a86/7523 (&amp;quot;USB2.0-Serial&amp;quot;) ... same as the quectel GPS?&lt;br /&gt;
&lt;br /&gt;
Same for &amp;quot;AI thinker&amp;quot; USB-serial: vendor/product id of 1a86/7523 (product: &amp;quot;USB2.0-Serial&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
To (re)load the properties:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo udevadm control --reload-rules&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== reading temperature sensor ===&lt;br /&gt;
The idea is to to use a DB18B20 temperature sensor, read it using an arduino nano board acting as a 1-wire adapter.&lt;br /&gt;
Use openwire-fs as user-side openwire software http://owfs.org&lt;br /&gt;
&lt;br /&gt;
Preparation:&lt;br /&gt;
* Add the regular user to the &#039;dialout&#039; group, so it can access serial ports&lt;br /&gt;
  sudo adduser &amp;lt;name&amp;gt; dialout&lt;br /&gt;
&lt;br /&gt;
Setting up the hardware:&lt;br /&gt;
* connect the DS18B20 to the connector board with the pull-ups&lt;br /&gt;
* wire the connector board to the arduino nano, see ...&lt;br /&gt;
* plug the arduino nano in the pi&lt;br /&gt;
&lt;br /&gt;
Setting up the software:&lt;br /&gt;
* Install openwire fs&lt;br /&gt;
  sudo apt install owfs&lt;br /&gt;
* Create the openwire fs mountpoint&lt;br /&gt;
  sudo mkdir /mnt/1wire&lt;br /&gt;
* Configure owfs, edit /etc/owfs.conf&lt;br /&gt;
  server: device = /dev/ttyUSB0&lt;br /&gt;
  mountpoint = /mnt/1wire&lt;br /&gt;
  allow_other&lt;br /&gt;
  (comment out the line with the FAKE devices)&lt;br /&gt;
* Configure systemd services&lt;br /&gt;
  sudo systemctl enable owserver owhttpd&lt;br /&gt;
  sudo systemctl disable owftpd&lt;br /&gt;
* Start the systemd service&lt;br /&gt;
  sudo systemctl start owserver owhttpd&lt;br /&gt;
* Check the logs&lt;br /&gt;
  sudo journalctl -xeu owserver -f&lt;br /&gt;
* Open a browser to view the web interface&lt;br /&gt;
  http://localhost:2121 or&lt;br /&gt;
  http://raspberrypi.local:2121&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=NRF52840&amp;diff=35042</id>
		<title>NRF52840</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=NRF52840&amp;diff=35042"/>
		<updated>2026-02-01T16:26:09Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=NRF52840&lt;br /&gt;
   |Picture=nrf52840-supermini.png&lt;br /&gt;
   |Omschrijving=Running Arduino with platformio on NRF52840&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
This page is about getting inexpensive NRF52840 boards to work with Arduino and platformio.&lt;br /&gt;
&lt;br /&gt;
NRF52840 is a nice platform:&lt;br /&gt;
* low-power&lt;br /&gt;
* inexpensive&lt;br /&gt;
* decent amount of flash (1024k), RAM (256k) and CPU cycles (64 MHz)&lt;br /&gt;
* support various radio protocols like zigbee, ble, thread, enhanced shockburst&lt;br /&gt;
* built-in support for quadrature counting&lt;br /&gt;
* can run arduino too&lt;br /&gt;
&lt;br /&gt;
However the eco-system of inexpensive boards is a complicated landscape:&lt;br /&gt;
* AliExpress sellers offer &amp;quot;promicro&amp;quot; and &amp;quot;supermini&amp;quot; board with unclear characteristics&lt;br /&gt;
* LEDs are sometimes swapped (blue = hardware charge, red = software led?)&lt;br /&gt;
* Various firmware upload interface options (which one to use?):&lt;br /&gt;
** Using nrfutil, sends a .zip file containing various parts, over USB-serial&lt;br /&gt;
** Mass storage UF2, activated using the double-reset&lt;br /&gt;
** SWD debug interface (requires soldering!)&lt;br /&gt;
* Confusing situation regarding bootloaders:&lt;br /&gt;
** Most boards seem to come with a modified version of a bootloader meant for another type of board&lt;br /&gt;
** Type of bootloader depends on type of firmware you want to run, &amp;quot;ZMK&amp;quot;, Arduino using Arduino IDE, Arduino using platformio&lt;br /&gt;
** Risk of accidentally overwriting the bootloader, with UF2 flash offsets sometimes being absolute, sometimes being relative&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:nrf52840-supermini-pinout.png|right|350px| thumb stopped working :(]]&lt;br /&gt;
&lt;br /&gt;
The boards I have are the &amp;quot;promicro&amp;quot; and &amp;quot;supermini&amp;quot;.&lt;br /&gt;
These boards look basically identical hardware-wise.&lt;br /&gt;
&lt;br /&gt;
There is a 4-pad connector to program it using SWD (VDD/SWD/SDC/GND).&lt;br /&gt;
This can be used to write the bootloader for example.&lt;br /&gt;
The pads have a spacing of 1.5mm.&lt;br /&gt;
&lt;br /&gt;
The blue LED appears to flash independently of software, this is probably the charge circuit behaving randomly without a battery present.&lt;br /&gt;
The red LED appears to be under software control.&lt;br /&gt;
&lt;br /&gt;
Pinout/schematic: https://nicekeyboards.com/docs/nice-nano/pinout-schematic&lt;br /&gt;
&lt;br /&gt;
=== bootloader ===&lt;br /&gt;
The INFO_UF2.TXT says (after double-tap reset):&lt;br /&gt;
  UF2 Bootloader 0.6.0 lib/nrfx (v2.0.0) lib/tinyusb (0.10.1-41-gdf0cda2d) lib/uf2 (remotes/origin/configupdate-9-gadbb8c7)&lt;br /&gt;
  Model: nice!nano&lt;br /&gt;
  Board-ID: nRF52840-nicenano&lt;br /&gt;
  SoftDevice: S140 version 6.1.1&lt;br /&gt;
  Date: Jun 19 2021&lt;br /&gt;
&lt;br /&gt;
The CURRENT.UF2 file is 1.4 MB&lt;br /&gt;
&lt;br /&gt;
Kernel log says:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[509372.005339] usb 1-2.3: new full-speed USB device number 96 using xhci_hcd&lt;br /&gt;
[509372.132351] usb 1-2.3: New USB device found, idVendor=239a, idProduct=00b3, bcdDevice= 1.00&lt;br /&gt;
[509372.132361] usb 1-2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[509372.132364] usb 1-2.3: Product: nice!nano&lt;br /&gt;
[509372.132366] usb 1-2.3: Manufacturer: Nice Keyboards&lt;br /&gt;
[509372.132368] usb 1-2.3: SerialNumber: 98D93A272A6CCC7D&lt;br /&gt;
[509372.187474] cdc_acm 1-2.3:1.0: ttyACM0: USB ACM device&lt;br /&gt;
[509372.190177] usb-storage 1-2.3:1.2: USB Mass Storage device detected&lt;br /&gt;
[509372.190467] scsi host3: usb-storage 1-2.3:1.2&lt;br /&gt;
[509373.200470] scsi host3: scsi scan: INQUIRY result too short (5), using 36&lt;br /&gt;
[509373.200481] scsi 3:0:0:0: Direct-Access     Adafruit nRF UF2          1.0  PQ: 0 ANSI: 2&lt;br /&gt;
[509373.200825] sd 3:0:0:0: Attached scsi generic sg0 type 0&lt;br /&gt;
[509373.202317] sd 3:0:0:0: [sdb] 65801 512-byte logical blocks: (33.7 MB/32.1 MiB)&lt;br /&gt;
[509373.202556] sd 3:0:0:0: [sdb] Write Protect is off&lt;br /&gt;
[509373.202559] sd 3:0:0:0: [sdb] Mode Sense: 03 00 00 00&lt;br /&gt;
[509373.202782] sd 3:0:0:0: [sdb] No Caching mode page found&lt;br /&gt;
[509373.202784] sd 3:0:0:0: [sdb] Assuming drive cache: write through&lt;br /&gt;
[509373.296933]  sdb:&lt;br /&gt;
[509373.297002] sd 3:0:0:0: [sdb] Attached SCSI removable disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Working platformio example project for the nice!nano and supermini/promicro nrf52840 clones:&lt;br /&gt;
https://github.com/bertrik/nicenano-example &lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* Nordic technical documentation: https://docs.nordicsemi.com/category/nrf52840-category&lt;br /&gt;
* Here is a wiki full of useful information on specific boards: https://github.com/joric/nrfmicro/wiki&lt;br /&gt;
** Specifically the supermini https://github.com/joric/nrfmicro/wiki/Alternatives#supermini-nrf52840&lt;br /&gt;
* nRFMicro Arduino Core:&lt;br /&gt;
** Meant for integration with Arduino IDE, not platformio!&lt;br /&gt;
** See https://github.com/pdcook/nRFMicro-Arduino-Core&lt;br /&gt;
** Uses https://github.com/NordicSemiconductor/nrfx for NRF52840 specific drivers&lt;br /&gt;
* Platformio support for supermini:&lt;br /&gt;
** Focused on platformio&lt;br /&gt;
** https://github.com/ICantMakeThings/Nicenano-NRF52-Supermini-PlatformIO-Support&lt;br /&gt;
** Bit awkward installation (copy/overwrite files inside existing platformio folder)&lt;br /&gt;
* https://docs.nordicsemi.com/bundle/ncs-3.1.0/page/zephyr/boards/others/promicro_nrf52840/doc/index.html pro-micro information from Nordic Semi&lt;br /&gt;
&lt;br /&gt;
Getting &#039;circuitpython&#039; to work:&lt;br /&gt;
* Here&#039;s a page on making it work on nicenano: https://circuitpython.org/board/nice_nano/&lt;br /&gt;
* HOWEVER, it also says &amp;quot;On nRF boards, CircuitPython 8.2.0 and later require UF2 bootloader version 0.6.1 or later. Older bootloaders cannot load the firmware. See Update UF2 Bootloader below.&amp;quot;. Guess what bootloader came with my board ... 0.6.0&lt;br /&gt;
* They point you to https://github.com/adafruit/Adafruit_nRF52_Bootloader/releases/tag/0.9.2 but now what!?!!!&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=NRF52840&amp;diff=35041</id>
		<title>NRF52840</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=NRF52840&amp;diff=35041"/>
		<updated>2026-02-01T16:25:53Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: try &amp;#039;frame&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=NRF52840&lt;br /&gt;
   |Picture=nrf52840-supermini.png&lt;br /&gt;
   |Omschrijving=Running Arduino with platformio on NRF52840&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
This page is about getting inexpensive NRF52840 boards to work with Arduino and platformio.&lt;br /&gt;
&lt;br /&gt;
NRF52840 is a nice platform:&lt;br /&gt;
* low-power&lt;br /&gt;
* inexpensive&lt;br /&gt;
* decent amount of flash (1024k), RAM (256k) and CPU cycles (64 MHz)&lt;br /&gt;
* support various radio protocols like zigbee, ble, thread, enhanced shockburst&lt;br /&gt;
* built-in support for quadrature counting&lt;br /&gt;
* can run arduino too&lt;br /&gt;
&lt;br /&gt;
However the eco-system of inexpensive boards is a complicated landscape:&lt;br /&gt;
* AliExpress sellers offer &amp;quot;promicro&amp;quot; and &amp;quot;supermini&amp;quot; board with unclear characteristics&lt;br /&gt;
* LEDs are sometimes swapped (blue = hardware charge, red = software led?)&lt;br /&gt;
* Various firmware upload interface options (which one to use?):&lt;br /&gt;
** Using nrfutil, sends a .zip file containing various parts, over USB-serial&lt;br /&gt;
** Mass storage UF2, activated using the double-reset&lt;br /&gt;
** SWD debug interface (requires soldering!)&lt;br /&gt;
* Confusing situation regarding bootloaders:&lt;br /&gt;
** Most boards seem to come with a modified version of a bootloader meant for another type of board&lt;br /&gt;
** Type of bootloader depends on type of firmware you want to run, &amp;quot;ZMK&amp;quot;, Arduino using Arduino IDE, Arduino using platformio&lt;br /&gt;
** Risk of accidentally overwriting the bootloader, with UF2 flash offsets sometimes being absolute, sometimes being relative&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:nrf52840-supermini-pinout.png|right|350px thumb stopped working :(]]&lt;br /&gt;
&lt;br /&gt;
The boards I have are the &amp;quot;promicro&amp;quot; and &amp;quot;supermini&amp;quot;.&lt;br /&gt;
These boards look basically identical hardware-wise.&lt;br /&gt;
&lt;br /&gt;
There is a 4-pad connector to program it using SWD (VDD/SWD/SDC/GND).&lt;br /&gt;
This can be used to write the bootloader for example.&lt;br /&gt;
The pads have a spacing of 1.5mm.&lt;br /&gt;
&lt;br /&gt;
The blue LED appears to flash independently of software, this is probably the charge circuit behaving randomly without a battery present.&lt;br /&gt;
The red LED appears to be under software control.&lt;br /&gt;
&lt;br /&gt;
Pinout/schematic: https://nicekeyboards.com/docs/nice-nano/pinout-schematic&lt;br /&gt;
&lt;br /&gt;
=== bootloader ===&lt;br /&gt;
The INFO_UF2.TXT says (after double-tap reset):&lt;br /&gt;
  UF2 Bootloader 0.6.0 lib/nrfx (v2.0.0) lib/tinyusb (0.10.1-41-gdf0cda2d) lib/uf2 (remotes/origin/configupdate-9-gadbb8c7)&lt;br /&gt;
  Model: nice!nano&lt;br /&gt;
  Board-ID: nRF52840-nicenano&lt;br /&gt;
  SoftDevice: S140 version 6.1.1&lt;br /&gt;
  Date: Jun 19 2021&lt;br /&gt;
&lt;br /&gt;
The CURRENT.UF2 file is 1.4 MB&lt;br /&gt;
&lt;br /&gt;
Kernel log says:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[509372.005339] usb 1-2.3: new full-speed USB device number 96 using xhci_hcd&lt;br /&gt;
[509372.132351] usb 1-2.3: New USB device found, idVendor=239a, idProduct=00b3, bcdDevice= 1.00&lt;br /&gt;
[509372.132361] usb 1-2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[509372.132364] usb 1-2.3: Product: nice!nano&lt;br /&gt;
[509372.132366] usb 1-2.3: Manufacturer: Nice Keyboards&lt;br /&gt;
[509372.132368] usb 1-2.3: SerialNumber: 98D93A272A6CCC7D&lt;br /&gt;
[509372.187474] cdc_acm 1-2.3:1.0: ttyACM0: USB ACM device&lt;br /&gt;
[509372.190177] usb-storage 1-2.3:1.2: USB Mass Storage device detected&lt;br /&gt;
[509372.190467] scsi host3: usb-storage 1-2.3:1.2&lt;br /&gt;
[509373.200470] scsi host3: scsi scan: INQUIRY result too short (5), using 36&lt;br /&gt;
[509373.200481] scsi 3:0:0:0: Direct-Access     Adafruit nRF UF2          1.0  PQ: 0 ANSI: 2&lt;br /&gt;
[509373.200825] sd 3:0:0:0: Attached scsi generic sg0 type 0&lt;br /&gt;
[509373.202317] sd 3:0:0:0: [sdb] 65801 512-byte logical blocks: (33.7 MB/32.1 MiB)&lt;br /&gt;
[509373.202556] sd 3:0:0:0: [sdb] Write Protect is off&lt;br /&gt;
[509373.202559] sd 3:0:0:0: [sdb] Mode Sense: 03 00 00 00&lt;br /&gt;
[509373.202782] sd 3:0:0:0: [sdb] No Caching mode page found&lt;br /&gt;
[509373.202784] sd 3:0:0:0: [sdb] Assuming drive cache: write through&lt;br /&gt;
[509373.296933]  sdb:&lt;br /&gt;
[509373.297002] sd 3:0:0:0: [sdb] Attached SCSI removable disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Working platformio example project for the nice!nano and supermini/promicro nrf52840 clones:&lt;br /&gt;
https://github.com/bertrik/nicenano-example &lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* Nordic technical documentation: https://docs.nordicsemi.com/category/nrf52840-category&lt;br /&gt;
* Here is a wiki full of useful information on specific boards: https://github.com/joric/nrfmicro/wiki&lt;br /&gt;
** Specifically the supermini https://github.com/joric/nrfmicro/wiki/Alternatives#supermini-nrf52840&lt;br /&gt;
* nRFMicro Arduino Core:&lt;br /&gt;
** Meant for integration with Arduino IDE, not platformio!&lt;br /&gt;
** See https://github.com/pdcook/nRFMicro-Arduino-Core&lt;br /&gt;
** Uses https://github.com/NordicSemiconductor/nrfx for NRF52840 specific drivers&lt;br /&gt;
* Platformio support for supermini:&lt;br /&gt;
** Focused on platformio&lt;br /&gt;
** https://github.com/ICantMakeThings/Nicenano-NRF52-Supermini-PlatformIO-Support&lt;br /&gt;
** Bit awkward installation (copy/overwrite files inside existing platformio folder)&lt;br /&gt;
* https://docs.nordicsemi.com/bundle/ncs-3.1.0/page/zephyr/boards/others/promicro_nrf52840/doc/index.html pro-micro information from Nordic Semi&lt;br /&gt;
&lt;br /&gt;
Getting &#039;circuitpython&#039; to work:&lt;br /&gt;
* Here&#039;s a page on making it work on nicenano: https://circuitpython.org/board/nice_nano/&lt;br /&gt;
* HOWEVER, it also says &amp;quot;On nRF boards, CircuitPython 8.2.0 and later require UF2 bootloader version 0.6.1 or later. Older bootloaders cannot load the firmware. See Update UF2 Bootloader below.&amp;quot;. Guess what bootloader came with my board ... 0.6.0&lt;br /&gt;
* They point you to https://github.com/adafruit/Adafruit_nRF52_Bootloader/releases/tag/0.9.2 but now what!?!!!&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=NRF52840&amp;diff=35040</id>
		<title>NRF52840</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=NRF52840&amp;diff=35040"/>
		<updated>2026-02-01T16:24:08Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: try &amp;#039;frame&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=NRF52840&lt;br /&gt;
   |Picture=nrf52840-supermini.png&lt;br /&gt;
   |Omschrijving=Running Arduino with platformio on NRF52840&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
This page is about getting inexpensive NRF52840 boards to work with Arduino and platformio.&lt;br /&gt;
&lt;br /&gt;
NRF52840 is a nice platform:&lt;br /&gt;
* low-power&lt;br /&gt;
* inexpensive&lt;br /&gt;
* decent amount of flash (1024k), RAM (256k) and CPU cycles (64 MHz)&lt;br /&gt;
* support various radio protocols like zigbee, ble, thread, enhanced shockburst&lt;br /&gt;
* built-in support for quadrature counting&lt;br /&gt;
* can run arduino too&lt;br /&gt;
&lt;br /&gt;
However the eco-system of inexpensive boards is a complicated landscape:&lt;br /&gt;
* AliExpress sellers offer &amp;quot;promicro&amp;quot; and &amp;quot;supermini&amp;quot; board with unclear characteristics&lt;br /&gt;
* LEDs are sometimes swapped (blue = hardware charge, red = software led?)&lt;br /&gt;
* Various firmware upload interface options (which one to use?):&lt;br /&gt;
** Using nrfutil, sends a .zip file containing various parts, over USB-serial&lt;br /&gt;
** Mass storage UF2, activated using the double-reset&lt;br /&gt;
** SWD debug interface (requires soldering!)&lt;br /&gt;
* Confusing situation regarding bootloaders:&lt;br /&gt;
** Most boards seem to come with a modified version of a bootloader meant for another type of board&lt;br /&gt;
** Type of bootloader depends on type of firmware you want to run, &amp;quot;ZMK&amp;quot;, Arduino using Arduino IDE, Arduino using platformio&lt;br /&gt;
** Risk of accidentally overwriting the bootloader, with UF2 flash offsets sometimes being absolute, sometimes being relative&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:nrf52840-supermini-pinout.png|frame|right|350px|pinout]]&lt;br /&gt;
&lt;br /&gt;
The boards I have are the &amp;quot;promicro&amp;quot; and &amp;quot;supermini&amp;quot;.&lt;br /&gt;
These boards look basically identical hardware-wise.&lt;br /&gt;
&lt;br /&gt;
There is a 4-pad connector to program it using SWD (VDD/SWD/SDC/GND).&lt;br /&gt;
This can be used to write the bootloader for example.&lt;br /&gt;
The pads have a spacing of 1.5mm.&lt;br /&gt;
&lt;br /&gt;
The blue LED appears to flash independently of software, this is probably the charge circuit behaving randomly without a battery present.&lt;br /&gt;
The red LED appears to be under software control.&lt;br /&gt;
&lt;br /&gt;
Pinout/schematic: https://nicekeyboards.com/docs/nice-nano/pinout-schematic&lt;br /&gt;
&lt;br /&gt;
=== bootloader ===&lt;br /&gt;
The INFO_UF2.TXT says (after double-tap reset):&lt;br /&gt;
  UF2 Bootloader 0.6.0 lib/nrfx (v2.0.0) lib/tinyusb (0.10.1-41-gdf0cda2d) lib/uf2 (remotes/origin/configupdate-9-gadbb8c7)&lt;br /&gt;
  Model: nice!nano&lt;br /&gt;
  Board-ID: nRF52840-nicenano&lt;br /&gt;
  SoftDevice: S140 version 6.1.1&lt;br /&gt;
  Date: Jun 19 2021&lt;br /&gt;
&lt;br /&gt;
The CURRENT.UF2 file is 1.4 MB&lt;br /&gt;
&lt;br /&gt;
Kernel log says:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[509372.005339] usb 1-2.3: new full-speed USB device number 96 using xhci_hcd&lt;br /&gt;
[509372.132351] usb 1-2.3: New USB device found, idVendor=239a, idProduct=00b3, bcdDevice= 1.00&lt;br /&gt;
[509372.132361] usb 1-2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[509372.132364] usb 1-2.3: Product: nice!nano&lt;br /&gt;
[509372.132366] usb 1-2.3: Manufacturer: Nice Keyboards&lt;br /&gt;
[509372.132368] usb 1-2.3: SerialNumber: 98D93A272A6CCC7D&lt;br /&gt;
[509372.187474] cdc_acm 1-2.3:1.0: ttyACM0: USB ACM device&lt;br /&gt;
[509372.190177] usb-storage 1-2.3:1.2: USB Mass Storage device detected&lt;br /&gt;
[509372.190467] scsi host3: usb-storage 1-2.3:1.2&lt;br /&gt;
[509373.200470] scsi host3: scsi scan: INQUIRY result too short (5), using 36&lt;br /&gt;
[509373.200481] scsi 3:0:0:0: Direct-Access     Adafruit nRF UF2          1.0  PQ: 0 ANSI: 2&lt;br /&gt;
[509373.200825] sd 3:0:0:0: Attached scsi generic sg0 type 0&lt;br /&gt;
[509373.202317] sd 3:0:0:0: [sdb] 65801 512-byte logical blocks: (33.7 MB/32.1 MiB)&lt;br /&gt;
[509373.202556] sd 3:0:0:0: [sdb] Write Protect is off&lt;br /&gt;
[509373.202559] sd 3:0:0:0: [sdb] Mode Sense: 03 00 00 00&lt;br /&gt;
[509373.202782] sd 3:0:0:0: [sdb] No Caching mode page found&lt;br /&gt;
[509373.202784] sd 3:0:0:0: [sdb] Assuming drive cache: write through&lt;br /&gt;
[509373.296933]  sdb:&lt;br /&gt;
[509373.297002] sd 3:0:0:0: [sdb] Attached SCSI removable disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Working platformio example project for the nice!nano and supermini/promicro nrf52840 clones:&lt;br /&gt;
https://github.com/bertrik/nicenano-example &lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* Nordic technical documentation: https://docs.nordicsemi.com/category/nrf52840-category&lt;br /&gt;
* Here is a wiki full of useful information on specific boards: https://github.com/joric/nrfmicro/wiki&lt;br /&gt;
** Specifically the supermini https://github.com/joric/nrfmicro/wiki/Alternatives#supermini-nrf52840&lt;br /&gt;
* nRFMicro Arduino Core:&lt;br /&gt;
** Meant for integration with Arduino IDE, not platformio!&lt;br /&gt;
** See https://github.com/pdcook/nRFMicro-Arduino-Core&lt;br /&gt;
** Uses https://github.com/NordicSemiconductor/nrfx for NRF52840 specific drivers&lt;br /&gt;
* Platformio support for supermini:&lt;br /&gt;
** Focused on platformio&lt;br /&gt;
** https://github.com/ICantMakeThings/Nicenano-NRF52-Supermini-PlatformIO-Support&lt;br /&gt;
** Bit awkward installation (copy/overwrite files inside existing platformio folder)&lt;br /&gt;
* https://docs.nordicsemi.com/bundle/ncs-3.1.0/page/zephyr/boards/others/promicro_nrf52840/doc/index.html pro-micro information from Nordic Semi&lt;br /&gt;
&lt;br /&gt;
Getting &#039;circuitpython&#039; to work:&lt;br /&gt;
* Here&#039;s a page on making it work on nicenano: https://circuitpython.org/board/nice_nano/&lt;br /&gt;
* HOWEVER, it also says &amp;quot;On nRF boards, CircuitPython 8.2.0 and later require UF2 bootloader version 0.6.1 or later. Older bootloaders cannot load the firmware. See Update UF2 Bootloader below.&amp;quot;. Guess what bootloader came with my board ... 0.6.0&lt;br /&gt;
* They point you to https://github.com/adafruit/Adafruit_nRF52_Bootloader/releases/tag/0.9.2 but now what!?!!!&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=NRF52840&amp;diff=35039</id>
		<title>NRF52840</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=NRF52840&amp;diff=35039"/>
		<updated>2026-02-01T16:23:19Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: more experimentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=NRF52840&lt;br /&gt;
   |Picture=nrf52840-supermini.png&lt;br /&gt;
   |Omschrijving=Running Arduino with platformio on NRF52840&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
This page is about getting inexpensive NRF52840 boards to work with Arduino and platformio.&lt;br /&gt;
&lt;br /&gt;
NRF52840 is a nice platform:&lt;br /&gt;
* low-power&lt;br /&gt;
* inexpensive&lt;br /&gt;
* decent amount of flash (1024k), RAM (256k) and CPU cycles (64 MHz)&lt;br /&gt;
* support various radio protocols like zigbee, ble, thread, enhanced shockburst&lt;br /&gt;
* built-in support for quadrature counting&lt;br /&gt;
* can run arduino too&lt;br /&gt;
&lt;br /&gt;
However the eco-system of inexpensive boards is a complicated landscape:&lt;br /&gt;
* AliExpress sellers offer &amp;quot;promicro&amp;quot; and &amp;quot;supermini&amp;quot; board with unclear characteristics&lt;br /&gt;
* LEDs are sometimes swapped (blue = hardware charge, red = software led?)&lt;br /&gt;
* Various firmware upload interface options (which one to use?):&lt;br /&gt;
** Using nrfutil, sends a .zip file containing various parts, over USB-serial&lt;br /&gt;
** Mass storage UF2, activated using the double-reset&lt;br /&gt;
** SWD debug interface (requires soldering!)&lt;br /&gt;
* Confusing situation regarding bootloaders:&lt;br /&gt;
** Most boards seem to come with a modified version of a bootloader meant for another type of board&lt;br /&gt;
** Type of bootloader depends on type of firmware you want to run, &amp;quot;ZMK&amp;quot;, Arduino using Arduino IDE, Arduino using platformio&lt;br /&gt;
** Risk of accidentally overwriting the bootloader, with UF2 flash offsets sometimes being absolute, sometimes being relative&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:nrf52840-supermini-pinout.png|right|350px|pinout]]&lt;br /&gt;
&lt;br /&gt;
The boards I have are the &amp;quot;promicro&amp;quot; and &amp;quot;supermini&amp;quot;.&lt;br /&gt;
These boards look basically identical hardware-wise.&lt;br /&gt;
&lt;br /&gt;
There is a 4-pad connector to program it using SWD (VDD/SWD/SDC/GND).&lt;br /&gt;
This can be used to write the bootloader for example.&lt;br /&gt;
The pads have a spacing of 1.5mm.&lt;br /&gt;
&lt;br /&gt;
The blue LED appears to flash independently of software, this is probably the charge circuit behaving randomly without a battery present.&lt;br /&gt;
The red LED appears to be under software control.&lt;br /&gt;
&lt;br /&gt;
Pinout/schematic: https://nicekeyboards.com/docs/nice-nano/pinout-schematic&lt;br /&gt;
&lt;br /&gt;
=== bootloader ===&lt;br /&gt;
The INFO_UF2.TXT says (after double-tap reset):&lt;br /&gt;
  UF2 Bootloader 0.6.0 lib/nrfx (v2.0.0) lib/tinyusb (0.10.1-41-gdf0cda2d) lib/uf2 (remotes/origin/configupdate-9-gadbb8c7)&lt;br /&gt;
  Model: nice!nano&lt;br /&gt;
  Board-ID: nRF52840-nicenano&lt;br /&gt;
  SoftDevice: S140 version 6.1.1&lt;br /&gt;
  Date: Jun 19 2021&lt;br /&gt;
&lt;br /&gt;
The CURRENT.UF2 file is 1.4 MB&lt;br /&gt;
&lt;br /&gt;
Kernel log says:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[509372.005339] usb 1-2.3: new full-speed USB device number 96 using xhci_hcd&lt;br /&gt;
[509372.132351] usb 1-2.3: New USB device found, idVendor=239a, idProduct=00b3, bcdDevice= 1.00&lt;br /&gt;
[509372.132361] usb 1-2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[509372.132364] usb 1-2.3: Product: nice!nano&lt;br /&gt;
[509372.132366] usb 1-2.3: Manufacturer: Nice Keyboards&lt;br /&gt;
[509372.132368] usb 1-2.3: SerialNumber: 98D93A272A6CCC7D&lt;br /&gt;
[509372.187474] cdc_acm 1-2.3:1.0: ttyACM0: USB ACM device&lt;br /&gt;
[509372.190177] usb-storage 1-2.3:1.2: USB Mass Storage device detected&lt;br /&gt;
[509372.190467] scsi host3: usb-storage 1-2.3:1.2&lt;br /&gt;
[509373.200470] scsi host3: scsi scan: INQUIRY result too short (5), using 36&lt;br /&gt;
[509373.200481] scsi 3:0:0:0: Direct-Access     Adafruit nRF UF2          1.0  PQ: 0 ANSI: 2&lt;br /&gt;
[509373.200825] sd 3:0:0:0: Attached scsi generic sg0 type 0&lt;br /&gt;
[509373.202317] sd 3:0:0:0: [sdb] 65801 512-byte logical blocks: (33.7 MB/32.1 MiB)&lt;br /&gt;
[509373.202556] sd 3:0:0:0: [sdb] Write Protect is off&lt;br /&gt;
[509373.202559] sd 3:0:0:0: [sdb] Mode Sense: 03 00 00 00&lt;br /&gt;
[509373.202782] sd 3:0:0:0: [sdb] No Caching mode page found&lt;br /&gt;
[509373.202784] sd 3:0:0:0: [sdb] Assuming drive cache: write through&lt;br /&gt;
[509373.296933]  sdb:&lt;br /&gt;
[509373.297002] sd 3:0:0:0: [sdb] Attached SCSI removable disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Working platformio example project for the nice!nano and supermini/promicro nrf52840 clones:&lt;br /&gt;
https://github.com/bertrik/nicenano-example &lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* Nordic technical documentation: https://docs.nordicsemi.com/category/nrf52840-category&lt;br /&gt;
* Here is a wiki full of useful information on specific boards: https://github.com/joric/nrfmicro/wiki&lt;br /&gt;
** Specifically the supermini https://github.com/joric/nrfmicro/wiki/Alternatives#supermini-nrf52840&lt;br /&gt;
* nRFMicro Arduino Core:&lt;br /&gt;
** Meant for integration with Arduino IDE, not platformio!&lt;br /&gt;
** See https://github.com/pdcook/nRFMicro-Arduino-Core&lt;br /&gt;
** Uses https://github.com/NordicSemiconductor/nrfx for NRF52840 specific drivers&lt;br /&gt;
* Platformio support for supermini:&lt;br /&gt;
** Focused on platformio&lt;br /&gt;
** https://github.com/ICantMakeThings/Nicenano-NRF52-Supermini-PlatformIO-Support&lt;br /&gt;
** Bit awkward installation (copy/overwrite files inside existing platformio folder)&lt;br /&gt;
* https://docs.nordicsemi.com/bundle/ncs-3.1.0/page/zephyr/boards/others/promicro_nrf52840/doc/index.html pro-micro information from Nordic Semi&lt;br /&gt;
&lt;br /&gt;
Getting &#039;circuitpython&#039; to work:&lt;br /&gt;
* Here&#039;s a page on making it work on nicenano: https://circuitpython.org/board/nice_nano/&lt;br /&gt;
* HOWEVER, it also says &amp;quot;On nRF boards, CircuitPython 8.2.0 and later require UF2 bootloader version 0.6.1 or later. Older bootloaders cannot load the firmware. See Update UF2 Bootloader below.&amp;quot;. Guess what bootloader came with my board ... 0.6.0&lt;br /&gt;
* They point you to https://github.com/adafruit/Adafruit_nRF52_Bootloader/releases/tag/0.9.2 but now what!?!!!&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=NRF52840&amp;diff=35038</id>
		<title>NRF52840</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=NRF52840&amp;diff=35038"/>
		<updated>2026-02-01T16:20:37Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: mediawiki fix attempt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=NRF52840&lt;br /&gt;
   |Picture=nrf52840-supermini.png&lt;br /&gt;
   |Omschrijving=Running Arduino with platformio on NRF52840&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
This page is about getting inexpensive NRF52840 boards to work with Arduino and platformio.&lt;br /&gt;
&lt;br /&gt;
NRF52840 is a nice platform:&lt;br /&gt;
* low-power&lt;br /&gt;
* inexpensive&lt;br /&gt;
* decent amount of flash (1024k), RAM (256k) and CPU cycles (64 MHz)&lt;br /&gt;
* support various radio protocols like zigbee, ble, thread, enhanced shockburst&lt;br /&gt;
* built-in support for quadrature counting&lt;br /&gt;
* can run arduino too&lt;br /&gt;
&lt;br /&gt;
However the eco-system of inexpensive boards is a complicated landscape:&lt;br /&gt;
* AliExpress sellers offer &amp;quot;promicro&amp;quot; and &amp;quot;supermini&amp;quot; board with unclear characteristics&lt;br /&gt;
* LEDs are sometimes swapped (blue = hardware charge, red = software led?)&lt;br /&gt;
* Various firmware upload interface options (which one to use?):&lt;br /&gt;
** Using nrfutil, sends a .zip file containing various parts, over USB-serial&lt;br /&gt;
** Mass storage UF2, activated using the double-reset&lt;br /&gt;
** SWD debug interface (requires soldering!)&lt;br /&gt;
* Confusing situation regarding bootloaders:&lt;br /&gt;
** Most boards seem to come with a modified version of a bootloader meant for another type of board&lt;br /&gt;
** Type of bootloader depends on type of firmware you want to run, &amp;quot;ZMK&amp;quot;, Arduino using Arduino IDE, Arduino using platformio&lt;br /&gt;
** Risk of accidentally overwriting the bootloader, with UF2 flash offsets sometimes being absolute, sometimes being relative&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:nrf52840-supermini-pinout.png|right|thumb|350px|pinout]]&lt;br /&gt;
&lt;br /&gt;
The boards I have are the &amp;quot;promicro&amp;quot; and &amp;quot;supermini&amp;quot;.&lt;br /&gt;
These boards look basically identical hardware-wise.&lt;br /&gt;
&lt;br /&gt;
There is a 4-pad connector to program it using SWD (VDD/SWD/SDC/GND).&lt;br /&gt;
This can be used to write the bootloader for example.&lt;br /&gt;
The pads have a spacing of 1.5mm.&lt;br /&gt;
&lt;br /&gt;
The blue LED appears to flash independently of software, this is probably the charge circuit behaving randomly without a battery present.&lt;br /&gt;
The red LED appears to be under software control.&lt;br /&gt;
&lt;br /&gt;
Pinout/schematic: https://nicekeyboards.com/docs/nice-nano/pinout-schematic&lt;br /&gt;
&lt;br /&gt;
=== bootloader ===&lt;br /&gt;
The INFO_UF2.TXT says (after double-tap reset):&lt;br /&gt;
  UF2 Bootloader 0.6.0 lib/nrfx (v2.0.0) lib/tinyusb (0.10.1-41-gdf0cda2d) lib/uf2 (remotes/origin/configupdate-9-gadbb8c7)&lt;br /&gt;
  Model: nice!nano&lt;br /&gt;
  Board-ID: nRF52840-nicenano&lt;br /&gt;
  SoftDevice: S140 version 6.1.1&lt;br /&gt;
  Date: Jun 19 2021&lt;br /&gt;
&lt;br /&gt;
The CURRENT.UF2 file is 1.4 MB&lt;br /&gt;
&lt;br /&gt;
Kernel log says:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[509372.005339] usb 1-2.3: new full-speed USB device number 96 using xhci_hcd&lt;br /&gt;
[509372.132351] usb 1-2.3: New USB device found, idVendor=239a, idProduct=00b3, bcdDevice= 1.00&lt;br /&gt;
[509372.132361] usb 1-2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[509372.132364] usb 1-2.3: Product: nice!nano&lt;br /&gt;
[509372.132366] usb 1-2.3: Manufacturer: Nice Keyboards&lt;br /&gt;
[509372.132368] usb 1-2.3: SerialNumber: 98D93A272A6CCC7D&lt;br /&gt;
[509372.187474] cdc_acm 1-2.3:1.0: ttyACM0: USB ACM device&lt;br /&gt;
[509372.190177] usb-storage 1-2.3:1.2: USB Mass Storage device detected&lt;br /&gt;
[509372.190467] scsi host3: usb-storage 1-2.3:1.2&lt;br /&gt;
[509373.200470] scsi host3: scsi scan: INQUIRY result too short (5), using 36&lt;br /&gt;
[509373.200481] scsi 3:0:0:0: Direct-Access     Adafruit nRF UF2          1.0  PQ: 0 ANSI: 2&lt;br /&gt;
[509373.200825] sd 3:0:0:0: Attached scsi generic sg0 type 0&lt;br /&gt;
[509373.202317] sd 3:0:0:0: [sdb] 65801 512-byte logical blocks: (33.7 MB/32.1 MiB)&lt;br /&gt;
[509373.202556] sd 3:0:0:0: [sdb] Write Protect is off&lt;br /&gt;
[509373.202559] sd 3:0:0:0: [sdb] Mode Sense: 03 00 00 00&lt;br /&gt;
[509373.202782] sd 3:0:0:0: [sdb] No Caching mode page found&lt;br /&gt;
[509373.202784] sd 3:0:0:0: [sdb] Assuming drive cache: write through&lt;br /&gt;
[509373.296933]  sdb:&lt;br /&gt;
[509373.297002] sd 3:0:0:0: [sdb] Attached SCSI removable disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Working platformio example project for the nice!nano and supermini/promicro nrf52840 clones:&lt;br /&gt;
https://github.com/bertrik/nicenano-example &lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* Nordic technical documentation: https://docs.nordicsemi.com/category/nrf52840-category&lt;br /&gt;
* Here is a wiki full of useful information on specific boards: https://github.com/joric/nrfmicro/wiki&lt;br /&gt;
** Specifically the supermini https://github.com/joric/nrfmicro/wiki/Alternatives#supermini-nrf52840&lt;br /&gt;
* nRFMicro Arduino Core:&lt;br /&gt;
** Meant for integration with Arduino IDE, not platformio!&lt;br /&gt;
** See https://github.com/pdcook/nRFMicro-Arduino-Core&lt;br /&gt;
** Uses https://github.com/NordicSemiconductor/nrfx for NRF52840 specific drivers&lt;br /&gt;
* Platformio support for supermini:&lt;br /&gt;
** Focused on platformio&lt;br /&gt;
** https://github.com/ICantMakeThings/Nicenano-NRF52-Supermini-PlatformIO-Support&lt;br /&gt;
** Bit awkward installation (copy/overwrite files inside existing platformio folder)&lt;br /&gt;
* https://docs.nordicsemi.com/bundle/ncs-3.1.0/page/zephyr/boards/others/promicro_nrf52840/doc/index.html pro-micro information from Nordic Semi&lt;br /&gt;
&lt;br /&gt;
Getting &#039;circuitpython&#039; to work:&lt;br /&gt;
* Here&#039;s a page on making it work on nicenano: https://circuitpython.org/board/nice_nano/&lt;br /&gt;
* HOWEVER, it also says &amp;quot;On nRF boards, CircuitPython 8.2.0 and later require UF2 bootloader version 0.6.1 or later. Older bootloaders cannot load the firmware. See Update UF2 Bootloader below.&amp;quot;. Guess what bootloader came with my board ... 0.6.0&lt;br /&gt;
* They point you to https://github.com/adafruit/Adafruit_nRF52_Bootloader/releases/tag/0.9.2 but now what!?!!!&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35037</id>
		<title>User:Bertrik Sikken</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35037"/>
		<updated>2026-01-27T19:24:36Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Meshcore as citizen science data transport */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Smoel&lt;br /&gt;
 |Name=Bertrik Sikken&lt;br /&gt;
 |Nick=bertrik&lt;br /&gt;
 |Tagline=heb ik niet&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You can reach me at [mailto:bertrik@sikken.nl bertrik@sikken.nl] or [mailto:bertrik@gmail.com bertrik@gmail.com].&lt;br /&gt;
&lt;br /&gt;
Studied Electrical Engineering at Twente University.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Main interests:&lt;br /&gt;
* reverse-engineering things (USB stuff, mp3 players), worked on http://rockbox.org (sansa clip players)&lt;br /&gt;
* studying bats and making electronics for recording/listening to bat sounds&lt;br /&gt;
* radio stuff, in particular software-defined radio, LoRa networks&lt;br /&gt;
* citizen science and open data (particulate matter measurement, noise, water quality)&lt;br /&gt;
* energy-related stuff, visualisation&lt;br /&gt;
&lt;br /&gt;
Projects I work(ed) on ([https://revspace.nl/index.php?title=User:Bertrik_Sikken&amp;amp;action=purge refresh]):&lt;br /&gt;
{{#ask:[[Category:Project]][[Project Contact::bertrik]]&lt;br /&gt;
|?Project Status&lt;br /&gt;
|headers=show&lt;br /&gt;
|link=all&lt;br /&gt;
|order=ASC,ASC&lt;br /&gt;
|sort=Project Status,Project Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project ideas ==&lt;br /&gt;
[[File:always10oclock.jpg|right]]&lt;br /&gt;
[[File:idea.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas I&#039;m thinking about, but have not fully developed into an actual project yet.&lt;br /&gt;
&lt;br /&gt;
https://pine64.com/product/128mb-ox64-sbc-available-on-december-2-2022/&lt;br /&gt;
&lt;br /&gt;
=== Meshcore as citizen science data transport ===&lt;br /&gt;
Meshcore is basically a network of repeaters for lora messages with a specific setting.&lt;br /&gt;
The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* header enabled &lt;br /&gt;
* sync word XXXX&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
Dissection code: https://github.com/folkertvanheusden/meshcore-store/blob/master/utils/dissect.py&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
* Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
* When the discovery packet reaches a special internet-connected gateway, the backend software receives it and returns a kind of acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
=== investigate thread/matter ===&lt;br /&gt;
Matter/thread is the new IKEA standard for home automation thins apparently. &lt;br /&gt;
Thread is the wireless protocol, matter is a home automation protocol running on top of thread.&lt;br /&gt;
&lt;br /&gt;
I have a couple of nrf52840, these are good in doing thread.&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* check out openthread&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/openthread/openthread.git&lt;br /&gt;
cd openthread&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Prepare development environment:&lt;br /&gt;
  scripts/bootstrap&lt;br /&gt;
* Build it:&lt;br /&gt;
  ./script/build nrf52840 UART_trans -DOT_LOG_LEVEL=OT_LOG_LEVEL_INFO&lt;br /&gt;
&lt;br /&gt;
Thread on ESP32:&lt;br /&gt;
* on ESP32 C6 https://gist.github.com/gtxaspec/d26198daadfb0a8b0a0edeae2d3fd58f&lt;br /&gt;
* https://github.com/espressif/esp-thread-br&lt;br /&gt;
* https://github.com/espressif/esp-idf/tree/master/examples/openthread/ot_rcp&lt;br /&gt;
&lt;br /&gt;
=== action lsc stekker ===&lt;br /&gt;
https://keetsupport.nl/2024/03/20/how-to-flash-lsc-power-plug-with-esphome/&lt;br /&gt;
&lt;br /&gt;
https://community.home-assistant.io/t/detailed-guide-on-how-to-flash-the-new-tuya-beken-chips-with-openbk7231t/437276&lt;br /&gt;
&lt;br /&gt;
=== sipeed maix dock ===&lt;br /&gt;
Bought this a couple of years ago. Get familiar with this board.&lt;br /&gt;
Can I run a chess program on this, for example?&lt;br /&gt;
&lt;br /&gt;
* https://wiki.sipeed.com/soft/maixpy/en/develop_kit_board/maix_dock.html&lt;br /&gt;
&lt;br /&gt;
=== rfid keyfob ===&lt;br /&gt;
* aliexpress page: https://nl.aliexpress.com/item/1005009569496736.html&lt;br /&gt;
* firmware github: &lt;br /&gt;
** https://github.com/RfidResearchGroup/ChameleonUltra&lt;br /&gt;
** https://github.com/GameTec-live/ChameleonUltraGUI&lt;br /&gt;
&lt;br /&gt;
=== advanced lidars for bat detection ===&lt;br /&gt;
livox:&lt;br /&gt;
* github page https://github.com/Livox-SDK/Livox-SDK/tree/master&lt;br /&gt;
* web page: https://www.livoxtech.com/&lt;br /&gt;
&lt;br /&gt;
=== cubecell meshtastic motion detector ===&lt;br /&gt;
I have a cubecell AB01 board.&lt;br /&gt;
This board is focused on low power, has a connection to attach a solar panel and has a lora radio.&lt;br /&gt;
Relatively small amount of RAM, barely enough to run a LoRaWAN stack but probably plenty to run meshtastic&lt;br /&gt;
&lt;br /&gt;
The plan is to build a simple motion detector from this (using a PIR).&lt;br /&gt;
The PIR can wake up the board from low-power, or a timer can wake it periodically.&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/HelTecAutomation/CubeCell-Arduino/tree/master/libraries/Basics/examples/LowPower&lt;br /&gt;
&lt;br /&gt;
=== configure multitech outdoor gateway ===&lt;br /&gt;
https://www.multitech.net/developer/products/multiconnect-conduit-platform/basestation/&lt;br /&gt;
&lt;br /&gt;
https://multitech.com/product/multitech-conduit-mtcdt-246a-868-eu-gb/&lt;br /&gt;
&lt;br /&gt;
emergency procedure:&lt;br /&gt;
https://www.multitech.net/developer/software/mlinux/using-mlinux/flashing-mlinux-firmware-for-conduit/&lt;br /&gt;
&lt;br /&gt;
=== esp32 wtf ===&lt;br /&gt;
* https://forum.arduino.cc/t/ttgo-lilygo-lora-esp32-26mhz-problem/1353750&lt;br /&gt;
* &amp;quot;26 MHz crystal has been deprecated&amp;quot; https://github.com/espressif/arduino-esp32/issues/10117&lt;br /&gt;
&lt;br /&gt;
=== kakofonie counter ===&lt;br /&gt;
Sample room audio, use neural network to distinguish voices to estimate number of people talking in the past 30 seconds or so.&lt;br /&gt;
Show this number on some kind of display, publish it to MQTT, make a nice graph of it.&lt;br /&gt;
&lt;br /&gt;
Stuff to figure out:&lt;br /&gt;
* this is called &#039;speaker diarization&#039;&lt;br /&gt;
* can it run on an ESP32?&lt;br /&gt;
* make a prototype&lt;br /&gt;
&lt;br /&gt;
=== hypno toad ===&lt;br /&gt;
Put these LEDS https://nl.aliexpress.com/item/1005007583528891.html into https://www.action.com/nl-nl/p/2560347/solar-tuinbeeldje/&lt;br /&gt;
&lt;br /&gt;
Turns out that the default circuit is really basic and output a rough step-up waveform to the LED.&lt;br /&gt;
The self-fading LEDs don&#039;t work very well with that.&lt;br /&gt;
&lt;br /&gt;
Also, putting some IPA on hotglue makes it release really easy.&lt;br /&gt;
&lt;br /&gt;
=== wasbeer / kat classifier ===&lt;br /&gt;
ESP32 with resnet50 neural net to distinguish house cats from other animals, see also:&lt;br /&gt;
* https://ieeexplore.ieee.org/document/10556848/&lt;br /&gt;
&lt;br /&gt;
=== Nespresso brew counter ===&lt;br /&gt;
Several hacker spaces have one of these Nespresso cup coffee makers, but there&#039;s no obvious easy way to monitor usage (monitor ALL the things!).&lt;br /&gt;
Inspired by https://hackaday.com/2021/04/25/arduino-mkr-makes-nespresso-monitoring-easy/ this idea is making an even simpler nespresso monitor,&lt;br /&gt;
using an inexpensive WiFi enabled ESP8266 with an ubiquitous I2S microphone such as the INMP441. &lt;br /&gt;
&lt;br /&gt;
Use this sound monitoring project:&lt;br /&gt;
https://github.com/aleiei/ESP8266-BUG-I2S-MIC&lt;br /&gt;
and turn it into a WiFi connected brew counter.&lt;br /&gt;
&lt;br /&gt;
Software for getting microphone data from an ESP8266/I2S mic into Linux https://github.com/bertrik/EspMicServer&lt;br /&gt;
Nespresso sound is typically 50 Hz with overtones.&lt;br /&gt;
In a recording with the ESP8266, it appears that oddly the 17th harmonic (around 850 Hz) is quite strong.&lt;br /&gt;
&lt;br /&gt;
The plan in the short term is this:&lt;br /&gt;
* apply a gentle IIR filter to subtract any DC bias from the microphone signal&lt;br /&gt;
* calculate autocovariance at offsets 0 and 20 ms (inverse of 50 Hz), representing the total energy and the energy at 50 Hz respectively&lt;br /&gt;
* compare amplitudes to decide about presence of 50 Hz signal, e.g. calculate ratio in dB&lt;br /&gt;
* use this to count the length of time that a 50 Hz signal is heard (increments of 100 ms or so)&lt;br /&gt;
* decide about none / espresso / lungo based on time&lt;br /&gt;
&lt;br /&gt;
Might even integrate with esphome / home assistant later.&lt;br /&gt;
&lt;br /&gt;
=== Remote bat box monitor ===&lt;br /&gt;
Idea:&lt;br /&gt;
* goal: check if remote bat boxes are occupied and identify the species&lt;br /&gt;
* challenges:&lt;br /&gt;
** connectivity: need to transport images/videos (no LoRaWAN), possibly out of range of mobile data networks&lt;br /&gt;
** autonomy: cannot reach the bat box once installed&lt;br /&gt;
** power: no fixed power connection, so probably needs a battery + solar panel&lt;br /&gt;
* design&lt;br /&gt;
** wake up every hour, take a picture, go to sleep, upload photos/videos once per day&lt;br /&gt;
** run from batteries, recharge by solar, rules of thumb&lt;br /&gt;
*** batteries should last for about 10 days&lt;br /&gt;
*** battery should be able to charge in 1 day&lt;br /&gt;
*** consider only 10% of peak solar power&lt;br /&gt;
** KPN &amp;quot;4G-op-zee&amp;quot; somewhat confusing article: https://www.kpn.com/zakelijk/mobiel/roaming/noordzee&lt;br /&gt;
* hardware&lt;br /&gt;
** main processor: raspberry pi zero&lt;br /&gt;
*** raspberry pi power consumption overview: https://www.pidramble.com/wiki/benchmarks/power-consumption&lt;br /&gt;
** this hat to wake up the main CPU: https://www.waveshare.com/wiki/Power_Management_HAT_(B) sold at https://www.kiwi-electronics.com/en/power-management-hat-for-raspberry-pi-with-rtc-and-rp2040-mcu-11373&lt;br /&gt;
&lt;br /&gt;
=== KNMI API ===&lt;br /&gt;
Get familiar with https://developer.dataplatform.knmi.nl/open-data-api&lt;br /&gt;
&lt;br /&gt;
=== Grid frequency measurer with web page ===&lt;br /&gt;
See https://github.com/bertrik/GridFrequency&lt;br /&gt;
SSE source is gridfrequency.local/events&lt;br /&gt;
&lt;br /&gt;
=== WeAct CH55x board ===&lt;br /&gt;
Cheap little boards, using a similar chip as used in USB-serial converters.&lt;br /&gt;
&lt;br /&gt;
The hardware&lt;br /&gt;
https://github.com/WeActStudio/WeActStudio.CH552CoreBoard&lt;br /&gt;
&lt;br /&gt;
Flashing it:&lt;br /&gt;
https://hackaday.io/page/137447-flashing-the-ch552-dev-board-from-the-command-line&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://hackaday.io/project/198238-more-weact-ch5xx&lt;br /&gt;
* https://community.platformio.org/t/manually-adding-support-for-ch55x-controller-by-adding-existing-ardunio-core/41138&lt;br /&gt;
&lt;br /&gt;
=== Zigbee device with esp32 ===&lt;br /&gt;
See https://github.com/P-R-O-C-H-Y/arduino-esp32/blob/8169a434c3e46e1bb7711ebcc04f27267db2093c/libraries/ESP32/examples/Zigbee/Zigbee_Light_Bulb/Zigbee_Light_Bulb.ino&lt;br /&gt;
&lt;br /&gt;
See https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Zigbee&lt;br /&gt;
&lt;br /&gt;
Espressif32 arduino platform git: https://github.com/platformio/platform-espressif32&lt;br /&gt;
&lt;br /&gt;
=== Cameratoezicht in Gouda ===&lt;br /&gt;
Gemeente Gouda publiceert een lijst van camera&#039;s in Gouda, zie&lt;br /&gt;
https://gis.gouda.nl/nl/app/Basisviewer_open#!eAGT8uRiNBRy4ZIRYFKSyKkssjJwdzFxNDMz8TKKsLC0cnb0dQ1y5FIByirgkg3xd43ydPYIAQBXGBFm&lt;br /&gt;
&lt;br /&gt;
Aanmelden (semi-automatisch) bij bijvoorbeeld [https://mapcomplete.org/surveillance Surveillance-under-surveillance] ?&lt;br /&gt;
&lt;br /&gt;
=== SolarEdge ===&lt;br /&gt;
Interact with the solar edge api for PV installations.&lt;br /&gt;
&lt;br /&gt;
https://developers.solaredge.com/&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/solaredge-api&lt;br /&gt;
&lt;br /&gt;
=== Stookalert ===&lt;br /&gt;
Idee: gekleurd lampje dat aangeeft of er op dit moment een stookalert actief is&lt;br /&gt;
&lt;br /&gt;
Implementatie:&lt;br /&gt;
* kijk m.b.v. WiFi locatieservice in welke provincie je je bevindt&lt;br /&gt;
* haal JSON op bij https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* toon de bijbehorende kleur op het lampje&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
* Officiele pagina: https://www.atlasleefomgeving.nl/stookwijzer&lt;br /&gt;
* Achterliggende JSON met toestand per provincie: https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* Er moet ook nog ergens een API zijn die fijnmaziger aangeeft wat de toestand is ...&lt;br /&gt;
&lt;br /&gt;
=== Display of current electricity usage ===&lt;br /&gt;
I have a [https://www.zuidwijk.com/product/slimmelezer-plus/ slimme lezer] connected to the P1 port of my smart electricity meter.&lt;br /&gt;
The default firmware exposes meter readings using an event stream (SSE) at http://slimmelezer.local/events&lt;br /&gt;
&lt;br /&gt;
So for example, you can read this with curl:&lt;br /&gt;
  curl http://slimmelezer.local/events&lt;br /&gt;
With result:&lt;br /&gt;
  event: state&lt;br /&gt;
  data: {&amp;quot;id&amp;quot;:&amp;quot;sensor-power_consumed_phase_1&amp;quot;,&amp;quot;value&amp;quot;:0.046,&amp;quot;state&amp;quot;:&amp;quot;0.046 kW&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Specification of SSE: https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
&lt;br /&gt;
What I would like to do is to read these events and control a simple display to display  the current usage number.&lt;br /&gt;
&lt;br /&gt;
=== Participating in ultrasonic sound project ===&lt;br /&gt;
https://bat-migration-europe.netlify.app/project/&lt;br /&gt;
&lt;br /&gt;
Use an audiomoth for this.&lt;br /&gt;
&lt;br /&gt;
=== ESP32 C3 ===&lt;br /&gt;
* [https://www.espressif.com/en/products/socs/esp32-c3 processor page]&lt;br /&gt;
* [https://wiki.luatos.com/chips/esp32c3/index.html luatos basic esp32 c3 board]&lt;br /&gt;
&lt;br /&gt;
=== Flexible LED ticker ===&lt;br /&gt;
Ordered a flexible 32x8 RGB LED display:&lt;br /&gt;
https://nl.aliexpress.com/item/4001296811800.html&lt;br /&gt;
&lt;br /&gt;
Matching diffuser to be 3D printed:&lt;br /&gt;
https://www.thingiverse.com/thing:1903744&lt;br /&gt;
&lt;br /&gt;
=== Washing machine API ===&lt;br /&gt;
https://tratt.net/laurie/blog/2023/displaying_my_washing_machines_remaining_time_with_curl_jq_pizauth.html&lt;br /&gt;
&lt;br /&gt;
=== TinyML ===&lt;br /&gt;
Investigate TinyML, see https://www.tinyml.org/&lt;br /&gt;
Apparently can run on a RP2040 (raspi pi pico).&lt;br /&gt;
&lt;br /&gt;
https://www.hackster.io/mjrobot/esp32-cam-tinyml-image-classification-fruits-vs-veggies-4ab970&lt;br /&gt;
&lt;br /&gt;
=== Bat box busy signal ===&lt;br /&gt;
My brother built little pyramid &#039;blinkies&#039;: solar cell + Lithium-supercapacitor + harvesting circuit + LED encased in clear expoxy.&lt;br /&gt;
&lt;br /&gt;
Can we add a low-power PIR sensor to this, and make a blinky that blinks if movement was detected by the PIR in the past hour?&lt;br /&gt;
&lt;br /&gt;
=== Super tiny RFID ===&lt;br /&gt;
See https://www.sparkfun.com/products/16464 an almost sand grain size RFID chip, 1.25mmx1.25mmx0.55mm&lt;br /&gt;
&lt;br /&gt;
The accompanying reader &amp;quot;M6E Nano&amp;quot; is still quite expensive at $235.95 : https://www.sparkfun.com/products/14066&lt;br /&gt;
&lt;br /&gt;
Uses the MuRata LXMSJZNCMF-198:&lt;br /&gt;
&amp;quot;This product can be used as an ultra small tag and this can be&lt;br /&gt;
fit on any metal objects, non-metal objects, as well as&lt;br /&gt;
embedding into any objects by glue or adhesive and so on.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See also: ISO18000-63 and EPC global Gen2(v2)&lt;br /&gt;
&lt;br /&gt;
Specification:&lt;br /&gt;
* https://www.gs1.org/standards/rfid/uhf-air-interface-protocol&lt;br /&gt;
&lt;br /&gt;
=== TheThingsNetwork-Sondehub bridge ===&lt;br /&gt;
Uploads balloon telemetry to sondehub.&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/ttnhabbridge/issues/6&lt;br /&gt;
&lt;br /&gt;
=== Actually smart boiler ===&lt;br /&gt;
The boiler for hot water is about half of my electricity bill.&lt;br /&gt;
The idea is to use/build a smart switch that switches it on at time when electricity prices are lowest.&lt;br /&gt;
&lt;br /&gt;
Currently have a &amp;quot;Slimme boiler module&amp;quot; from Eneco, which is *not* actually smart,&lt;br /&gt;
since it allows me no control whatsoever when it switches on (besides cutting the power in the meterkast).&lt;br /&gt;
For example, it will switch on mid-day when my price is high and eneco&#039;s price is low, perhaps good for Eneco, not for me. &lt;br /&gt;
Apparently, they even received a [https://nieuws.eneco.nl/slim-apparaatje-bij-boiler-vangt-pieken-wind--en-zonnestroom-op/ subsidy] for this.&lt;br /&gt;
&lt;br /&gt;
A boiler is a pretty big load, about 3 kW, but it is not inductive.&lt;br /&gt;
&lt;br /&gt;
Alternatives:&lt;br /&gt;
* https://www.shelly.cloud/en-nl/products/product-overview/shelly-plus-1-pm-2-pack/shelly-plus-1-pm&lt;br /&gt;
* https://www.solyxenergy.nl/solar-iboost/ to store excess solar energy in hot water, might also be useful for just controlling a boiler to use cheaper rates&lt;br /&gt;
* tuya smartplug, like https://www.wifilampkoning.nl/merken-slimme-verlichting/tuya/tuya-enkele-smartplug-met-energiemeting ?&lt;br /&gt;
* tuya 20A smart plug: https://nl.aliexpress.com/item/1005003347568206.html&lt;br /&gt;
&lt;br /&gt;
=== Receiving gas meters ===&lt;br /&gt;
Apparently gas meters send gas consumption data to the slimme meter using a wireless link in the 868 MHz band.&lt;br /&gt;
Probably just FSK at 38.4, as mentioned here: https://a35.veron.nl/nieuwe-elektra-en-gasmeters/&lt;br /&gt;
&lt;br /&gt;
Interesting leads:&lt;br /&gt;
* https://github.com/stef/smeter&lt;br /&gt;
* https://www.rtl-sdr.com/reading-household-wireless-utility-meters-with-an-rtl-sdr-and-plotting-the-data-in-home-automation-software/&lt;br /&gt;
* https://github.com/bemasher/rtlamr&lt;br /&gt;
&lt;br /&gt;
=== Multi-network wifi manager ===&lt;br /&gt;
Figure out or create software so that ESP8266/ESP32 wifi manager can use multiple networks to connect (not just one),&lt;br /&gt;
so it allowing storing credentials for more than one network. For example, the network at home, the hacker space, at work.&lt;br /&gt;
Instead of reconfiguring the wifi manager for each network, you just *add* your credentials (and the existing credentials&lt;br /&gt;
are not replaced).&lt;br /&gt;
&lt;br /&gt;
See https://github.com/folkertvanheusden/M.A.X.X&lt;br /&gt;
&lt;br /&gt;
Interesting candidates:&lt;br /&gt;
* https://registry.platformio.org/libraries/martinverges/ESP32%20Wifi%20Manager wifi manager for ESP32, has a REST API for managing wifi network, but is incomplete in the sense that you need to write your own code (e.g. javascript) to actually *use* its API&lt;br /&gt;
* https://github.com/arduino-libraries/Arduino_MultiWiFi is the arduino multi wifi library, to allow connecting to multiple different WiFi networks, but it is not a wifi manager, that starts a captive portal, etc&lt;br /&gt;
&lt;br /&gt;
=== Automated bat counting ===&lt;br /&gt;
Can we automatically count the number of bats from the image of a webcam mounted in a bat colony?&lt;br /&gt;
Perhaps using some kind of AI or machine learning algorithm?&lt;br /&gt;
&lt;br /&gt;
The image in question:&lt;br /&gt;
https://stofradar.nl/coenecoop/&lt;br /&gt;
&lt;br /&gt;
=== Use TheThingsIndoorGateway as Helium/ThingSix hotspot ===&lt;br /&gt;
I have a spare TTIG that could perhaps be used as a Helium gateway, investigate what is possible.&lt;br /&gt;
&lt;br /&gt;
One possiblity is to capture the gateway traffic from the TTN gateway events API, convert uplink data to a format that the Helium network understands and forward it.&lt;br /&gt;
I don&#039;t really care about the Helium crypto tokens, this is just for fun and science.&lt;br /&gt;
&lt;br /&gt;
What I definitely can do:&lt;br /&gt;
* Capture data from the TTN gateway events API, convert it back to Semtech UP format and forward it somewhere to Helium (just not sure where!)&lt;br /&gt;
* See also my https://github.com/bertrik/ttn-gateway-collector project which contains an initial implementation of TTN-to-UDP conversion&lt;br /&gt;
&lt;br /&gt;
Showstoppers:&lt;br /&gt;
* If you want to be a gateway on the Helium network, you have to *pay Helium*! Obviously I don&#039;t want that, I just want to share data to improve *their* network. &lt;br /&gt;
&lt;br /&gt;
Open work:&lt;br /&gt;
* Investigate if Helium has an open uplink API for their hotspots, if so study it etc, without paying the gateway fee&lt;br /&gt;
* Investigate if Thingsix has an open uplink API for their hotspots, if so study it etc, without paying any gateway fee&lt;br /&gt;
* Investigate if Thingsix is just another Helium, with weird crypto money&lt;br /&gt;
&lt;br /&gt;
Interesting stuff:&lt;br /&gt;
* https://docs.helium.com/use-the-network/setup-a-packet-forwarder unfortunately the link to setting up the &#039;light hotspot client&#039; does not work!&lt;br /&gt;
* https://docs.helium.com/mine-hnt/light-hotspots/&lt;br /&gt;
* https://thingsix.com/&lt;br /&gt;
&lt;br /&gt;
=== Adding BLE GATT interface to sensors ===&lt;br /&gt;
The GATT specification allows measurement properties to be defined and transferred continuously over Bluetooth low-energy.&lt;br /&gt;
&lt;br /&gt;
With GATT you can define a collection of properties (e.g. measurement items like temperature/humidity/particulate matter/noise, etc)&lt;br /&gt;
organised in a simple structure of a BLE service.&lt;br /&gt;
The &#039;notification&#039; method allows you to basically push the data continuously to a connected host, e.g. a smart phone.&lt;br /&gt;
&lt;br /&gt;
Services collects characteristic, a characteristic has values with units.&lt;br /&gt;
Each of these (service, characteristic, unit) have their own unique &amp;quot;UUID&amp;quot;.&lt;br /&gt;
This is described in the so-called [https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20Numbers%20Document.pdf 16-bit UUID numbers document]&lt;br /&gt;
&lt;br /&gt;
Interesting stuff in GATT:&lt;br /&gt;
* See GATT_Specification_Supplement_v5 paragraph 3.151, it has a noise characteristic with 1 dB resolution.&lt;br /&gt;
* 0x27C3 is the GATT *unit* for sound pressure&lt;br /&gt;
* 0x181A is the GATT environmental sensing *service*, document name &amp;quot;ESP_V1.0.0.pdf&amp;quot;&lt;br /&gt;
* 0x2A6E is the GATT Characteristic and Object Type for temperature&lt;br /&gt;
* 0x2A6F is the GATT Characteristic and Object Type for humidity&lt;br /&gt;
* 0x2BD5 is the GATT Characteristic and Object Type for Particulate Matter - PM1 Concentration&lt;br /&gt;
* 0x2BD6 is the GATT Characteristic and Object Type for Particulate Matter - PM2.5 Concentration&lt;br /&gt;
* 0x2BD7 is the GATT Characteristic and Object Type for Particulate Matter - PM10 Concentration&lt;br /&gt;
* Unfortunately I cannot find a characteristic for carbon-dioxide (CO2) in the BLE GATT unit document&lt;br /&gt;
&lt;br /&gt;
See also https://programmaticponderings.com/2020/08/04/getting-started-with-bluetooth-low-energy-ble-and-generic-attribute-profile-gatt-specification-for-iot/&lt;br /&gt;
&lt;br /&gt;
=== Reverse engineering XS-8217 bluetooth air quality meter ===&lt;br /&gt;
This is a thing that measures CO2, humidity, temperature, TVOC and formaldehyde.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.liutyi.info/display/CO2/ZN-2CO3+Inside&lt;br /&gt;
&lt;br /&gt;
This teardown looks a lot like my sensor: https://www.youtube.com/watch?v=APnjhMrJChI&lt;br /&gt;
Mine contains a &amp;quot;TPM-300A&amp;quot; sensor for measuring VOC.&lt;br /&gt;
&lt;br /&gt;
It has a bluetooth interface, device name is XS-8217.&lt;br /&gt;
It has a BLE GATT profile, with the following services&lt;br /&gt;
* service 0xC760&lt;br /&gt;
** characteristic 0xC762 (WRITE)&lt;br /&gt;
** characteristic 0xC761 (NOTIFY)&lt;br /&gt;
*** example data: 0x23 0x06 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
*** example data: 0x23 0x08 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
*** data shown on screen was approximately: CO2=418ppm, HCHO=0.003mg/m3, TVOC=0.013mg/m3, temp=24degC, humi=35%&lt;br /&gt;
&lt;br /&gt;
So data in the characteristic 0xC761 seems to have a 4 byte constant header:&lt;br /&gt;
* 0x23&lt;br /&gt;
* length byte&lt;br /&gt;
&lt;br /&gt;
Then we have for the first message: 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0xF1 is temperature in 0.1 degree Celcius most likely (24.1)&lt;br /&gt;
* 0x00 is ...&lt;br /&gt;
* 0x23 is humidity most likely (35)&lt;br /&gt;
* 0x65 is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
And for the second message: 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0x01 0x9A is the CO2 concentration (410)&lt;br /&gt;
* 0x00 0x0A is TVOC most likely (10)&lt;br /&gt;
* 0x00 0x03 is HCHO most likely (3)&lt;br /&gt;
* 0x0E is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
=== ribbon tweeter for bat audio ===&lt;br /&gt;
Someone gave me this idea:&lt;br /&gt;
Use a ribbon tweeter like this for playing back bat audio:&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/4000973201791.html&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/1005002565880660.html&amp;lt;/s&amp;gt;&lt;br /&gt;
https://nl.aliexpress.com/item/1005002635086050.html&lt;br /&gt;
&lt;br /&gt;
The frequency spectrum shows no sign of dropping off at 20 kHz.&lt;br /&gt;
&lt;br /&gt;
=== 3d glasses ===&lt;br /&gt;
I got some 2nd hand 3d glasses, they look exactly like these ones:&lt;br /&gt;
* GH-15 https://www.dhgate.com/product/g15-dlp-3d-active-shutter-glasses-96-144hz/213983026.html&lt;br /&gt;
* Sintron https://www.amazon.de/Sintron-Kompatibel-TDG-BT500A-TDG-BT400A-Deutschland/dp/B015PCWMZ8&lt;br /&gt;
The common name appears to be &amp;quot;G15-DLP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A tear-down here:&lt;br /&gt;
* https://blog.danman.eu/3d-shutter-glasses-teardown/&lt;br /&gt;
&lt;br /&gt;
Interesting documents:&lt;br /&gt;
* http://cmst.curtin.edu.au/wp-content/uploads/sites/4/2016/05/2012-28-woods-helliwell-cross-compatibility_of_shutter_glasses.pdf&lt;br /&gt;
* http://cmst.curtin.edu.au/local/docs/pubs/2011-17-woods-helliwell-3D-Sync-IR.pdf&lt;br /&gt;
&lt;br /&gt;
Someone claims he got something to work with some hacks:&lt;br /&gt;
https://www.avsforum.com/threads/how-i-got-cheap-dlp-link-glasses-to-work-great.1887145/&lt;br /&gt;
&lt;br /&gt;
=== Waterniveaumeter ===&lt;br /&gt;
Op verschillende plekken in Gouda staat er water in de kruipruimte van huizen van bewoners.&lt;br /&gt;
Kunnen we dat meten en inzichtelijk maken, voor bewoners, op een kaart bijvoorbeeld?&lt;br /&gt;
&lt;br /&gt;
Idee:&lt;br /&gt;
* in de kruipruimte plaats je een module die waterhoogte kan meten&lt;br /&gt;
* de module bestaat uit een microcontroller en een afstandsmeter, die de waterhoogte bepaalt&lt;br /&gt;
* de gegevens worden via WiFi doorgestuurd naar een centraal punt, waar de data wordt verwerkt en gevisualiseerd&lt;br /&gt;
* op een webpagina kan je een overzicht zien van alle meters die online zijn&lt;br /&gt;
* de meting wordt gedaan door bijv. een laser-afstandsmeter of een ultrasoon-afstandsmeter&lt;br /&gt;
* voeding? lastig, hoe krijg je 5v naar een potentieel natte plek?&lt;br /&gt;
* kosten? verwachting &amp;lt; E 40,-&lt;br /&gt;
&lt;br /&gt;
In Gouda wordt op veel verschillende plekken de grondwaterstand gemeten, zie https://opendata.munisense.net/portal/wareco-water2/group/581/Gouda-KJ38A , maar:&lt;br /&gt;
* geen visualisatie op de kaart, je ziet alleen de meetlokaties d.m.v. een icoontje!&lt;br /&gt;
* geen meetpunten in Gouda noord!&lt;br /&gt;
&lt;br /&gt;
=== Online bat detector ===&lt;br /&gt;
Idea: use an ultrasonic microphone, connect it to a WebSDR, so people can tune into bat sounds remotely.&lt;br /&gt;
&lt;br /&gt;
=== Raspberry pi airplane tracking ===&lt;br /&gt;
Apparently now you can also participate in MLAT tracking of planes that don&#039;t transmit GPS coordinates themselves.&lt;br /&gt;
&lt;br /&gt;
=== APRS gateway ===&lt;br /&gt;
http://qso365.co.uk/2017/02/a-guide-to-setting-up-an-aprs-receive-only-igate-using-a-raspberry-pi-and-an-rtl-sdr-dongle/&lt;br /&gt;
&lt;br /&gt;
=== JQ6500 ===&lt;br /&gt;
Small inexpensive modules that play mp3 from an internal flash. Could be nice for a custom door bell for example.&lt;br /&gt;
&lt;br /&gt;
More info at: &lt;br /&gt;
* https://www.elecfreaks.com/wiki/index.php?title=JQ6500_Mini_MP3_Module&lt;br /&gt;
* https://sparks.gogo.co.nz/jq6500/index.html&lt;br /&gt;
&lt;br /&gt;
=== FPGA ===&lt;br /&gt;
Cheap FPGA boards and nice applications:&lt;br /&gt;
* https://bitbucket.org/appanp/artificial-neural-networks/wiki/Home/FPGAsAndNeuralNets.md#!sbcs-and-iot-boards &lt;br /&gt;
* [http://nl.aliexpress.com/item/Altera-fpga-cycloneii-ep2c5t144-learning-board-development-board/872520721.html inexpensive ep2c5t144 board] &lt;br /&gt;
* http://land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board&lt;br /&gt;
&lt;br /&gt;
=== Neural networks on low-end hardware ===&lt;br /&gt;
Investigate if you can run a powerful neural network on relatively low-end/cheap/low-power hardware. For example a Raspberry pi.&lt;br /&gt;
A RPI runs Linux, run python, just like some common neural frameworks.&lt;br /&gt;
Do we need hardware acceleration from the GPU and does the RPI GPU support that?&lt;br /&gt;
&lt;br /&gt;
Read list:&lt;br /&gt;
* https://www.zdnet.com/pictures/raspberry-pi-meets-ai-the-projects-that-put-machine-learning-on-the-35-board/&lt;br /&gt;
* https://www.pyimagesearch.com/2017/12/18/keras-deep-learning-raspberry-pi/&lt;br /&gt;
* https://www.indiegogo.com/projects/sipeed-maix-the-world-first-risc-v-64-ai-module#/&lt;br /&gt;
* https://ai.intel.com/intel-neural-compute-stick-2-smarter-faster-plug-and-play-ai-at-the-edge/&lt;br /&gt;
&lt;br /&gt;
Bought a MaixPy:&lt;br /&gt;
* see https://maixpy.sipeed.com/en/&lt;br /&gt;
* see https://www.youtube.com/watch?v=KResVuAIMb4&lt;br /&gt;
* see http://educ8s.tv/sipeed-m1-dock-review/&lt;br /&gt;
* interesting? https://www.instructables.com/id/Transfer-Learning-With-Sipeed-MaiX-and-Arduino-IDE/&lt;br /&gt;
&lt;br /&gt;
=== mini word clock in dutch ===&lt;br /&gt;
Basically an monochrome 8x8 word clock, in Dutch, showing local time in the Netherlands.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bertrik/miniwordclock This git repo] has the current code.&lt;br /&gt;
&lt;br /&gt;
See [https://plus.google.com/103276078656203197145/posts/7ki7rpJzk3a here for a demo] running on an arduino nano.&lt;br /&gt;
&lt;br /&gt;
The plan is to run this from an ESP8266 instead of an arduino nano, so it can get the time from the internet using NTP.&lt;br /&gt;
Andreas Spiess demonstrated on youtube how existing libraries on the ESP8266 can be used to do the local time (including summer-time) calculations.&lt;br /&gt;
&lt;br /&gt;
=== Cypress PSOC5 ===&lt;br /&gt;
Play with the Cypress PSOC5 platform, which combines a ARM Cortex-m3 processor with configurable analog blocks. I&#039;m thinking of combining it with a 24 GHz doppler radar sensor, to process the signal and present it as a USB audio device (stereo signal contains I and Q parts). See [[RadarOnAStick]].&lt;br /&gt;
&lt;br /&gt;
=== Simple Doppler motion sensors ===&lt;br /&gt;
You can find basic doppler microwave motion sensors based on a single transistor, with some weird traces on the PCB very cheaply, for example&lt;br /&gt;
* https://www.aliexpress.com/item/RCWL-0516-microwave-radar-sensor-module-Human-body-induction-switch-module-Intelligent-sensor/32708877914.html&lt;br /&gt;
&lt;br /&gt;
Typically the microwave part of these consists of a single transistor with a rectangular area on one leg and a meandering trace (with lots of vias to the other side) on the other leg.&lt;br /&gt;
The output of this circuit seems to go into a chip very much like the ones used in PIR sensors.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/jdesbonnet/RCWL-0516 for a reverse engineering effort of these doppler radar modules.&lt;br /&gt;
&lt;br /&gt;
=== Bare-bones Arduino bat detector ===&lt;br /&gt;
This is an idea for a very basic heterodyne bat detector, doing signal processing on an Arduino, requiring minimal external components.&lt;br /&gt;
&lt;br /&gt;
The basic principle of a heterodyne detector is that it just mixes (multiplies) the audio signal with a square wave, low-pass filters the result and puts it on a speaker.&lt;br /&gt;
&lt;br /&gt;
Multiplying with a square wave can also be considered to be just alternatively inverting and not-inverting the signal.&lt;br /&gt;
So if you sample an ultrasonic signal at twice the rate you want to multiply, you can just subtract odd samples from even samples and low-pass filter that.&lt;br /&gt;
&lt;br /&gt;
How this can be done in an AVR Arduino:&lt;br /&gt;
* sample the audio signal at twice the detection frequency, say 84 kHz. An AVR should just be able to do that.&lt;br /&gt;
* apply a 1-pole IIR high-pass filter to remove DC bias, this takes one shift instruction and one addition.&lt;br /&gt;
* multiply by the detection frequency, this means just inverting the odd samples.&lt;br /&gt;
* low-pass filter the signal, this can be done using a moving average filter, say 16 samples long (first null at 5.25 kHz). Theoretically, averaging 16 samples should result in two bits extra accuracy. This operation takes some storage, an addition and a subtraction.&lt;br /&gt;
* output the filtered signal using PWM, possibly at the same rate that we are sampling the input audio.&lt;br /&gt;
&lt;br /&gt;
The microphone can be a 40 kHz piezo transducer, to keep it cheap (but also limited to 40 kHz).&lt;br /&gt;
The pre-amplifier can be a single transistor with some resistors around it, providing about 40x gain.&lt;br /&gt;
The arduino does the signal processing (mixing, low-pass filter) to shift the bat audio to human range.&lt;br /&gt;
The speaker amplifier can just be a simple two transistor push-pull circuit, since the output from the Arduino is digital/PWM.&lt;br /&gt;
&lt;br /&gt;
==== AVR Arduino sample rate ====&lt;br /&gt;
As far as I understand, the ADC clock can be set to 1 MHz.&lt;br /&gt;
Conversion takes 13 cycles, so this can be a problem to reach a sample rate above 80 kHz.&lt;br /&gt;
&lt;br /&gt;
=== Indoor radar speed sign ===&lt;br /&gt;
This idea about placing a simple IQ-output radar sensor indoors in the hacker space, do some basic signal processing on the IQ doppler signal and determine movement speed and direction, then display this on a LED display.&lt;br /&gt;
This is of no immediate practical use other than fun, but helps me to gain a bit more experience with microwave radar sensors and eventually build a more effective setup for detecting/counting bats flying in and out of a roost.&lt;br /&gt;
&lt;br /&gt;
Implement this on a PSOC5 platform or on the STM32 using Arduino.&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35035</id>
		<title>User:Bertrik Sikken</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35035"/>
		<updated>2026-01-25T13:15:09Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Project ideas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Smoel&lt;br /&gt;
 |Name=Bertrik Sikken&lt;br /&gt;
 |Nick=bertrik&lt;br /&gt;
 |Tagline=heb ik niet&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You can reach me at [mailto:bertrik@sikken.nl bertrik@sikken.nl] or [mailto:bertrik@gmail.com bertrik@gmail.com].&lt;br /&gt;
&lt;br /&gt;
Studied Electrical Engineering at Twente University.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Main interests:&lt;br /&gt;
* reverse-engineering things (USB stuff, mp3 players), worked on http://rockbox.org (sansa clip players)&lt;br /&gt;
* studying bats and making electronics for recording/listening to bat sounds&lt;br /&gt;
* radio stuff, in particular software-defined radio, LoRa networks&lt;br /&gt;
* citizen science and open data (particulate matter measurement, noise, water quality)&lt;br /&gt;
* energy-related stuff, visualisation&lt;br /&gt;
&lt;br /&gt;
Projects I work(ed) on ([https://revspace.nl/index.php?title=User:Bertrik_Sikken&amp;amp;action=purge refresh]):&lt;br /&gt;
{{#ask:[[Category:Project]][[Project Contact::bertrik]]&lt;br /&gt;
|?Project Status&lt;br /&gt;
|headers=show&lt;br /&gt;
|link=all&lt;br /&gt;
|order=ASC,ASC&lt;br /&gt;
|sort=Project Status,Project Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project ideas ==&lt;br /&gt;
[[File:always10oclock.jpg|right]]&lt;br /&gt;
[[File:idea.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas I&#039;m thinking about, but have not fully developed into an actual project yet.&lt;br /&gt;
&lt;br /&gt;
https://pine64.com/product/128mb-ox64-sbc-available-on-december-2-2022/&lt;br /&gt;
&lt;br /&gt;
=== Meshcore as citizen science data transport ===&lt;br /&gt;
Meshcore is basically a network of repeaters for lora messages with a specific setting.&lt;br /&gt;
The idea is to use a citizen science sensor with a LoRa radio to uplink citizen science data through this repeater network, get the data repeated, then pick it up using a special kind of node is connected to the internet (e.g. MQTT) that forwards the data to a collection server for further processing.&lt;br /&gt;
&lt;br /&gt;
The LoRa setting used almost universally in the Netherlands now is the EU/UK setting:&lt;br /&gt;
* 869.618 / SF8 / BW62.5 / CR8&lt;br /&gt;
* header enabled &lt;br /&gt;
* sync word XXXX&lt;br /&gt;
&lt;br /&gt;
Description of the on-the-air message: https://gist.github.com/recrof/ca7ccff28c43d1b6bf7e55ce5159100b&lt;br /&gt;
&lt;br /&gt;
Meshcore repeaters a relatively &amp;quot;dumb&amp;quot;, they just forward anything that resembles a packet (they can&#039;t inspect the encrypted part).&lt;br /&gt;
&lt;br /&gt;
The idea is basically:&lt;br /&gt;
* Sensor first starts up, sends a kind of discovery packet in &amp;quot;flood&amp;quot; mode. This kind of packet is flooded over the entire network.&lt;br /&gt;
* When the discovery packet reaches a special internet-connected gateway, the backend software receives it and returns a kind of acknowledgement packet back over the (best) path that it received the message on. When this reaches the sensor node, the sensor node knows the most efficient way to reach the gateway node and uses a &amp;quot;direct&amp;quot; packet. Every now and then it expects a kind of acknowledgement packet back from the server, to know that messages are still coming through. This is actually a bit similar to how LoRaWAN works.&lt;br /&gt;
&lt;br /&gt;
=== investigate thread/matter ===&lt;br /&gt;
Matter/thread is the new IKEA standard for home automation thins apparently. &lt;br /&gt;
Thread is the wireless protocol, matter is a home automation protocol running on top of thread.&lt;br /&gt;
&lt;br /&gt;
I have a couple of nrf52840, these are good in doing thread.&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* check out openthread&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/openthread/openthread.git&lt;br /&gt;
cd openthread&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Prepare development environment:&lt;br /&gt;
  scripts/bootstrap&lt;br /&gt;
* Build it:&lt;br /&gt;
  ./script/build nrf52840 UART_trans -DOT_LOG_LEVEL=OT_LOG_LEVEL_INFO&lt;br /&gt;
&lt;br /&gt;
Thread on ESP32:&lt;br /&gt;
* on ESP32 C6 https://gist.github.com/gtxaspec/d26198daadfb0a8b0a0edeae2d3fd58f&lt;br /&gt;
* https://github.com/espressif/esp-thread-br&lt;br /&gt;
* https://github.com/espressif/esp-idf/tree/master/examples/openthread/ot_rcp&lt;br /&gt;
&lt;br /&gt;
=== action lsc stekker ===&lt;br /&gt;
https://keetsupport.nl/2024/03/20/how-to-flash-lsc-power-plug-with-esphome/&lt;br /&gt;
&lt;br /&gt;
https://community.home-assistant.io/t/detailed-guide-on-how-to-flash-the-new-tuya-beken-chips-with-openbk7231t/437276&lt;br /&gt;
&lt;br /&gt;
=== sipeed maix dock ===&lt;br /&gt;
Bought this a couple of years ago. Get familiar with this board.&lt;br /&gt;
Can I run a chess program on this, for example?&lt;br /&gt;
&lt;br /&gt;
* https://wiki.sipeed.com/soft/maixpy/en/develop_kit_board/maix_dock.html&lt;br /&gt;
&lt;br /&gt;
=== rfid keyfob ===&lt;br /&gt;
* aliexpress page: https://nl.aliexpress.com/item/1005009569496736.html&lt;br /&gt;
* firmware github: &lt;br /&gt;
** https://github.com/RfidResearchGroup/ChameleonUltra&lt;br /&gt;
** https://github.com/GameTec-live/ChameleonUltraGUI&lt;br /&gt;
&lt;br /&gt;
=== advanced lidars for bat detection ===&lt;br /&gt;
livox:&lt;br /&gt;
* github page https://github.com/Livox-SDK/Livox-SDK/tree/master&lt;br /&gt;
* web page: https://www.livoxtech.com/&lt;br /&gt;
&lt;br /&gt;
=== cubecell meshtastic motion detector ===&lt;br /&gt;
I have a cubecell AB01 board.&lt;br /&gt;
This board is focused on low power, has a connection to attach a solar panel and has a lora radio.&lt;br /&gt;
Relatively small amount of RAM, barely enough to run a LoRaWAN stack but probably plenty to run meshtastic&lt;br /&gt;
&lt;br /&gt;
The plan is to build a simple motion detector from this (using a PIR).&lt;br /&gt;
The PIR can wake up the board from low-power, or a timer can wake it periodically.&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/HelTecAutomation/CubeCell-Arduino/tree/master/libraries/Basics/examples/LowPower&lt;br /&gt;
&lt;br /&gt;
=== configure multitech outdoor gateway ===&lt;br /&gt;
https://www.multitech.net/developer/products/multiconnect-conduit-platform/basestation/&lt;br /&gt;
&lt;br /&gt;
https://multitech.com/product/multitech-conduit-mtcdt-246a-868-eu-gb/&lt;br /&gt;
&lt;br /&gt;
emergency procedure:&lt;br /&gt;
https://www.multitech.net/developer/software/mlinux/using-mlinux/flashing-mlinux-firmware-for-conduit/&lt;br /&gt;
&lt;br /&gt;
=== esp32 wtf ===&lt;br /&gt;
* https://forum.arduino.cc/t/ttgo-lilygo-lora-esp32-26mhz-problem/1353750&lt;br /&gt;
* &amp;quot;26 MHz crystal has been deprecated&amp;quot; https://github.com/espressif/arduino-esp32/issues/10117&lt;br /&gt;
&lt;br /&gt;
=== kakofonie counter ===&lt;br /&gt;
Sample room audio, use neural network to distinguish voices to estimate number of people talking in the past 30 seconds or so.&lt;br /&gt;
Show this number on some kind of display, publish it to MQTT, make a nice graph of it.&lt;br /&gt;
&lt;br /&gt;
Stuff to figure out:&lt;br /&gt;
* this is called &#039;speaker diarization&#039;&lt;br /&gt;
* can it run on an ESP32?&lt;br /&gt;
* make a prototype&lt;br /&gt;
&lt;br /&gt;
=== hypno toad ===&lt;br /&gt;
Put these LEDS https://nl.aliexpress.com/item/1005007583528891.html into https://www.action.com/nl-nl/p/2560347/solar-tuinbeeldje/&lt;br /&gt;
&lt;br /&gt;
Turns out that the default circuit is really basic and output a rough step-up waveform to the LED.&lt;br /&gt;
The self-fading LEDs don&#039;t work very well with that.&lt;br /&gt;
&lt;br /&gt;
Also, putting some IPA on hotglue makes it release really easy.&lt;br /&gt;
&lt;br /&gt;
=== wasbeer / kat classifier ===&lt;br /&gt;
ESP32 with resnet50 neural net to distinguish house cats from other animals, see also:&lt;br /&gt;
* https://ieeexplore.ieee.org/document/10556848/&lt;br /&gt;
&lt;br /&gt;
=== Nespresso brew counter ===&lt;br /&gt;
Several hacker spaces have one of these Nespresso cup coffee makers, but there&#039;s no obvious easy way to monitor usage (monitor ALL the things!).&lt;br /&gt;
Inspired by https://hackaday.com/2021/04/25/arduino-mkr-makes-nespresso-monitoring-easy/ this idea is making an even simpler nespresso monitor,&lt;br /&gt;
using an inexpensive WiFi enabled ESP8266 with an ubiquitous I2S microphone such as the INMP441. &lt;br /&gt;
&lt;br /&gt;
Use this sound monitoring project:&lt;br /&gt;
https://github.com/aleiei/ESP8266-BUG-I2S-MIC&lt;br /&gt;
and turn it into a WiFi connected brew counter.&lt;br /&gt;
&lt;br /&gt;
Software for getting microphone data from an ESP8266/I2S mic into Linux https://github.com/bertrik/EspMicServer&lt;br /&gt;
Nespresso sound is typically 50 Hz with overtones.&lt;br /&gt;
In a recording with the ESP8266, it appears that oddly the 17th harmonic (around 850 Hz) is quite strong.&lt;br /&gt;
&lt;br /&gt;
The plan in the short term is this:&lt;br /&gt;
* apply a gentle IIR filter to subtract any DC bias from the microphone signal&lt;br /&gt;
* calculate autocovariance at offsets 0 and 20 ms (inverse of 50 Hz), representing the total energy and the energy at 50 Hz respectively&lt;br /&gt;
* compare amplitudes to decide about presence of 50 Hz signal, e.g. calculate ratio in dB&lt;br /&gt;
* use this to count the length of time that a 50 Hz signal is heard (increments of 100 ms or so)&lt;br /&gt;
* decide about none / espresso / lungo based on time&lt;br /&gt;
&lt;br /&gt;
Might even integrate with esphome / home assistant later.&lt;br /&gt;
&lt;br /&gt;
=== Remote bat box monitor ===&lt;br /&gt;
Idea:&lt;br /&gt;
* goal: check if remote bat boxes are occupied and identify the species&lt;br /&gt;
* challenges:&lt;br /&gt;
** connectivity: need to transport images/videos (no LoRaWAN), possibly out of range of mobile data networks&lt;br /&gt;
** autonomy: cannot reach the bat box once installed&lt;br /&gt;
** power: no fixed power connection, so probably needs a battery + solar panel&lt;br /&gt;
* design&lt;br /&gt;
** wake up every hour, take a picture, go to sleep, upload photos/videos once per day&lt;br /&gt;
** run from batteries, recharge by solar, rules of thumb&lt;br /&gt;
*** batteries should last for about 10 days&lt;br /&gt;
*** battery should be able to charge in 1 day&lt;br /&gt;
*** consider only 10% of peak solar power&lt;br /&gt;
** KPN &amp;quot;4G-op-zee&amp;quot; somewhat confusing article: https://www.kpn.com/zakelijk/mobiel/roaming/noordzee&lt;br /&gt;
* hardware&lt;br /&gt;
** main processor: raspberry pi zero&lt;br /&gt;
*** raspberry pi power consumption overview: https://www.pidramble.com/wiki/benchmarks/power-consumption&lt;br /&gt;
** this hat to wake up the main CPU: https://www.waveshare.com/wiki/Power_Management_HAT_(B) sold at https://www.kiwi-electronics.com/en/power-management-hat-for-raspberry-pi-with-rtc-and-rp2040-mcu-11373&lt;br /&gt;
&lt;br /&gt;
=== KNMI API ===&lt;br /&gt;
Get familiar with https://developer.dataplatform.knmi.nl/open-data-api&lt;br /&gt;
&lt;br /&gt;
=== Grid frequency measurer with web page ===&lt;br /&gt;
See https://github.com/bertrik/GridFrequency&lt;br /&gt;
SSE source is gridfrequency.local/events&lt;br /&gt;
&lt;br /&gt;
=== WeAct CH55x board ===&lt;br /&gt;
Cheap little boards, using a similar chip as used in USB-serial converters.&lt;br /&gt;
&lt;br /&gt;
The hardware&lt;br /&gt;
https://github.com/WeActStudio/WeActStudio.CH552CoreBoard&lt;br /&gt;
&lt;br /&gt;
Flashing it:&lt;br /&gt;
https://hackaday.io/page/137447-flashing-the-ch552-dev-board-from-the-command-line&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://hackaday.io/project/198238-more-weact-ch5xx&lt;br /&gt;
* https://community.platformio.org/t/manually-adding-support-for-ch55x-controller-by-adding-existing-ardunio-core/41138&lt;br /&gt;
&lt;br /&gt;
=== Zigbee device with esp32 ===&lt;br /&gt;
See https://github.com/P-R-O-C-H-Y/arduino-esp32/blob/8169a434c3e46e1bb7711ebcc04f27267db2093c/libraries/ESP32/examples/Zigbee/Zigbee_Light_Bulb/Zigbee_Light_Bulb.ino&lt;br /&gt;
&lt;br /&gt;
See https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Zigbee&lt;br /&gt;
&lt;br /&gt;
Espressif32 arduino platform git: https://github.com/platformio/platform-espressif32&lt;br /&gt;
&lt;br /&gt;
=== Cameratoezicht in Gouda ===&lt;br /&gt;
Gemeente Gouda publiceert een lijst van camera&#039;s in Gouda, zie&lt;br /&gt;
https://gis.gouda.nl/nl/app/Basisviewer_open#!eAGT8uRiNBRy4ZIRYFKSyKkssjJwdzFxNDMz8TKKsLC0cnb0dQ1y5FIByirgkg3xd43ydPYIAQBXGBFm&lt;br /&gt;
&lt;br /&gt;
Aanmelden (semi-automatisch) bij bijvoorbeeld [https://mapcomplete.org/surveillance Surveillance-under-surveillance] ?&lt;br /&gt;
&lt;br /&gt;
=== SolarEdge ===&lt;br /&gt;
Interact with the solar edge api for PV installations.&lt;br /&gt;
&lt;br /&gt;
https://developers.solaredge.com/&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/solaredge-api&lt;br /&gt;
&lt;br /&gt;
=== Stookalert ===&lt;br /&gt;
Idee: gekleurd lampje dat aangeeft of er op dit moment een stookalert actief is&lt;br /&gt;
&lt;br /&gt;
Implementatie:&lt;br /&gt;
* kijk m.b.v. WiFi locatieservice in welke provincie je je bevindt&lt;br /&gt;
* haal JSON op bij https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* toon de bijbehorende kleur op het lampje&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
* Officiele pagina: https://www.atlasleefomgeving.nl/stookwijzer&lt;br /&gt;
* Achterliggende JSON met toestand per provincie: https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* Er moet ook nog ergens een API zijn die fijnmaziger aangeeft wat de toestand is ...&lt;br /&gt;
&lt;br /&gt;
=== Display of current electricity usage ===&lt;br /&gt;
I have a [https://www.zuidwijk.com/product/slimmelezer-plus/ slimme lezer] connected to the P1 port of my smart electricity meter.&lt;br /&gt;
The default firmware exposes meter readings using an event stream (SSE) at http://slimmelezer.local/events&lt;br /&gt;
&lt;br /&gt;
So for example, you can read this with curl:&lt;br /&gt;
  curl http://slimmelezer.local/events&lt;br /&gt;
With result:&lt;br /&gt;
  event: state&lt;br /&gt;
  data: {&amp;quot;id&amp;quot;:&amp;quot;sensor-power_consumed_phase_1&amp;quot;,&amp;quot;value&amp;quot;:0.046,&amp;quot;state&amp;quot;:&amp;quot;0.046 kW&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Specification of SSE: https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
&lt;br /&gt;
What I would like to do is to read these events and control a simple display to display  the current usage number.&lt;br /&gt;
&lt;br /&gt;
=== Participating in ultrasonic sound project ===&lt;br /&gt;
https://bat-migration-europe.netlify.app/project/&lt;br /&gt;
&lt;br /&gt;
Use an audiomoth for this.&lt;br /&gt;
&lt;br /&gt;
=== ESP32 C3 ===&lt;br /&gt;
* [https://www.espressif.com/en/products/socs/esp32-c3 processor page]&lt;br /&gt;
* [https://wiki.luatos.com/chips/esp32c3/index.html luatos basic esp32 c3 board]&lt;br /&gt;
&lt;br /&gt;
=== Flexible LED ticker ===&lt;br /&gt;
Ordered a flexible 32x8 RGB LED display:&lt;br /&gt;
https://nl.aliexpress.com/item/4001296811800.html&lt;br /&gt;
&lt;br /&gt;
Matching diffuser to be 3D printed:&lt;br /&gt;
https://www.thingiverse.com/thing:1903744&lt;br /&gt;
&lt;br /&gt;
=== Washing machine API ===&lt;br /&gt;
https://tratt.net/laurie/blog/2023/displaying_my_washing_machines_remaining_time_with_curl_jq_pizauth.html&lt;br /&gt;
&lt;br /&gt;
=== TinyML ===&lt;br /&gt;
Investigate TinyML, see https://www.tinyml.org/&lt;br /&gt;
Apparently can run on a RP2040 (raspi pi pico).&lt;br /&gt;
&lt;br /&gt;
https://www.hackster.io/mjrobot/esp32-cam-tinyml-image-classification-fruits-vs-veggies-4ab970&lt;br /&gt;
&lt;br /&gt;
=== Bat box busy signal ===&lt;br /&gt;
My brother built little pyramid &#039;blinkies&#039;: solar cell + Lithium-supercapacitor + harvesting circuit + LED encased in clear expoxy.&lt;br /&gt;
&lt;br /&gt;
Can we add a low-power PIR sensor to this, and make a blinky that blinks if movement was detected by the PIR in the past hour?&lt;br /&gt;
&lt;br /&gt;
=== Super tiny RFID ===&lt;br /&gt;
See https://www.sparkfun.com/products/16464 an almost sand grain size RFID chip, 1.25mmx1.25mmx0.55mm&lt;br /&gt;
&lt;br /&gt;
The accompanying reader &amp;quot;M6E Nano&amp;quot; is still quite expensive at $235.95 : https://www.sparkfun.com/products/14066&lt;br /&gt;
&lt;br /&gt;
Uses the MuRata LXMSJZNCMF-198:&lt;br /&gt;
&amp;quot;This product can be used as an ultra small tag and this can be&lt;br /&gt;
fit on any metal objects, non-metal objects, as well as&lt;br /&gt;
embedding into any objects by glue or adhesive and so on.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See also: ISO18000-63 and EPC global Gen2(v2)&lt;br /&gt;
&lt;br /&gt;
Specification:&lt;br /&gt;
* https://www.gs1.org/standards/rfid/uhf-air-interface-protocol&lt;br /&gt;
&lt;br /&gt;
=== TheThingsNetwork-Sondehub bridge ===&lt;br /&gt;
Uploads balloon telemetry to sondehub.&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/ttnhabbridge/issues/6&lt;br /&gt;
&lt;br /&gt;
=== Actually smart boiler ===&lt;br /&gt;
The boiler for hot water is about half of my electricity bill.&lt;br /&gt;
The idea is to use/build a smart switch that switches it on at time when electricity prices are lowest.&lt;br /&gt;
&lt;br /&gt;
Currently have a &amp;quot;Slimme boiler module&amp;quot; from Eneco, which is *not* actually smart,&lt;br /&gt;
since it allows me no control whatsoever when it switches on (besides cutting the power in the meterkast).&lt;br /&gt;
For example, it will switch on mid-day when my price is high and eneco&#039;s price is low, perhaps good for Eneco, not for me. &lt;br /&gt;
Apparently, they even received a [https://nieuws.eneco.nl/slim-apparaatje-bij-boiler-vangt-pieken-wind--en-zonnestroom-op/ subsidy] for this.&lt;br /&gt;
&lt;br /&gt;
A boiler is a pretty big load, about 3 kW, but it is not inductive.&lt;br /&gt;
&lt;br /&gt;
Alternatives:&lt;br /&gt;
* https://www.shelly.cloud/en-nl/products/product-overview/shelly-plus-1-pm-2-pack/shelly-plus-1-pm&lt;br /&gt;
* https://www.solyxenergy.nl/solar-iboost/ to store excess solar energy in hot water, might also be useful for just controlling a boiler to use cheaper rates&lt;br /&gt;
* tuya smartplug, like https://www.wifilampkoning.nl/merken-slimme-verlichting/tuya/tuya-enkele-smartplug-met-energiemeting ?&lt;br /&gt;
* tuya 20A smart plug: https://nl.aliexpress.com/item/1005003347568206.html&lt;br /&gt;
&lt;br /&gt;
=== Receiving gas meters ===&lt;br /&gt;
Apparently gas meters send gas consumption data to the slimme meter using a wireless link in the 868 MHz band.&lt;br /&gt;
Probably just FSK at 38.4, as mentioned here: https://a35.veron.nl/nieuwe-elektra-en-gasmeters/&lt;br /&gt;
&lt;br /&gt;
Interesting leads:&lt;br /&gt;
* https://github.com/stef/smeter&lt;br /&gt;
* https://www.rtl-sdr.com/reading-household-wireless-utility-meters-with-an-rtl-sdr-and-plotting-the-data-in-home-automation-software/&lt;br /&gt;
* https://github.com/bemasher/rtlamr&lt;br /&gt;
&lt;br /&gt;
=== Multi-network wifi manager ===&lt;br /&gt;
Figure out or create software so that ESP8266/ESP32 wifi manager can use multiple networks to connect (not just one),&lt;br /&gt;
so it allowing storing credentials for more than one network. For example, the network at home, the hacker space, at work.&lt;br /&gt;
Instead of reconfiguring the wifi manager for each network, you just *add* your credentials (and the existing credentials&lt;br /&gt;
are not replaced).&lt;br /&gt;
&lt;br /&gt;
See https://github.com/folkertvanheusden/M.A.X.X&lt;br /&gt;
&lt;br /&gt;
Interesting candidates:&lt;br /&gt;
* https://registry.platformio.org/libraries/martinverges/ESP32%20Wifi%20Manager wifi manager for ESP32, has a REST API for managing wifi network, but is incomplete in the sense that you need to write your own code (e.g. javascript) to actually *use* its API&lt;br /&gt;
* https://github.com/arduino-libraries/Arduino_MultiWiFi is the arduino multi wifi library, to allow connecting to multiple different WiFi networks, but it is not a wifi manager, that starts a captive portal, etc&lt;br /&gt;
&lt;br /&gt;
=== Automated bat counting ===&lt;br /&gt;
Can we automatically count the number of bats from the image of a webcam mounted in a bat colony?&lt;br /&gt;
Perhaps using some kind of AI or machine learning algorithm?&lt;br /&gt;
&lt;br /&gt;
The image in question:&lt;br /&gt;
https://stofradar.nl/coenecoop/&lt;br /&gt;
&lt;br /&gt;
=== Use TheThingsIndoorGateway as Helium/ThingSix hotspot ===&lt;br /&gt;
I have a spare TTIG that could perhaps be used as a Helium gateway, investigate what is possible.&lt;br /&gt;
&lt;br /&gt;
One possiblity is to capture the gateway traffic from the TTN gateway events API, convert uplink data to a format that the Helium network understands and forward it.&lt;br /&gt;
I don&#039;t really care about the Helium crypto tokens, this is just for fun and science.&lt;br /&gt;
&lt;br /&gt;
What I definitely can do:&lt;br /&gt;
* Capture data from the TTN gateway events API, convert it back to Semtech UP format and forward it somewhere to Helium (just not sure where!)&lt;br /&gt;
* See also my https://github.com/bertrik/ttn-gateway-collector project which contains an initial implementation of TTN-to-UDP conversion&lt;br /&gt;
&lt;br /&gt;
Showstoppers:&lt;br /&gt;
* If you want to be a gateway on the Helium network, you have to *pay Helium*! Obviously I don&#039;t want that, I just want to share data to improve *their* network. &lt;br /&gt;
&lt;br /&gt;
Open work:&lt;br /&gt;
* Investigate if Helium has an open uplink API for their hotspots, if so study it etc, without paying the gateway fee&lt;br /&gt;
* Investigate if Thingsix has an open uplink API for their hotspots, if so study it etc, without paying any gateway fee&lt;br /&gt;
* Investigate if Thingsix is just another Helium, with weird crypto money&lt;br /&gt;
&lt;br /&gt;
Interesting stuff:&lt;br /&gt;
* https://docs.helium.com/use-the-network/setup-a-packet-forwarder unfortunately the link to setting up the &#039;light hotspot client&#039; does not work!&lt;br /&gt;
* https://docs.helium.com/mine-hnt/light-hotspots/&lt;br /&gt;
* https://thingsix.com/&lt;br /&gt;
&lt;br /&gt;
=== Adding BLE GATT interface to sensors ===&lt;br /&gt;
The GATT specification allows measurement properties to be defined and transferred continuously over Bluetooth low-energy.&lt;br /&gt;
&lt;br /&gt;
With GATT you can define a collection of properties (e.g. measurement items like temperature/humidity/particulate matter/noise, etc)&lt;br /&gt;
organised in a simple structure of a BLE service.&lt;br /&gt;
The &#039;notification&#039; method allows you to basically push the data continuously to a connected host, e.g. a smart phone.&lt;br /&gt;
&lt;br /&gt;
Services collects characteristic, a characteristic has values with units.&lt;br /&gt;
Each of these (service, characteristic, unit) have their own unique &amp;quot;UUID&amp;quot;.&lt;br /&gt;
This is described in the so-called [https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20Numbers%20Document.pdf 16-bit UUID numbers document]&lt;br /&gt;
&lt;br /&gt;
Interesting stuff in GATT:&lt;br /&gt;
* See GATT_Specification_Supplement_v5 paragraph 3.151, it has a noise characteristic with 1 dB resolution.&lt;br /&gt;
* 0x27C3 is the GATT *unit* for sound pressure&lt;br /&gt;
* 0x181A is the GATT environmental sensing *service*, document name &amp;quot;ESP_V1.0.0.pdf&amp;quot;&lt;br /&gt;
* 0x2A6E is the GATT Characteristic and Object Type for temperature&lt;br /&gt;
* 0x2A6F is the GATT Characteristic and Object Type for humidity&lt;br /&gt;
* 0x2BD5 is the GATT Characteristic and Object Type for Particulate Matter - PM1 Concentration&lt;br /&gt;
* 0x2BD6 is the GATT Characteristic and Object Type for Particulate Matter - PM2.5 Concentration&lt;br /&gt;
* 0x2BD7 is the GATT Characteristic and Object Type for Particulate Matter - PM10 Concentration&lt;br /&gt;
* Unfortunately I cannot find a characteristic for carbon-dioxide (CO2) in the BLE GATT unit document&lt;br /&gt;
&lt;br /&gt;
See also https://programmaticponderings.com/2020/08/04/getting-started-with-bluetooth-low-energy-ble-and-generic-attribute-profile-gatt-specification-for-iot/&lt;br /&gt;
&lt;br /&gt;
=== Reverse engineering XS-8217 bluetooth air quality meter ===&lt;br /&gt;
This is a thing that measures CO2, humidity, temperature, TVOC and formaldehyde.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.liutyi.info/display/CO2/ZN-2CO3+Inside&lt;br /&gt;
&lt;br /&gt;
This teardown looks a lot like my sensor: https://www.youtube.com/watch?v=APnjhMrJChI&lt;br /&gt;
Mine contains a &amp;quot;TPM-300A&amp;quot; sensor for measuring VOC.&lt;br /&gt;
&lt;br /&gt;
It has a bluetooth interface, device name is XS-8217.&lt;br /&gt;
It has a BLE GATT profile, with the following services&lt;br /&gt;
* service 0xC760&lt;br /&gt;
** characteristic 0xC762 (WRITE)&lt;br /&gt;
** characteristic 0xC761 (NOTIFY)&lt;br /&gt;
*** example data: 0x23 0x06 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
*** example data: 0x23 0x08 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
*** data shown on screen was approximately: CO2=418ppm, HCHO=0.003mg/m3, TVOC=0.013mg/m3, temp=24degC, humi=35%&lt;br /&gt;
&lt;br /&gt;
So data in the characteristic 0xC761 seems to have a 4 byte constant header:&lt;br /&gt;
* 0x23&lt;br /&gt;
* length byte&lt;br /&gt;
&lt;br /&gt;
Then we have for the first message: 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0xF1 is temperature in 0.1 degree Celcius most likely (24.1)&lt;br /&gt;
* 0x00 is ...&lt;br /&gt;
* 0x23 is humidity most likely (35)&lt;br /&gt;
* 0x65 is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
And for the second message: 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0x01 0x9A is the CO2 concentration (410)&lt;br /&gt;
* 0x00 0x0A is TVOC most likely (10)&lt;br /&gt;
* 0x00 0x03 is HCHO most likely (3)&lt;br /&gt;
* 0x0E is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
=== ribbon tweeter for bat audio ===&lt;br /&gt;
Someone gave me this idea:&lt;br /&gt;
Use a ribbon tweeter like this for playing back bat audio:&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/4000973201791.html&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/1005002565880660.html&amp;lt;/s&amp;gt;&lt;br /&gt;
https://nl.aliexpress.com/item/1005002635086050.html&lt;br /&gt;
&lt;br /&gt;
The frequency spectrum shows no sign of dropping off at 20 kHz.&lt;br /&gt;
&lt;br /&gt;
=== 3d glasses ===&lt;br /&gt;
I got some 2nd hand 3d glasses, they look exactly like these ones:&lt;br /&gt;
* GH-15 https://www.dhgate.com/product/g15-dlp-3d-active-shutter-glasses-96-144hz/213983026.html&lt;br /&gt;
* Sintron https://www.amazon.de/Sintron-Kompatibel-TDG-BT500A-TDG-BT400A-Deutschland/dp/B015PCWMZ8&lt;br /&gt;
The common name appears to be &amp;quot;G15-DLP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A tear-down here:&lt;br /&gt;
* https://blog.danman.eu/3d-shutter-glasses-teardown/&lt;br /&gt;
&lt;br /&gt;
Interesting documents:&lt;br /&gt;
* http://cmst.curtin.edu.au/wp-content/uploads/sites/4/2016/05/2012-28-woods-helliwell-cross-compatibility_of_shutter_glasses.pdf&lt;br /&gt;
* http://cmst.curtin.edu.au/local/docs/pubs/2011-17-woods-helliwell-3D-Sync-IR.pdf&lt;br /&gt;
&lt;br /&gt;
Someone claims he got something to work with some hacks:&lt;br /&gt;
https://www.avsforum.com/threads/how-i-got-cheap-dlp-link-glasses-to-work-great.1887145/&lt;br /&gt;
&lt;br /&gt;
=== Waterniveaumeter ===&lt;br /&gt;
Op verschillende plekken in Gouda staat er water in de kruipruimte van huizen van bewoners.&lt;br /&gt;
Kunnen we dat meten en inzichtelijk maken, voor bewoners, op een kaart bijvoorbeeld?&lt;br /&gt;
&lt;br /&gt;
Idee:&lt;br /&gt;
* in de kruipruimte plaats je een module die waterhoogte kan meten&lt;br /&gt;
* de module bestaat uit een microcontroller en een afstandsmeter, die de waterhoogte bepaalt&lt;br /&gt;
* de gegevens worden via WiFi doorgestuurd naar een centraal punt, waar de data wordt verwerkt en gevisualiseerd&lt;br /&gt;
* op een webpagina kan je een overzicht zien van alle meters die online zijn&lt;br /&gt;
* de meting wordt gedaan door bijv. een laser-afstandsmeter of een ultrasoon-afstandsmeter&lt;br /&gt;
* voeding? lastig, hoe krijg je 5v naar een potentieel natte plek?&lt;br /&gt;
* kosten? verwachting &amp;lt; E 40,-&lt;br /&gt;
&lt;br /&gt;
In Gouda wordt op veel verschillende plekken de grondwaterstand gemeten, zie https://opendata.munisense.net/portal/wareco-water2/group/581/Gouda-KJ38A , maar:&lt;br /&gt;
* geen visualisatie op de kaart, je ziet alleen de meetlokaties d.m.v. een icoontje!&lt;br /&gt;
* geen meetpunten in Gouda noord!&lt;br /&gt;
&lt;br /&gt;
=== Online bat detector ===&lt;br /&gt;
Idea: use an ultrasonic microphone, connect it to a WebSDR, so people can tune into bat sounds remotely.&lt;br /&gt;
&lt;br /&gt;
=== Raspberry pi airplane tracking ===&lt;br /&gt;
Apparently now you can also participate in MLAT tracking of planes that don&#039;t transmit GPS coordinates themselves.&lt;br /&gt;
&lt;br /&gt;
=== APRS gateway ===&lt;br /&gt;
http://qso365.co.uk/2017/02/a-guide-to-setting-up-an-aprs-receive-only-igate-using-a-raspberry-pi-and-an-rtl-sdr-dongle/&lt;br /&gt;
&lt;br /&gt;
=== JQ6500 ===&lt;br /&gt;
Small inexpensive modules that play mp3 from an internal flash. Could be nice for a custom door bell for example.&lt;br /&gt;
&lt;br /&gt;
More info at: &lt;br /&gt;
* https://www.elecfreaks.com/wiki/index.php?title=JQ6500_Mini_MP3_Module&lt;br /&gt;
* https://sparks.gogo.co.nz/jq6500/index.html&lt;br /&gt;
&lt;br /&gt;
=== FPGA ===&lt;br /&gt;
Cheap FPGA boards and nice applications:&lt;br /&gt;
* https://bitbucket.org/appanp/artificial-neural-networks/wiki/Home/FPGAsAndNeuralNets.md#!sbcs-and-iot-boards &lt;br /&gt;
* [http://nl.aliexpress.com/item/Altera-fpga-cycloneii-ep2c5t144-learning-board-development-board/872520721.html inexpensive ep2c5t144 board] &lt;br /&gt;
* http://land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board&lt;br /&gt;
&lt;br /&gt;
=== Neural networks on low-end hardware ===&lt;br /&gt;
Investigate if you can run a powerful neural network on relatively low-end/cheap/low-power hardware. For example a Raspberry pi.&lt;br /&gt;
A RPI runs Linux, run python, just like some common neural frameworks.&lt;br /&gt;
Do we need hardware acceleration from the GPU and does the RPI GPU support that?&lt;br /&gt;
&lt;br /&gt;
Read list:&lt;br /&gt;
* https://www.zdnet.com/pictures/raspberry-pi-meets-ai-the-projects-that-put-machine-learning-on-the-35-board/&lt;br /&gt;
* https://www.pyimagesearch.com/2017/12/18/keras-deep-learning-raspberry-pi/&lt;br /&gt;
* https://www.indiegogo.com/projects/sipeed-maix-the-world-first-risc-v-64-ai-module#/&lt;br /&gt;
* https://ai.intel.com/intel-neural-compute-stick-2-smarter-faster-plug-and-play-ai-at-the-edge/&lt;br /&gt;
&lt;br /&gt;
Bought a MaixPy:&lt;br /&gt;
* see https://maixpy.sipeed.com/en/&lt;br /&gt;
* see https://www.youtube.com/watch?v=KResVuAIMb4&lt;br /&gt;
* see http://educ8s.tv/sipeed-m1-dock-review/&lt;br /&gt;
* interesting? https://www.instructables.com/id/Transfer-Learning-With-Sipeed-MaiX-and-Arduino-IDE/&lt;br /&gt;
&lt;br /&gt;
=== mini word clock in dutch ===&lt;br /&gt;
Basically an monochrome 8x8 word clock, in Dutch, showing local time in the Netherlands.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bertrik/miniwordclock This git repo] has the current code.&lt;br /&gt;
&lt;br /&gt;
See [https://plus.google.com/103276078656203197145/posts/7ki7rpJzk3a here for a demo] running on an arduino nano.&lt;br /&gt;
&lt;br /&gt;
The plan is to run this from an ESP8266 instead of an arduino nano, so it can get the time from the internet using NTP.&lt;br /&gt;
Andreas Spiess demonstrated on youtube how existing libraries on the ESP8266 can be used to do the local time (including summer-time) calculations.&lt;br /&gt;
&lt;br /&gt;
=== Cypress PSOC5 ===&lt;br /&gt;
Play with the Cypress PSOC5 platform, which combines a ARM Cortex-m3 processor with configurable analog blocks. I&#039;m thinking of combining it with a 24 GHz doppler radar sensor, to process the signal and present it as a USB audio device (stereo signal contains I and Q parts). See [[RadarOnAStick]].&lt;br /&gt;
&lt;br /&gt;
=== Simple Doppler motion sensors ===&lt;br /&gt;
You can find basic doppler microwave motion sensors based on a single transistor, with some weird traces on the PCB very cheaply, for example&lt;br /&gt;
* https://www.aliexpress.com/item/RCWL-0516-microwave-radar-sensor-module-Human-body-induction-switch-module-Intelligent-sensor/32708877914.html&lt;br /&gt;
&lt;br /&gt;
Typically the microwave part of these consists of a single transistor with a rectangular area on one leg and a meandering trace (with lots of vias to the other side) on the other leg.&lt;br /&gt;
The output of this circuit seems to go into a chip very much like the ones used in PIR sensors.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/jdesbonnet/RCWL-0516 for a reverse engineering effort of these doppler radar modules.&lt;br /&gt;
&lt;br /&gt;
=== Bare-bones Arduino bat detector ===&lt;br /&gt;
This is an idea for a very basic heterodyne bat detector, doing signal processing on an Arduino, requiring minimal external components.&lt;br /&gt;
&lt;br /&gt;
The basic principle of a heterodyne detector is that it just mixes (multiplies) the audio signal with a square wave, low-pass filters the result and puts it on a speaker.&lt;br /&gt;
&lt;br /&gt;
Multiplying with a square wave can also be considered to be just alternatively inverting and not-inverting the signal.&lt;br /&gt;
So if you sample an ultrasonic signal at twice the rate you want to multiply, you can just subtract odd samples from even samples and low-pass filter that.&lt;br /&gt;
&lt;br /&gt;
How this can be done in an AVR Arduino:&lt;br /&gt;
* sample the audio signal at twice the detection frequency, say 84 kHz. An AVR should just be able to do that.&lt;br /&gt;
* apply a 1-pole IIR high-pass filter to remove DC bias, this takes one shift instruction and one addition.&lt;br /&gt;
* multiply by the detection frequency, this means just inverting the odd samples.&lt;br /&gt;
* low-pass filter the signal, this can be done using a moving average filter, say 16 samples long (first null at 5.25 kHz). Theoretically, averaging 16 samples should result in two bits extra accuracy. This operation takes some storage, an addition and a subtraction.&lt;br /&gt;
* output the filtered signal using PWM, possibly at the same rate that we are sampling the input audio.&lt;br /&gt;
&lt;br /&gt;
The microphone can be a 40 kHz piezo transducer, to keep it cheap (but also limited to 40 kHz).&lt;br /&gt;
The pre-amplifier can be a single transistor with some resistors around it, providing about 40x gain.&lt;br /&gt;
The arduino does the signal processing (mixing, low-pass filter) to shift the bat audio to human range.&lt;br /&gt;
The speaker amplifier can just be a simple two transistor push-pull circuit, since the output from the Arduino is digital/PWM.&lt;br /&gt;
&lt;br /&gt;
==== AVR Arduino sample rate ====&lt;br /&gt;
As far as I understand, the ADC clock can be set to 1 MHz.&lt;br /&gt;
Conversion takes 13 cycles, so this can be a problem to reach a sample rate above 80 kHz.&lt;br /&gt;
&lt;br /&gt;
=== Indoor radar speed sign ===&lt;br /&gt;
This idea about placing a simple IQ-output radar sensor indoors in the hacker space, do some basic signal processing on the IQ doppler signal and determine movement speed and direction, then display this on a LED display.&lt;br /&gt;
This is of no immediate practical use other than fun, but helps me to gain a bit more experience with microwave radar sensors and eventually build a more effective setup for detecting/counting bats flying in and out of a roost.&lt;br /&gt;
&lt;br /&gt;
Implement this on a PSOC5 platform or on the STM32 using Arduino.&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35034</id>
		<title>User:Bertrik Sikken</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=35034"/>
		<updated>2026-01-25T11:52:01Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Smoel&lt;br /&gt;
 |Name=Bertrik Sikken&lt;br /&gt;
 |Nick=bertrik&lt;br /&gt;
 |Tagline=heb ik niet&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You can reach me at [mailto:bertrik@sikken.nl bertrik@sikken.nl] or [mailto:bertrik@gmail.com bertrik@gmail.com].&lt;br /&gt;
&lt;br /&gt;
Studied Electrical Engineering at Twente University.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Main interests:&lt;br /&gt;
* reverse-engineering things (USB stuff, mp3 players), worked on http://rockbox.org (sansa clip players)&lt;br /&gt;
* studying bats and making electronics for recording/listening to bat sounds&lt;br /&gt;
* radio stuff, in particular software-defined radio, LoRa networks&lt;br /&gt;
* citizen science and open data (particulate matter measurement, noise, water quality)&lt;br /&gt;
* energy-related stuff, visualisation&lt;br /&gt;
&lt;br /&gt;
Projects I work(ed) on ([https://revspace.nl/index.php?title=User:Bertrik_Sikken&amp;amp;action=purge refresh]):&lt;br /&gt;
{{#ask:[[Category:Project]][[Project Contact::bertrik]]&lt;br /&gt;
|?Project Status&lt;br /&gt;
|headers=show&lt;br /&gt;
|link=all&lt;br /&gt;
|order=ASC,ASC&lt;br /&gt;
|sort=Project Status,Project Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project ideas ==&lt;br /&gt;
[[File:always10oclock.jpg|right]]&lt;br /&gt;
[[File:idea.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas I&#039;m thinking about, but have not fully developed into an actual project yet.&lt;br /&gt;
&lt;br /&gt;
https://pine64.com/product/128mb-ox64-sbc-available-on-december-2-2022/&lt;br /&gt;
&lt;br /&gt;
=== investigate thread/matter ===&lt;br /&gt;
Matter/thread is the new IKEA standard for home automation thins apparently. &lt;br /&gt;
Thread is the wireless protocol, matter is a home automation protocol running on top of thread.&lt;br /&gt;
&lt;br /&gt;
I have a couple of nrf52840, these are good in doing thread.&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* check out openthread&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/openthread/openthread.git&lt;br /&gt;
cd openthread&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Prepare development environment:&lt;br /&gt;
  scripts/bootstrap&lt;br /&gt;
* Build it:&lt;br /&gt;
  ./script/build nrf52840 UART_trans -DOT_LOG_LEVEL=OT_LOG_LEVEL_INFO&lt;br /&gt;
&lt;br /&gt;
Thread on ESP32:&lt;br /&gt;
* on ESP32 C6 https://gist.github.com/gtxaspec/d26198daadfb0a8b0a0edeae2d3fd58f&lt;br /&gt;
* https://github.com/espressif/esp-thread-br&lt;br /&gt;
* https://github.com/espressif/esp-idf/tree/master/examples/openthread/ot_rcp&lt;br /&gt;
&lt;br /&gt;
=== action lsc stekker ===&lt;br /&gt;
https://keetsupport.nl/2024/03/20/how-to-flash-lsc-power-plug-with-esphome/&lt;br /&gt;
&lt;br /&gt;
https://community.home-assistant.io/t/detailed-guide-on-how-to-flash-the-new-tuya-beken-chips-with-openbk7231t/437276&lt;br /&gt;
&lt;br /&gt;
=== sipeed maix dock ===&lt;br /&gt;
Bought this a couple of years ago. Get familiar with this board.&lt;br /&gt;
Can I run a chess program on this, for example?&lt;br /&gt;
&lt;br /&gt;
* https://wiki.sipeed.com/soft/maixpy/en/develop_kit_board/maix_dock.html&lt;br /&gt;
&lt;br /&gt;
=== rfid keyfob ===&lt;br /&gt;
* aliexpress page: https://nl.aliexpress.com/item/1005009569496736.html&lt;br /&gt;
* firmware github: &lt;br /&gt;
** https://github.com/RfidResearchGroup/ChameleonUltra&lt;br /&gt;
** https://github.com/GameTec-live/ChameleonUltraGUI&lt;br /&gt;
&lt;br /&gt;
=== advanced lidars for bat detection ===&lt;br /&gt;
livox:&lt;br /&gt;
* github page https://github.com/Livox-SDK/Livox-SDK/tree/master&lt;br /&gt;
* web page: https://www.livoxtech.com/&lt;br /&gt;
&lt;br /&gt;
=== cubecell meshtastic motion detector ===&lt;br /&gt;
I have a cubecell AB01 board.&lt;br /&gt;
This board is focused on low power, has a connection to attach a solar panel and has a lora radio.&lt;br /&gt;
Relatively small amount of RAM, barely enough to run a LoRaWAN stack but probably plenty to run meshtastic&lt;br /&gt;
&lt;br /&gt;
The plan is to build a simple motion detector from this (using a PIR).&lt;br /&gt;
The PIR can wake up the board from low-power, or a timer can wake it periodically.&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/HelTecAutomation/CubeCell-Arduino/tree/master/libraries/Basics/examples/LowPower&lt;br /&gt;
&lt;br /&gt;
=== configure multitech outdoor gateway ===&lt;br /&gt;
https://www.multitech.net/developer/products/multiconnect-conduit-platform/basestation/&lt;br /&gt;
&lt;br /&gt;
https://multitech.com/product/multitech-conduit-mtcdt-246a-868-eu-gb/&lt;br /&gt;
&lt;br /&gt;
emergency procedure:&lt;br /&gt;
https://www.multitech.net/developer/software/mlinux/using-mlinux/flashing-mlinux-firmware-for-conduit/&lt;br /&gt;
&lt;br /&gt;
=== esp32 wtf ===&lt;br /&gt;
* https://forum.arduino.cc/t/ttgo-lilygo-lora-esp32-26mhz-problem/1353750&lt;br /&gt;
* &amp;quot;26 MHz crystal has been deprecated&amp;quot; https://github.com/espressif/arduino-esp32/issues/10117&lt;br /&gt;
&lt;br /&gt;
=== kakofonie counter ===&lt;br /&gt;
Sample room audio, use neural network to distinguish voices to estimate number of people talking in the past 30 seconds or so.&lt;br /&gt;
Show this number on some kind of display, publish it to MQTT, make a nice graph of it.&lt;br /&gt;
&lt;br /&gt;
Stuff to figure out:&lt;br /&gt;
* this is called &#039;speaker diarization&#039;&lt;br /&gt;
* can it run on an ESP32?&lt;br /&gt;
* make a prototype&lt;br /&gt;
&lt;br /&gt;
=== hypno toad ===&lt;br /&gt;
Put these LEDS https://nl.aliexpress.com/item/1005007583528891.html into https://www.action.com/nl-nl/p/2560347/solar-tuinbeeldje/&lt;br /&gt;
&lt;br /&gt;
Turns out that the default circuit is really basic and output a rough step-up waveform to the LED.&lt;br /&gt;
The self-fading LEDs don&#039;t work very well with that.&lt;br /&gt;
&lt;br /&gt;
Also, putting some IPA on hotglue makes it release really easy.&lt;br /&gt;
&lt;br /&gt;
=== wasbeer / kat classifier ===&lt;br /&gt;
ESP32 with resnet50 neural net to distinguish house cats from other animals, see also:&lt;br /&gt;
* https://ieeexplore.ieee.org/document/10556848/&lt;br /&gt;
&lt;br /&gt;
=== Nespresso brew counter ===&lt;br /&gt;
Several hacker spaces have one of these Nespresso cup coffee makers, but there&#039;s no obvious easy way to monitor usage (monitor ALL the things!).&lt;br /&gt;
Inspired by https://hackaday.com/2021/04/25/arduino-mkr-makes-nespresso-monitoring-easy/ this idea is making an even simpler nespresso monitor,&lt;br /&gt;
using an inexpensive WiFi enabled ESP8266 with an ubiquitous I2S microphone such as the INMP441. &lt;br /&gt;
&lt;br /&gt;
Use this sound monitoring project:&lt;br /&gt;
https://github.com/aleiei/ESP8266-BUG-I2S-MIC&lt;br /&gt;
and turn it into a WiFi connected brew counter.&lt;br /&gt;
&lt;br /&gt;
Software for getting microphone data from an ESP8266/I2S mic into Linux https://github.com/bertrik/EspMicServer&lt;br /&gt;
Nespresso sound is typically 50 Hz with overtones.&lt;br /&gt;
In a recording with the ESP8266, it appears that oddly the 17th harmonic (around 850 Hz) is quite strong.&lt;br /&gt;
&lt;br /&gt;
The plan in the short term is this:&lt;br /&gt;
* apply a gentle IIR filter to subtract any DC bias from the microphone signal&lt;br /&gt;
* calculate autocovariance at offsets 0 and 20 ms (inverse of 50 Hz), representing the total energy and the energy at 50 Hz respectively&lt;br /&gt;
* compare amplitudes to decide about presence of 50 Hz signal, e.g. calculate ratio in dB&lt;br /&gt;
* use this to count the length of time that a 50 Hz signal is heard (increments of 100 ms or so)&lt;br /&gt;
* decide about none / espresso / lungo based on time&lt;br /&gt;
&lt;br /&gt;
Might even integrate with esphome / home assistant later.&lt;br /&gt;
&lt;br /&gt;
=== Remote bat box monitor ===&lt;br /&gt;
Idea:&lt;br /&gt;
* goal: check if remote bat boxes are occupied and identify the species&lt;br /&gt;
* challenges:&lt;br /&gt;
** connectivity: need to transport images/videos (no LoRaWAN), possibly out of range of mobile data networks&lt;br /&gt;
** autonomy: cannot reach the bat box once installed&lt;br /&gt;
** power: no fixed power connection, so probably needs a battery + solar panel&lt;br /&gt;
* design&lt;br /&gt;
** wake up every hour, take a picture, go to sleep, upload photos/videos once per day&lt;br /&gt;
** run from batteries, recharge by solar, rules of thumb&lt;br /&gt;
*** batteries should last for about 10 days&lt;br /&gt;
*** battery should be able to charge in 1 day&lt;br /&gt;
*** consider only 10% of peak solar power&lt;br /&gt;
** KPN &amp;quot;4G-op-zee&amp;quot; somewhat confusing article: https://www.kpn.com/zakelijk/mobiel/roaming/noordzee&lt;br /&gt;
* hardware&lt;br /&gt;
** main processor: raspberry pi zero&lt;br /&gt;
*** raspberry pi power consumption overview: https://www.pidramble.com/wiki/benchmarks/power-consumption&lt;br /&gt;
** this hat to wake up the main CPU: https://www.waveshare.com/wiki/Power_Management_HAT_(B) sold at https://www.kiwi-electronics.com/en/power-management-hat-for-raspberry-pi-with-rtc-and-rp2040-mcu-11373&lt;br /&gt;
&lt;br /&gt;
=== KNMI API ===&lt;br /&gt;
Get familiar with https://developer.dataplatform.knmi.nl/open-data-api&lt;br /&gt;
&lt;br /&gt;
=== Grid frequency measurer with web page ===&lt;br /&gt;
See https://github.com/bertrik/GridFrequency&lt;br /&gt;
SSE source is gridfrequency.local/events&lt;br /&gt;
&lt;br /&gt;
=== WeAct CH55x board ===&lt;br /&gt;
Cheap little boards, using a similar chip as used in USB-serial converters.&lt;br /&gt;
&lt;br /&gt;
The hardware&lt;br /&gt;
https://github.com/WeActStudio/WeActStudio.CH552CoreBoard&lt;br /&gt;
&lt;br /&gt;
Flashing it:&lt;br /&gt;
https://hackaday.io/page/137447-flashing-the-ch552-dev-board-from-the-command-line&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://hackaday.io/project/198238-more-weact-ch5xx&lt;br /&gt;
* https://community.platformio.org/t/manually-adding-support-for-ch55x-controller-by-adding-existing-ardunio-core/41138&lt;br /&gt;
&lt;br /&gt;
=== Zigbee device with esp32 ===&lt;br /&gt;
See https://github.com/P-R-O-C-H-Y/arduino-esp32/blob/8169a434c3e46e1bb7711ebcc04f27267db2093c/libraries/ESP32/examples/Zigbee/Zigbee_Light_Bulb/Zigbee_Light_Bulb.ino&lt;br /&gt;
&lt;br /&gt;
See https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Zigbee&lt;br /&gt;
&lt;br /&gt;
Espressif32 arduino platform git: https://github.com/platformio/platform-espressif32&lt;br /&gt;
&lt;br /&gt;
=== Cameratoezicht in Gouda ===&lt;br /&gt;
Gemeente Gouda publiceert een lijst van camera&#039;s in Gouda, zie&lt;br /&gt;
https://gis.gouda.nl/nl/app/Basisviewer_open#!eAGT8uRiNBRy4ZIRYFKSyKkssjJwdzFxNDMz8TKKsLC0cnb0dQ1y5FIByirgkg3xd43ydPYIAQBXGBFm&lt;br /&gt;
&lt;br /&gt;
Aanmelden (semi-automatisch) bij bijvoorbeeld [https://mapcomplete.org/surveillance Surveillance-under-surveillance] ?&lt;br /&gt;
&lt;br /&gt;
=== SolarEdge ===&lt;br /&gt;
Interact with the solar edge api for PV installations.&lt;br /&gt;
&lt;br /&gt;
https://developers.solaredge.com/&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/solaredge-api&lt;br /&gt;
&lt;br /&gt;
=== Stookalert ===&lt;br /&gt;
Idee: gekleurd lampje dat aangeeft of er op dit moment een stookalert actief is&lt;br /&gt;
&lt;br /&gt;
Implementatie:&lt;br /&gt;
* kijk m.b.v. WiFi locatieservice in welke provincie je je bevindt&lt;br /&gt;
* haal JSON op bij https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* toon de bijbehorende kleur op het lampje&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
* Officiele pagina: https://www.atlasleefomgeving.nl/stookwijzer&lt;br /&gt;
* Achterliggende JSON met toestand per provincie: https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* Er moet ook nog ergens een API zijn die fijnmaziger aangeeft wat de toestand is ...&lt;br /&gt;
&lt;br /&gt;
=== Display of current electricity usage ===&lt;br /&gt;
I have a [https://www.zuidwijk.com/product/slimmelezer-plus/ slimme lezer] connected to the P1 port of my smart electricity meter.&lt;br /&gt;
The default firmware exposes meter readings using an event stream (SSE) at http://slimmelezer.local/events&lt;br /&gt;
&lt;br /&gt;
So for example, you can read this with curl:&lt;br /&gt;
  curl http://slimmelezer.local/events&lt;br /&gt;
With result:&lt;br /&gt;
  event: state&lt;br /&gt;
  data: {&amp;quot;id&amp;quot;:&amp;quot;sensor-power_consumed_phase_1&amp;quot;,&amp;quot;value&amp;quot;:0.046,&amp;quot;state&amp;quot;:&amp;quot;0.046 kW&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Specification of SSE: https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
&lt;br /&gt;
What I would like to do is to read these events and control a simple display to display  the current usage number.&lt;br /&gt;
&lt;br /&gt;
=== Participating in ultrasonic sound project ===&lt;br /&gt;
https://bat-migration-europe.netlify.app/project/&lt;br /&gt;
&lt;br /&gt;
Use an audiomoth for this.&lt;br /&gt;
&lt;br /&gt;
=== ESP32 C3 ===&lt;br /&gt;
* [https://www.espressif.com/en/products/socs/esp32-c3 processor page]&lt;br /&gt;
* [https://wiki.luatos.com/chips/esp32c3/index.html luatos basic esp32 c3 board]&lt;br /&gt;
&lt;br /&gt;
=== Flexible LED ticker ===&lt;br /&gt;
Ordered a flexible 32x8 RGB LED display:&lt;br /&gt;
https://nl.aliexpress.com/item/4001296811800.html&lt;br /&gt;
&lt;br /&gt;
Matching diffuser to be 3D printed:&lt;br /&gt;
https://www.thingiverse.com/thing:1903744&lt;br /&gt;
&lt;br /&gt;
=== Washing machine API ===&lt;br /&gt;
https://tratt.net/laurie/blog/2023/displaying_my_washing_machines_remaining_time_with_curl_jq_pizauth.html&lt;br /&gt;
&lt;br /&gt;
=== TinyML ===&lt;br /&gt;
Investigate TinyML, see https://www.tinyml.org/&lt;br /&gt;
Apparently can run on a RP2040 (raspi pi pico).&lt;br /&gt;
&lt;br /&gt;
https://www.hackster.io/mjrobot/esp32-cam-tinyml-image-classification-fruits-vs-veggies-4ab970&lt;br /&gt;
&lt;br /&gt;
=== Bat box busy signal ===&lt;br /&gt;
My brother built little pyramid &#039;blinkies&#039;: solar cell + Lithium-supercapacitor + harvesting circuit + LED encased in clear expoxy.&lt;br /&gt;
&lt;br /&gt;
Can we add a low-power PIR sensor to this, and make a blinky that blinks if movement was detected by the PIR in the past hour?&lt;br /&gt;
&lt;br /&gt;
=== Super tiny RFID ===&lt;br /&gt;
See https://www.sparkfun.com/products/16464 an almost sand grain size RFID chip, 1.25mmx1.25mmx0.55mm&lt;br /&gt;
&lt;br /&gt;
The accompanying reader &amp;quot;M6E Nano&amp;quot; is still quite expensive at $235.95 : https://www.sparkfun.com/products/14066&lt;br /&gt;
&lt;br /&gt;
Uses the MuRata LXMSJZNCMF-198:&lt;br /&gt;
&amp;quot;This product can be used as an ultra small tag and this can be&lt;br /&gt;
fit on any metal objects, non-metal objects, as well as&lt;br /&gt;
embedding into any objects by glue or adhesive and so on.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See also: ISO18000-63 and EPC global Gen2(v2)&lt;br /&gt;
&lt;br /&gt;
Specification:&lt;br /&gt;
* https://www.gs1.org/standards/rfid/uhf-air-interface-protocol&lt;br /&gt;
&lt;br /&gt;
=== TheThingsNetwork-Sondehub bridge ===&lt;br /&gt;
Uploads balloon telemetry to sondehub.&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/ttnhabbridge/issues/6&lt;br /&gt;
&lt;br /&gt;
=== Actually smart boiler ===&lt;br /&gt;
The boiler for hot water is about half of my electricity bill.&lt;br /&gt;
The idea is to use/build a smart switch that switches it on at time when electricity prices are lowest.&lt;br /&gt;
&lt;br /&gt;
Currently have a &amp;quot;Slimme boiler module&amp;quot; from Eneco, which is *not* actually smart,&lt;br /&gt;
since it allows me no control whatsoever when it switches on (besides cutting the power in the meterkast).&lt;br /&gt;
For example, it will switch on mid-day when my price is high and eneco&#039;s price is low, perhaps good for Eneco, not for me. &lt;br /&gt;
Apparently, they even received a [https://nieuws.eneco.nl/slim-apparaatje-bij-boiler-vangt-pieken-wind--en-zonnestroom-op/ subsidy] for this.&lt;br /&gt;
&lt;br /&gt;
A boiler is a pretty big load, about 3 kW, but it is not inductive.&lt;br /&gt;
&lt;br /&gt;
Alternatives:&lt;br /&gt;
* https://www.shelly.cloud/en-nl/products/product-overview/shelly-plus-1-pm-2-pack/shelly-plus-1-pm&lt;br /&gt;
* https://www.solyxenergy.nl/solar-iboost/ to store excess solar energy in hot water, might also be useful for just controlling a boiler to use cheaper rates&lt;br /&gt;
* tuya smartplug, like https://www.wifilampkoning.nl/merken-slimme-verlichting/tuya/tuya-enkele-smartplug-met-energiemeting ?&lt;br /&gt;
* tuya 20A smart plug: https://nl.aliexpress.com/item/1005003347568206.html&lt;br /&gt;
&lt;br /&gt;
=== Receiving gas meters ===&lt;br /&gt;
Apparently gas meters send gas consumption data to the slimme meter using a wireless link in the 868 MHz band.&lt;br /&gt;
Probably just FSK at 38.4, as mentioned here: https://a35.veron.nl/nieuwe-elektra-en-gasmeters/&lt;br /&gt;
&lt;br /&gt;
Interesting leads:&lt;br /&gt;
* https://github.com/stef/smeter&lt;br /&gt;
* https://www.rtl-sdr.com/reading-household-wireless-utility-meters-with-an-rtl-sdr-and-plotting-the-data-in-home-automation-software/&lt;br /&gt;
* https://github.com/bemasher/rtlamr&lt;br /&gt;
&lt;br /&gt;
=== Multi-network wifi manager ===&lt;br /&gt;
Figure out or create software so that ESP8266/ESP32 wifi manager can use multiple networks to connect (not just one),&lt;br /&gt;
so it allowing storing credentials for more than one network. For example, the network at home, the hacker space, at work.&lt;br /&gt;
Instead of reconfiguring the wifi manager for each network, you just *add* your credentials (and the existing credentials&lt;br /&gt;
are not replaced).&lt;br /&gt;
&lt;br /&gt;
See https://github.com/folkertvanheusden/M.A.X.X&lt;br /&gt;
&lt;br /&gt;
Interesting candidates:&lt;br /&gt;
* https://registry.platformio.org/libraries/martinverges/ESP32%20Wifi%20Manager wifi manager for ESP32, has a REST API for managing wifi network, but is incomplete in the sense that you need to write your own code (e.g. javascript) to actually *use* its API&lt;br /&gt;
* https://github.com/arduino-libraries/Arduino_MultiWiFi is the arduino multi wifi library, to allow connecting to multiple different WiFi networks, but it is not a wifi manager, that starts a captive portal, etc&lt;br /&gt;
&lt;br /&gt;
=== Automated bat counting ===&lt;br /&gt;
Can we automatically count the number of bats from the image of a webcam mounted in a bat colony?&lt;br /&gt;
Perhaps using some kind of AI or machine learning algorithm?&lt;br /&gt;
&lt;br /&gt;
The image in question:&lt;br /&gt;
https://stofradar.nl/coenecoop/&lt;br /&gt;
&lt;br /&gt;
=== Use TheThingsIndoorGateway as Helium/ThingSix hotspot ===&lt;br /&gt;
I have a spare TTIG that could perhaps be used as a Helium gateway, investigate what is possible.&lt;br /&gt;
&lt;br /&gt;
One possiblity is to capture the gateway traffic from the TTN gateway events API, convert uplink data to a format that the Helium network understands and forward it.&lt;br /&gt;
I don&#039;t really care about the Helium crypto tokens, this is just for fun and science.&lt;br /&gt;
&lt;br /&gt;
What I definitely can do:&lt;br /&gt;
* Capture data from the TTN gateway events API, convert it back to Semtech UP format and forward it somewhere to Helium (just not sure where!)&lt;br /&gt;
* See also my https://github.com/bertrik/ttn-gateway-collector project which contains an initial implementation of TTN-to-UDP conversion&lt;br /&gt;
&lt;br /&gt;
Showstoppers:&lt;br /&gt;
* If you want to be a gateway on the Helium network, you have to *pay Helium*! Obviously I don&#039;t want that, I just want to share data to improve *their* network. &lt;br /&gt;
&lt;br /&gt;
Open work:&lt;br /&gt;
* Investigate if Helium has an open uplink API for their hotspots, if so study it etc, without paying the gateway fee&lt;br /&gt;
* Investigate if Thingsix has an open uplink API for their hotspots, if so study it etc, without paying any gateway fee&lt;br /&gt;
* Investigate if Thingsix is just another Helium, with weird crypto money&lt;br /&gt;
&lt;br /&gt;
Interesting stuff:&lt;br /&gt;
* https://docs.helium.com/use-the-network/setup-a-packet-forwarder unfortunately the link to setting up the &#039;light hotspot client&#039; does not work!&lt;br /&gt;
* https://docs.helium.com/mine-hnt/light-hotspots/&lt;br /&gt;
* https://thingsix.com/&lt;br /&gt;
&lt;br /&gt;
=== Adding BLE GATT interface to sensors ===&lt;br /&gt;
The GATT specification allows measurement properties to be defined and transferred continuously over Bluetooth low-energy.&lt;br /&gt;
&lt;br /&gt;
With GATT you can define a collection of properties (e.g. measurement items like temperature/humidity/particulate matter/noise, etc)&lt;br /&gt;
organised in a simple structure of a BLE service.&lt;br /&gt;
The &#039;notification&#039; method allows you to basically push the data continuously to a connected host, e.g. a smart phone.&lt;br /&gt;
&lt;br /&gt;
Services collects characteristic, a characteristic has values with units.&lt;br /&gt;
Each of these (service, characteristic, unit) have their own unique &amp;quot;UUID&amp;quot;.&lt;br /&gt;
This is described in the so-called [https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20Numbers%20Document.pdf 16-bit UUID numbers document]&lt;br /&gt;
&lt;br /&gt;
Interesting stuff in GATT:&lt;br /&gt;
* See GATT_Specification_Supplement_v5 paragraph 3.151, it has a noise characteristic with 1 dB resolution.&lt;br /&gt;
* 0x27C3 is the GATT *unit* for sound pressure&lt;br /&gt;
* 0x181A is the GATT environmental sensing *service*, document name &amp;quot;ESP_V1.0.0.pdf&amp;quot;&lt;br /&gt;
* 0x2A6E is the GATT Characteristic and Object Type for temperature&lt;br /&gt;
* 0x2A6F is the GATT Characteristic and Object Type for humidity&lt;br /&gt;
* 0x2BD5 is the GATT Characteristic and Object Type for Particulate Matter - PM1 Concentration&lt;br /&gt;
* 0x2BD6 is the GATT Characteristic and Object Type for Particulate Matter - PM2.5 Concentration&lt;br /&gt;
* 0x2BD7 is the GATT Characteristic and Object Type for Particulate Matter - PM10 Concentration&lt;br /&gt;
* Unfortunately I cannot find a characteristic for carbon-dioxide (CO2) in the BLE GATT unit document&lt;br /&gt;
&lt;br /&gt;
See also https://programmaticponderings.com/2020/08/04/getting-started-with-bluetooth-low-energy-ble-and-generic-attribute-profile-gatt-specification-for-iot/&lt;br /&gt;
&lt;br /&gt;
=== Reverse engineering XS-8217 bluetooth air quality meter ===&lt;br /&gt;
This is a thing that measures CO2, humidity, temperature, TVOC and formaldehyde.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.liutyi.info/display/CO2/ZN-2CO3+Inside&lt;br /&gt;
&lt;br /&gt;
This teardown looks a lot like my sensor: https://www.youtube.com/watch?v=APnjhMrJChI&lt;br /&gt;
Mine contains a &amp;quot;TPM-300A&amp;quot; sensor for measuring VOC.&lt;br /&gt;
&lt;br /&gt;
It has a bluetooth interface, device name is XS-8217.&lt;br /&gt;
It has a BLE GATT profile, with the following services&lt;br /&gt;
* service 0xC760&lt;br /&gt;
** characteristic 0xC762 (WRITE)&lt;br /&gt;
** characteristic 0xC761 (NOTIFY)&lt;br /&gt;
*** example data: 0x23 0x06 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
*** example data: 0x23 0x08 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
*** data shown on screen was approximately: CO2=418ppm, HCHO=0.003mg/m3, TVOC=0.013mg/m3, temp=24degC, humi=35%&lt;br /&gt;
&lt;br /&gt;
So data in the characteristic 0xC761 seems to have a 4 byte constant header:&lt;br /&gt;
* 0x23&lt;br /&gt;
* length byte&lt;br /&gt;
&lt;br /&gt;
Then we have for the first message: 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0xF1 is temperature in 0.1 degree Celcius most likely (24.1)&lt;br /&gt;
* 0x00 is ...&lt;br /&gt;
* 0x23 is humidity most likely (35)&lt;br /&gt;
* 0x65 is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
And for the second message: 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0x01 0x9A is the CO2 concentration (410)&lt;br /&gt;
* 0x00 0x0A is TVOC most likely (10)&lt;br /&gt;
* 0x00 0x03 is HCHO most likely (3)&lt;br /&gt;
* 0x0E is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
=== ribbon tweeter for bat audio ===&lt;br /&gt;
Someone gave me this idea:&lt;br /&gt;
Use a ribbon tweeter like this for playing back bat audio:&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/4000973201791.html&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/1005002565880660.html&amp;lt;/s&amp;gt;&lt;br /&gt;
https://nl.aliexpress.com/item/1005002635086050.html&lt;br /&gt;
&lt;br /&gt;
The frequency spectrum shows no sign of dropping off at 20 kHz.&lt;br /&gt;
&lt;br /&gt;
=== 3d glasses ===&lt;br /&gt;
I got some 2nd hand 3d glasses, they look exactly like these ones:&lt;br /&gt;
* GH-15 https://www.dhgate.com/product/g15-dlp-3d-active-shutter-glasses-96-144hz/213983026.html&lt;br /&gt;
* Sintron https://www.amazon.de/Sintron-Kompatibel-TDG-BT500A-TDG-BT400A-Deutschland/dp/B015PCWMZ8&lt;br /&gt;
The common name appears to be &amp;quot;G15-DLP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A tear-down here:&lt;br /&gt;
* https://blog.danman.eu/3d-shutter-glasses-teardown/&lt;br /&gt;
&lt;br /&gt;
Interesting documents:&lt;br /&gt;
* http://cmst.curtin.edu.au/wp-content/uploads/sites/4/2016/05/2012-28-woods-helliwell-cross-compatibility_of_shutter_glasses.pdf&lt;br /&gt;
* http://cmst.curtin.edu.au/local/docs/pubs/2011-17-woods-helliwell-3D-Sync-IR.pdf&lt;br /&gt;
&lt;br /&gt;
Someone claims he got something to work with some hacks:&lt;br /&gt;
https://www.avsforum.com/threads/how-i-got-cheap-dlp-link-glasses-to-work-great.1887145/&lt;br /&gt;
&lt;br /&gt;
=== Waterniveaumeter ===&lt;br /&gt;
Op verschillende plekken in Gouda staat er water in de kruipruimte van huizen van bewoners.&lt;br /&gt;
Kunnen we dat meten en inzichtelijk maken, voor bewoners, op een kaart bijvoorbeeld?&lt;br /&gt;
&lt;br /&gt;
Idee:&lt;br /&gt;
* in de kruipruimte plaats je een module die waterhoogte kan meten&lt;br /&gt;
* de module bestaat uit een microcontroller en een afstandsmeter, die de waterhoogte bepaalt&lt;br /&gt;
* de gegevens worden via WiFi doorgestuurd naar een centraal punt, waar de data wordt verwerkt en gevisualiseerd&lt;br /&gt;
* op een webpagina kan je een overzicht zien van alle meters die online zijn&lt;br /&gt;
* de meting wordt gedaan door bijv. een laser-afstandsmeter of een ultrasoon-afstandsmeter&lt;br /&gt;
* voeding? lastig, hoe krijg je 5v naar een potentieel natte plek?&lt;br /&gt;
* kosten? verwachting &amp;lt; E 40,-&lt;br /&gt;
&lt;br /&gt;
In Gouda wordt op veel verschillende plekken de grondwaterstand gemeten, zie https://opendata.munisense.net/portal/wareco-water2/group/581/Gouda-KJ38A , maar:&lt;br /&gt;
* geen visualisatie op de kaart, je ziet alleen de meetlokaties d.m.v. een icoontje!&lt;br /&gt;
* geen meetpunten in Gouda noord!&lt;br /&gt;
&lt;br /&gt;
=== Online bat detector ===&lt;br /&gt;
Idea: use an ultrasonic microphone, connect it to a WebSDR, so people can tune into bat sounds remotely.&lt;br /&gt;
&lt;br /&gt;
=== Raspberry pi airplane tracking ===&lt;br /&gt;
Apparently now you can also participate in MLAT tracking of planes that don&#039;t transmit GPS coordinates themselves.&lt;br /&gt;
&lt;br /&gt;
=== APRS gateway ===&lt;br /&gt;
http://qso365.co.uk/2017/02/a-guide-to-setting-up-an-aprs-receive-only-igate-using-a-raspberry-pi-and-an-rtl-sdr-dongle/&lt;br /&gt;
&lt;br /&gt;
=== JQ6500 ===&lt;br /&gt;
Small inexpensive modules that play mp3 from an internal flash. Could be nice for a custom door bell for example.&lt;br /&gt;
&lt;br /&gt;
More info at: &lt;br /&gt;
* https://www.elecfreaks.com/wiki/index.php?title=JQ6500_Mini_MP3_Module&lt;br /&gt;
* https://sparks.gogo.co.nz/jq6500/index.html&lt;br /&gt;
&lt;br /&gt;
=== FPGA ===&lt;br /&gt;
Cheap FPGA boards and nice applications:&lt;br /&gt;
* https://bitbucket.org/appanp/artificial-neural-networks/wiki/Home/FPGAsAndNeuralNets.md#!sbcs-and-iot-boards &lt;br /&gt;
* [http://nl.aliexpress.com/item/Altera-fpga-cycloneii-ep2c5t144-learning-board-development-board/872520721.html inexpensive ep2c5t144 board] &lt;br /&gt;
* http://land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board&lt;br /&gt;
&lt;br /&gt;
=== Neural networks on low-end hardware ===&lt;br /&gt;
Investigate if you can run a powerful neural network on relatively low-end/cheap/low-power hardware. For example a Raspberry pi.&lt;br /&gt;
A RPI runs Linux, run python, just like some common neural frameworks.&lt;br /&gt;
Do we need hardware acceleration from the GPU and does the RPI GPU support that?&lt;br /&gt;
&lt;br /&gt;
Read list:&lt;br /&gt;
* https://www.zdnet.com/pictures/raspberry-pi-meets-ai-the-projects-that-put-machine-learning-on-the-35-board/&lt;br /&gt;
* https://www.pyimagesearch.com/2017/12/18/keras-deep-learning-raspberry-pi/&lt;br /&gt;
* https://www.indiegogo.com/projects/sipeed-maix-the-world-first-risc-v-64-ai-module#/&lt;br /&gt;
* https://ai.intel.com/intel-neural-compute-stick-2-smarter-faster-plug-and-play-ai-at-the-edge/&lt;br /&gt;
&lt;br /&gt;
Bought a MaixPy:&lt;br /&gt;
* see https://maixpy.sipeed.com/en/&lt;br /&gt;
* see https://www.youtube.com/watch?v=KResVuAIMb4&lt;br /&gt;
* see http://educ8s.tv/sipeed-m1-dock-review/&lt;br /&gt;
* interesting? https://www.instructables.com/id/Transfer-Learning-With-Sipeed-MaiX-and-Arduino-IDE/&lt;br /&gt;
&lt;br /&gt;
=== mini word clock in dutch ===&lt;br /&gt;
Basically an monochrome 8x8 word clock, in Dutch, showing local time in the Netherlands.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bertrik/miniwordclock This git repo] has the current code.&lt;br /&gt;
&lt;br /&gt;
See [https://plus.google.com/103276078656203197145/posts/7ki7rpJzk3a here for a demo] running on an arduino nano.&lt;br /&gt;
&lt;br /&gt;
The plan is to run this from an ESP8266 instead of an arduino nano, so it can get the time from the internet using NTP.&lt;br /&gt;
Andreas Spiess demonstrated on youtube how existing libraries on the ESP8266 can be used to do the local time (including summer-time) calculations.&lt;br /&gt;
&lt;br /&gt;
=== Cypress PSOC5 ===&lt;br /&gt;
Play with the Cypress PSOC5 platform, which combines a ARM Cortex-m3 processor with configurable analog blocks. I&#039;m thinking of combining it with a 24 GHz doppler radar sensor, to process the signal and present it as a USB audio device (stereo signal contains I and Q parts). See [[RadarOnAStick]].&lt;br /&gt;
&lt;br /&gt;
=== Simple Doppler motion sensors ===&lt;br /&gt;
You can find basic doppler microwave motion sensors based on a single transistor, with some weird traces on the PCB very cheaply, for example&lt;br /&gt;
* https://www.aliexpress.com/item/RCWL-0516-microwave-radar-sensor-module-Human-body-induction-switch-module-Intelligent-sensor/32708877914.html&lt;br /&gt;
&lt;br /&gt;
Typically the microwave part of these consists of a single transistor with a rectangular area on one leg and a meandering trace (with lots of vias to the other side) on the other leg.&lt;br /&gt;
The output of this circuit seems to go into a chip very much like the ones used in PIR sensors.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/jdesbonnet/RCWL-0516 for a reverse engineering effort of these doppler radar modules.&lt;br /&gt;
&lt;br /&gt;
=== Bare-bones Arduino bat detector ===&lt;br /&gt;
This is an idea for a very basic heterodyne bat detector, doing signal processing on an Arduino, requiring minimal external components.&lt;br /&gt;
&lt;br /&gt;
The basic principle of a heterodyne detector is that it just mixes (multiplies) the audio signal with a square wave, low-pass filters the result and puts it on a speaker.&lt;br /&gt;
&lt;br /&gt;
Multiplying with a square wave can also be considered to be just alternatively inverting and not-inverting the signal.&lt;br /&gt;
So if you sample an ultrasonic signal at twice the rate you want to multiply, you can just subtract odd samples from even samples and low-pass filter that.&lt;br /&gt;
&lt;br /&gt;
How this can be done in an AVR Arduino:&lt;br /&gt;
* sample the audio signal at twice the detection frequency, say 84 kHz. An AVR should just be able to do that.&lt;br /&gt;
* apply a 1-pole IIR high-pass filter to remove DC bias, this takes one shift instruction and one addition.&lt;br /&gt;
* multiply by the detection frequency, this means just inverting the odd samples.&lt;br /&gt;
* low-pass filter the signal, this can be done using a moving average filter, say 16 samples long (first null at 5.25 kHz). Theoretically, averaging 16 samples should result in two bits extra accuracy. This operation takes some storage, an addition and a subtraction.&lt;br /&gt;
* output the filtered signal using PWM, possibly at the same rate that we are sampling the input audio.&lt;br /&gt;
&lt;br /&gt;
The microphone can be a 40 kHz piezo transducer, to keep it cheap (but also limited to 40 kHz).&lt;br /&gt;
The pre-amplifier can be a single transistor with some resistors around it, providing about 40x gain.&lt;br /&gt;
The arduino does the signal processing (mixing, low-pass filter) to shift the bat audio to human range.&lt;br /&gt;
The speaker amplifier can just be a simple two transistor push-pull circuit, since the output from the Arduino is digital/PWM.&lt;br /&gt;
&lt;br /&gt;
==== AVR Arduino sample rate ====&lt;br /&gt;
As far as I understand, the ADC clock can be set to 1 MHz.&lt;br /&gt;
Conversion takes 13 cycles, so this can be a problem to reach a sample rate above 80 kHz.&lt;br /&gt;
&lt;br /&gt;
=== Indoor radar speed sign ===&lt;br /&gt;
This idea about placing a simple IQ-output radar sensor indoors in the hacker space, do some basic signal processing on the IQ doppler signal and determine movement speed and direction, then display this on a LED display.&lt;br /&gt;
This is of no immediate practical use other than fun, but helps me to gain a bit more experience with microwave radar sensors and eventually build a more effective setup for detecting/counting bats flying in and out of a roost.&lt;br /&gt;
&lt;br /&gt;
Implement this on a PSOC5 platform or on the STM32 using Arduino.&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=34992</id>
		<title>User:Bertrik Sikken</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=34992"/>
		<updated>2026-01-17T11:50:09Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* investigate thread/matter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Smoel&lt;br /&gt;
 |Name=Bertrik Sikken&lt;br /&gt;
 |Nick=bertrik&lt;br /&gt;
 |Tagline=heb ik niet&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You can reach me at [mailto:bertrik@sikken.nl bertrik@sikken.nl] or [mailto:bertrik@gmail.com bertrik@gmail.com].&lt;br /&gt;
&lt;br /&gt;
Studied Electrical Engineering at Twente University.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Main interests:&lt;br /&gt;
* reverse-engineering things (USB stuff, mp3 players), worked on http://rockbox.org (sansa clip players)&lt;br /&gt;
* studying bats and making electronics for recording/listening to bat sounds&lt;br /&gt;
* radio stuff, in particular software-defined radio&lt;br /&gt;
* energy-related stuff, visualisation&lt;br /&gt;
* citizen science, particulate matter measurement, noise&lt;br /&gt;
&lt;br /&gt;
Projects I work(ed) on ([https://revspace.nl/index.php?title=User:Bertrik_Sikken&amp;amp;action=purge refresh]):&lt;br /&gt;
{{#ask:[[Category:Project]][[Project Contact::bertrik]]&lt;br /&gt;
|?Project Status&lt;br /&gt;
|headers=show&lt;br /&gt;
|link=all&lt;br /&gt;
|order=ASC,ASC&lt;br /&gt;
|sort=Project Status,Project Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project ideas ==&lt;br /&gt;
[[File:always10oclock.jpg|right]]&lt;br /&gt;
[[File:idea.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas I&#039;m thinking about, but have not fully developed into an actual project yet.&lt;br /&gt;
&lt;br /&gt;
https://pine64.com/product/128mb-ox64-sbc-available-on-december-2-2022/&lt;br /&gt;
&lt;br /&gt;
=== investigate thread/matter ===&lt;br /&gt;
Matter/thread is the new IKEA standard for home automation thins apparently. &lt;br /&gt;
Thread is the wireless protocol, matter is a home automation protocol running on top of thread.&lt;br /&gt;
&lt;br /&gt;
I have a couple of nrf52840, these are good in doing thread.&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* check out openthread&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/openthread/openthread.git&lt;br /&gt;
cd openthread&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Prepare development environment:&lt;br /&gt;
  scripts/bootstrap&lt;br /&gt;
* Build it:&lt;br /&gt;
  ./script/build nrf52840 UART_trans -DOT_LOG_LEVEL=OT_LOG_LEVEL_INFO&lt;br /&gt;
&lt;br /&gt;
Thread on ESP32:&lt;br /&gt;
* on ESP32 C6 https://gist.github.com/gtxaspec/d26198daadfb0a8b0a0edeae2d3fd58f&lt;br /&gt;
* https://github.com/espressif/esp-thread-br&lt;br /&gt;
* https://github.com/espressif/esp-idf/tree/master/examples/openthread/ot_rcp&lt;br /&gt;
&lt;br /&gt;
=== action lsc stekker ===&lt;br /&gt;
https://keetsupport.nl/2024/03/20/how-to-flash-lsc-power-plug-with-esphome/&lt;br /&gt;
&lt;br /&gt;
https://community.home-assistant.io/t/detailed-guide-on-how-to-flash-the-new-tuya-beken-chips-with-openbk7231t/437276&lt;br /&gt;
&lt;br /&gt;
=== sipeed maix dock ===&lt;br /&gt;
Bought this a couple of years ago. Get familiar with this board.&lt;br /&gt;
Can I run a chess program on this, for example?&lt;br /&gt;
&lt;br /&gt;
* https://wiki.sipeed.com/soft/maixpy/en/develop_kit_board/maix_dock.html&lt;br /&gt;
&lt;br /&gt;
=== rfid keyfob ===&lt;br /&gt;
* aliexpress page: https://nl.aliexpress.com/item/1005009569496736.html&lt;br /&gt;
* firmware github: &lt;br /&gt;
** https://github.com/RfidResearchGroup/ChameleonUltra&lt;br /&gt;
** https://github.com/GameTec-live/ChameleonUltraGUI&lt;br /&gt;
&lt;br /&gt;
=== advanced lidars for bat detection ===&lt;br /&gt;
livox:&lt;br /&gt;
* github page https://github.com/Livox-SDK/Livox-SDK/tree/master&lt;br /&gt;
* web page: https://www.livoxtech.com/&lt;br /&gt;
&lt;br /&gt;
=== cubecell meshtastic motion detector ===&lt;br /&gt;
I have a cubecell AB01 board.&lt;br /&gt;
This board is focused on low power, has a connection to attach a solar panel and has a lora radio.&lt;br /&gt;
Relatively small amount of RAM, barely enough to run a LoRaWAN stack but probably plenty to run meshtastic&lt;br /&gt;
&lt;br /&gt;
The plan is to build a simple motion detector from this (using a PIR).&lt;br /&gt;
The PIR can wake up the board from low-power, or a timer can wake it periodically.&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/HelTecAutomation/CubeCell-Arduino/tree/master/libraries/Basics/examples/LowPower&lt;br /&gt;
&lt;br /&gt;
=== configure multitech outdoor gateway ===&lt;br /&gt;
https://www.multitech.net/developer/products/multiconnect-conduit-platform/basestation/&lt;br /&gt;
&lt;br /&gt;
https://multitech.com/product/multitech-conduit-mtcdt-246a-868-eu-gb/&lt;br /&gt;
&lt;br /&gt;
emergency procedure:&lt;br /&gt;
https://www.multitech.net/developer/software/mlinux/using-mlinux/flashing-mlinux-firmware-for-conduit/&lt;br /&gt;
&lt;br /&gt;
=== esp32 wtf ===&lt;br /&gt;
* https://forum.arduino.cc/t/ttgo-lilygo-lora-esp32-26mhz-problem/1353750&lt;br /&gt;
* &amp;quot;26 MHz crystal has been deprecated&amp;quot; https://github.com/espressif/arduino-esp32/issues/10117&lt;br /&gt;
&lt;br /&gt;
=== kakofonie counter ===&lt;br /&gt;
Sample room audio, use neural network to distinguish voices to estimate number of people talking in the past 30 seconds or so.&lt;br /&gt;
Show this number on some kind of display, publish it to MQTT, make a nice graph of it.&lt;br /&gt;
&lt;br /&gt;
Stuff to figure out:&lt;br /&gt;
* this is called &#039;speaker diarization&#039;&lt;br /&gt;
* can it run on an ESP32?&lt;br /&gt;
* make a prototype&lt;br /&gt;
&lt;br /&gt;
=== hypno toad ===&lt;br /&gt;
Put these LEDS https://nl.aliexpress.com/item/1005007583528891.html into https://www.action.com/nl-nl/p/2560347/solar-tuinbeeldje/&lt;br /&gt;
&lt;br /&gt;
Turns out that the default circuit is really basic and output a rough step-up waveform to the LED.&lt;br /&gt;
The self-fading LEDs don&#039;t work very well with that.&lt;br /&gt;
&lt;br /&gt;
Also, putting some IPA on hotglue makes it release really easy.&lt;br /&gt;
&lt;br /&gt;
=== wasbeer / kat classifier ===&lt;br /&gt;
ESP32 with resnet50 neural net to distinguish house cats from other animals, see also:&lt;br /&gt;
* https://ieeexplore.ieee.org/document/10556848/&lt;br /&gt;
&lt;br /&gt;
=== Nespresso brew counter ===&lt;br /&gt;
Several hacker spaces have one of these Nespresso cup coffee makers, but there&#039;s no obvious easy way to monitor usage (monitor ALL the things!).&lt;br /&gt;
Inspired by https://hackaday.com/2021/04/25/arduino-mkr-makes-nespresso-monitoring-easy/ this idea is making an even simpler nespresso monitor,&lt;br /&gt;
using an inexpensive WiFi enabled ESP8266 with an ubiquitous I2S microphone such as the INMP441. &lt;br /&gt;
&lt;br /&gt;
Use this sound monitoring project:&lt;br /&gt;
https://github.com/aleiei/ESP8266-BUG-I2S-MIC&lt;br /&gt;
and turn it into a WiFi connected brew counter.&lt;br /&gt;
&lt;br /&gt;
Software for getting microphone data from an ESP8266/I2S mic into Linux https://github.com/bertrik/EspMicServer&lt;br /&gt;
Nespresso sound is typically 50 Hz with overtones.&lt;br /&gt;
In a recording with the ESP8266, it appears that oddly the 17th harmonic (around 850 Hz) is quite strong.&lt;br /&gt;
&lt;br /&gt;
The plan in the short term is this:&lt;br /&gt;
* apply a gentle IIR filter to subtract any DC bias from the microphone signal&lt;br /&gt;
* calculate autocovariance at offsets 0 and 20 ms (inverse of 50 Hz), representing the total energy and the energy at 50 Hz respectively&lt;br /&gt;
* compare amplitudes to decide about presence of 50 Hz signal, e.g. calculate ratio in dB&lt;br /&gt;
* use this to count the length of time that a 50 Hz signal is heard (increments of 100 ms or so)&lt;br /&gt;
* decide about none / espresso / lungo based on time&lt;br /&gt;
&lt;br /&gt;
Might even integrate with esphome / home assistant later.&lt;br /&gt;
&lt;br /&gt;
=== Remote bat box monitor ===&lt;br /&gt;
Idea:&lt;br /&gt;
* goal: check if remote bat boxes are occupied and identify the species&lt;br /&gt;
* challenges:&lt;br /&gt;
** connectivity: need to transport images/videos (no LoRaWAN), possibly out of range of mobile data networks&lt;br /&gt;
** autonomy: cannot reach the bat box once installed&lt;br /&gt;
** power: no fixed power connection, so probably needs a battery + solar panel&lt;br /&gt;
* design&lt;br /&gt;
** wake up every hour, take a picture, go to sleep, upload photos/videos once per day&lt;br /&gt;
** run from batteries, recharge by solar, rules of thumb&lt;br /&gt;
*** batteries should last for about 10 days&lt;br /&gt;
*** battery should be able to charge in 1 day&lt;br /&gt;
*** consider only 10% of peak solar power&lt;br /&gt;
** KPN &amp;quot;4G-op-zee&amp;quot; somewhat confusing article: https://www.kpn.com/zakelijk/mobiel/roaming/noordzee&lt;br /&gt;
* hardware&lt;br /&gt;
** main processor: raspberry pi zero&lt;br /&gt;
*** raspberry pi power consumption overview: https://www.pidramble.com/wiki/benchmarks/power-consumption&lt;br /&gt;
** this hat to wake up the main CPU: https://www.waveshare.com/wiki/Power_Management_HAT_(B) sold at https://www.kiwi-electronics.com/en/power-management-hat-for-raspberry-pi-with-rtc-and-rp2040-mcu-11373&lt;br /&gt;
&lt;br /&gt;
=== KNMI API ===&lt;br /&gt;
Get familiar with https://developer.dataplatform.knmi.nl/open-data-api&lt;br /&gt;
&lt;br /&gt;
=== Grid frequency measurer with web page ===&lt;br /&gt;
See https://github.com/bertrik/GridFrequency&lt;br /&gt;
SSE source is gridfrequency.local/events&lt;br /&gt;
&lt;br /&gt;
=== WeAct CH55x board ===&lt;br /&gt;
Cheap little boards, using a similar chip as used in USB-serial converters.&lt;br /&gt;
&lt;br /&gt;
The hardware&lt;br /&gt;
https://github.com/WeActStudio/WeActStudio.CH552CoreBoard&lt;br /&gt;
&lt;br /&gt;
Flashing it:&lt;br /&gt;
https://hackaday.io/page/137447-flashing-the-ch552-dev-board-from-the-command-line&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://hackaday.io/project/198238-more-weact-ch5xx&lt;br /&gt;
* https://community.platformio.org/t/manually-adding-support-for-ch55x-controller-by-adding-existing-ardunio-core/41138&lt;br /&gt;
&lt;br /&gt;
=== Zigbee device with esp32 ===&lt;br /&gt;
See https://github.com/P-R-O-C-H-Y/arduino-esp32/blob/8169a434c3e46e1bb7711ebcc04f27267db2093c/libraries/ESP32/examples/Zigbee/Zigbee_Light_Bulb/Zigbee_Light_Bulb.ino&lt;br /&gt;
&lt;br /&gt;
See https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Zigbee&lt;br /&gt;
&lt;br /&gt;
Espressif32 arduino platform git: https://github.com/platformio/platform-espressif32&lt;br /&gt;
&lt;br /&gt;
=== Cameratoezicht in Gouda ===&lt;br /&gt;
Gemeente Gouda publiceert een lijst van camera&#039;s in Gouda, zie&lt;br /&gt;
https://gis.gouda.nl/nl/app/Basisviewer_open#!eAGT8uRiNBRy4ZIRYFKSyKkssjJwdzFxNDMz8TKKsLC0cnb0dQ1y5FIByirgkg3xd43ydPYIAQBXGBFm&lt;br /&gt;
&lt;br /&gt;
Aanmelden (semi-automatisch) bij bijvoorbeeld [https://mapcomplete.org/surveillance Surveillance-under-surveillance] ?&lt;br /&gt;
&lt;br /&gt;
=== SolarEdge ===&lt;br /&gt;
Interact with the solar edge api for PV installations.&lt;br /&gt;
&lt;br /&gt;
https://developers.solaredge.com/&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/solaredge-api&lt;br /&gt;
&lt;br /&gt;
=== Stookalert ===&lt;br /&gt;
Idee: gekleurd lampje dat aangeeft of er op dit moment een stookalert actief is&lt;br /&gt;
&lt;br /&gt;
Implementatie:&lt;br /&gt;
* kijk m.b.v. WiFi locatieservice in welke provincie je je bevindt&lt;br /&gt;
* haal JSON op bij https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* toon de bijbehorende kleur op het lampje&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
* Officiele pagina: https://www.atlasleefomgeving.nl/stookwijzer&lt;br /&gt;
* Achterliggende JSON met toestand per provincie: https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* Er moet ook nog ergens een API zijn die fijnmaziger aangeeft wat de toestand is ...&lt;br /&gt;
&lt;br /&gt;
=== Display of current electricity usage ===&lt;br /&gt;
I have a [https://www.zuidwijk.com/product/slimmelezer-plus/ slimme lezer] connected to the P1 port of my smart electricity meter.&lt;br /&gt;
The default firmware exposes meter readings using an event stream (SSE) at http://slimmelezer.local/events&lt;br /&gt;
&lt;br /&gt;
So for example, you can read this with curl:&lt;br /&gt;
  curl http://slimmelezer.local/events&lt;br /&gt;
With result:&lt;br /&gt;
  event: state&lt;br /&gt;
  data: {&amp;quot;id&amp;quot;:&amp;quot;sensor-power_consumed_phase_1&amp;quot;,&amp;quot;value&amp;quot;:0.046,&amp;quot;state&amp;quot;:&amp;quot;0.046 kW&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Specification of SSE: https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
&lt;br /&gt;
What I would like to do is to read these events and control a simple display to display  the current usage number.&lt;br /&gt;
&lt;br /&gt;
=== Participating in ultrasonic sound project ===&lt;br /&gt;
https://bat-migration-europe.netlify.app/project/&lt;br /&gt;
&lt;br /&gt;
Use an audiomoth for this.&lt;br /&gt;
&lt;br /&gt;
=== ESP32 C3 ===&lt;br /&gt;
* [https://www.espressif.com/en/products/socs/esp32-c3 processor page]&lt;br /&gt;
* [https://wiki.luatos.com/chips/esp32c3/index.html luatos basic esp32 c3 board]&lt;br /&gt;
&lt;br /&gt;
=== Flexible LED ticker ===&lt;br /&gt;
Ordered a flexible 32x8 RGB LED display:&lt;br /&gt;
https://nl.aliexpress.com/item/4001296811800.html&lt;br /&gt;
&lt;br /&gt;
Matching diffuser to be 3D printed:&lt;br /&gt;
https://www.thingiverse.com/thing:1903744&lt;br /&gt;
&lt;br /&gt;
=== Washing machine API ===&lt;br /&gt;
https://tratt.net/laurie/blog/2023/displaying_my_washing_machines_remaining_time_with_curl_jq_pizauth.html&lt;br /&gt;
&lt;br /&gt;
=== TinyML ===&lt;br /&gt;
Investigate TinyML, see https://www.tinyml.org/&lt;br /&gt;
Apparently can run on a RP2040 (raspi pi pico).&lt;br /&gt;
&lt;br /&gt;
https://www.hackster.io/mjrobot/esp32-cam-tinyml-image-classification-fruits-vs-veggies-4ab970&lt;br /&gt;
&lt;br /&gt;
=== Bat box busy signal ===&lt;br /&gt;
My brother built little pyramid &#039;blinkies&#039;: solar cell + Lithium-supercapacitor + harvesting circuit + LED encased in clear expoxy.&lt;br /&gt;
&lt;br /&gt;
Can we add a low-power PIR sensor to this, and make a blinky that blinks if movement was detected by the PIR in the past hour?&lt;br /&gt;
&lt;br /&gt;
=== Super tiny RFID ===&lt;br /&gt;
See https://www.sparkfun.com/products/16464 an almost sand grain size RFID chip, 1.25mmx1.25mmx0.55mm&lt;br /&gt;
&lt;br /&gt;
The accompanying reader &amp;quot;M6E Nano&amp;quot; is still quite expensive at $235.95 : https://www.sparkfun.com/products/14066&lt;br /&gt;
&lt;br /&gt;
Uses the MuRata LXMSJZNCMF-198:&lt;br /&gt;
&amp;quot;This product can be used as an ultra small tag and this can be&lt;br /&gt;
fit on any metal objects, non-metal objects, as well as&lt;br /&gt;
embedding into any objects by glue or adhesive and so on.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See also: ISO18000-63 and EPC global Gen2(v2)&lt;br /&gt;
&lt;br /&gt;
Specification:&lt;br /&gt;
* https://www.gs1.org/standards/rfid/uhf-air-interface-protocol&lt;br /&gt;
&lt;br /&gt;
=== TheThingsNetwork-Sondehub bridge ===&lt;br /&gt;
Uploads balloon telemetry to sondehub.&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/ttnhabbridge/issues/6&lt;br /&gt;
&lt;br /&gt;
=== Actually smart boiler ===&lt;br /&gt;
The boiler for hot water is about half of my electricity bill.&lt;br /&gt;
The idea is to use/build a smart switch that switches it on at time when electricity prices are lowest.&lt;br /&gt;
&lt;br /&gt;
Currently have a &amp;quot;Slimme boiler module&amp;quot; from Eneco, which is *not* actually smart,&lt;br /&gt;
since it allows me no control whatsoever when it switches on (besides cutting the power in the meterkast).&lt;br /&gt;
For example, it will switch on mid-day when my price is high and eneco&#039;s price is low, perhaps good for Eneco, not for me. &lt;br /&gt;
Apparently, they even received a [https://nieuws.eneco.nl/slim-apparaatje-bij-boiler-vangt-pieken-wind--en-zonnestroom-op/ subsidy] for this.&lt;br /&gt;
&lt;br /&gt;
A boiler is a pretty big load, about 3 kW, but it is not inductive.&lt;br /&gt;
&lt;br /&gt;
Alternatives:&lt;br /&gt;
* https://www.shelly.cloud/en-nl/products/product-overview/shelly-plus-1-pm-2-pack/shelly-plus-1-pm&lt;br /&gt;
* https://www.solyxenergy.nl/solar-iboost/ to store excess solar energy in hot water, might also be useful for just controlling a boiler to use cheaper rates&lt;br /&gt;
* tuya smartplug, like https://www.wifilampkoning.nl/merken-slimme-verlichting/tuya/tuya-enkele-smartplug-met-energiemeting ?&lt;br /&gt;
* tuya 20A smart plug: https://nl.aliexpress.com/item/1005003347568206.html&lt;br /&gt;
&lt;br /&gt;
=== Receiving gas meters ===&lt;br /&gt;
Apparently gas meters send gas consumption data to the slimme meter using a wireless link in the 868 MHz band.&lt;br /&gt;
Probably just FSK at 38.4, as mentioned here: https://a35.veron.nl/nieuwe-elektra-en-gasmeters/&lt;br /&gt;
&lt;br /&gt;
Interesting leads:&lt;br /&gt;
* https://github.com/stef/smeter&lt;br /&gt;
* https://www.rtl-sdr.com/reading-household-wireless-utility-meters-with-an-rtl-sdr-and-plotting-the-data-in-home-automation-software/&lt;br /&gt;
* https://github.com/bemasher/rtlamr&lt;br /&gt;
&lt;br /&gt;
=== Multi-network wifi manager ===&lt;br /&gt;
Figure out or create software so that ESP8266/ESP32 wifi manager can use multiple networks to connect (not just one),&lt;br /&gt;
so it allowing storing credentials for more than one network. For example, the network at home, the hacker space, at work.&lt;br /&gt;
Instead of reconfiguring the wifi manager for each network, you just *add* your credentials (and the existing credentials&lt;br /&gt;
are not replaced).&lt;br /&gt;
&lt;br /&gt;
See https://github.com/folkertvanheusden/M.A.X.X&lt;br /&gt;
&lt;br /&gt;
Interesting candidates:&lt;br /&gt;
* https://registry.platformio.org/libraries/martinverges/ESP32%20Wifi%20Manager wifi manager for ESP32, has a REST API for managing wifi network, but is incomplete in the sense that you need to write your own code (e.g. javascript) to actually *use* its API&lt;br /&gt;
* https://github.com/arduino-libraries/Arduino_MultiWiFi is the arduino multi wifi library, to allow connecting to multiple different WiFi networks, but it is not a wifi manager, that starts a captive portal, etc&lt;br /&gt;
&lt;br /&gt;
=== Automated bat counting ===&lt;br /&gt;
Can we automatically count the number of bats from the image of a webcam mounted in a bat colony?&lt;br /&gt;
Perhaps using some kind of AI or machine learning algorithm?&lt;br /&gt;
&lt;br /&gt;
The image in question:&lt;br /&gt;
https://stofradar.nl/coenecoop/&lt;br /&gt;
&lt;br /&gt;
=== Use TheThingsIndoorGateway as Helium/ThingSix hotspot ===&lt;br /&gt;
I have a spare TTIG that could perhaps be used as a Helium gateway, investigate what is possible.&lt;br /&gt;
&lt;br /&gt;
One possiblity is to capture the gateway traffic from the TTN gateway events API, convert uplink data to a format that the Helium network understands and forward it.&lt;br /&gt;
I don&#039;t really care about the Helium crypto tokens, this is just for fun and science.&lt;br /&gt;
&lt;br /&gt;
What I definitely can do:&lt;br /&gt;
* Capture data from the TTN gateway events API, convert it back to Semtech UP format and forward it somewhere to Helium (just not sure where!)&lt;br /&gt;
* See also my https://github.com/bertrik/ttn-gateway-collector project which contains an initial implementation of TTN-to-UDP conversion&lt;br /&gt;
&lt;br /&gt;
Showstoppers:&lt;br /&gt;
* If you want to be a gateway on the Helium network, you have to *pay Helium*! Obviously I don&#039;t want that, I just want to share data to improve *their* network. &lt;br /&gt;
&lt;br /&gt;
Open work:&lt;br /&gt;
* Investigate if Helium has an open uplink API for their hotspots, if so study it etc, without paying the gateway fee&lt;br /&gt;
* Investigate if Thingsix has an open uplink API for their hotspots, if so study it etc, without paying any gateway fee&lt;br /&gt;
* Investigate if Thingsix is just another Helium, with weird crypto money&lt;br /&gt;
&lt;br /&gt;
Interesting stuff:&lt;br /&gt;
* https://docs.helium.com/use-the-network/setup-a-packet-forwarder unfortunately the link to setting up the &#039;light hotspot client&#039; does not work!&lt;br /&gt;
* https://docs.helium.com/mine-hnt/light-hotspots/&lt;br /&gt;
* https://thingsix.com/&lt;br /&gt;
&lt;br /&gt;
=== Adding BLE GATT interface to sensors ===&lt;br /&gt;
The GATT specification allows measurement properties to be defined and transferred continuously over Bluetooth low-energy.&lt;br /&gt;
&lt;br /&gt;
With GATT you can define a collection of properties (e.g. measurement items like temperature/humidity/particulate matter/noise, etc)&lt;br /&gt;
organised in a simple structure of a BLE service.&lt;br /&gt;
The &#039;notification&#039; method allows you to basically push the data continuously to a connected host, e.g. a smart phone.&lt;br /&gt;
&lt;br /&gt;
Services collects characteristic, a characteristic has values with units.&lt;br /&gt;
Each of these (service, characteristic, unit) have their own unique &amp;quot;UUID&amp;quot;.&lt;br /&gt;
This is described in the so-called [https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20Numbers%20Document.pdf 16-bit UUID numbers document]&lt;br /&gt;
&lt;br /&gt;
Interesting stuff in GATT:&lt;br /&gt;
* See GATT_Specification_Supplement_v5 paragraph 3.151, it has a noise characteristic with 1 dB resolution.&lt;br /&gt;
* 0x27C3 is the GATT *unit* for sound pressure&lt;br /&gt;
* 0x181A is the GATT environmental sensing *service*, document name &amp;quot;ESP_V1.0.0.pdf&amp;quot;&lt;br /&gt;
* 0x2A6E is the GATT Characteristic and Object Type for temperature&lt;br /&gt;
* 0x2A6F is the GATT Characteristic and Object Type for humidity&lt;br /&gt;
* 0x2BD5 is the GATT Characteristic and Object Type for Particulate Matter - PM1 Concentration&lt;br /&gt;
* 0x2BD6 is the GATT Characteristic and Object Type for Particulate Matter - PM2.5 Concentration&lt;br /&gt;
* 0x2BD7 is the GATT Characteristic and Object Type for Particulate Matter - PM10 Concentration&lt;br /&gt;
* Unfortunately I cannot find a characteristic for carbon-dioxide (CO2) in the BLE GATT unit document&lt;br /&gt;
&lt;br /&gt;
See also https://programmaticponderings.com/2020/08/04/getting-started-with-bluetooth-low-energy-ble-and-generic-attribute-profile-gatt-specification-for-iot/&lt;br /&gt;
&lt;br /&gt;
=== Reverse engineering XS-8217 bluetooth air quality meter ===&lt;br /&gt;
This is a thing that measures CO2, humidity, temperature, TVOC and formaldehyde.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.liutyi.info/display/CO2/ZN-2CO3+Inside&lt;br /&gt;
&lt;br /&gt;
This teardown looks a lot like my sensor: https://www.youtube.com/watch?v=APnjhMrJChI&lt;br /&gt;
Mine contains a &amp;quot;TPM-300A&amp;quot; sensor for measuring VOC.&lt;br /&gt;
&lt;br /&gt;
It has a bluetooth interface, device name is XS-8217.&lt;br /&gt;
It has a BLE GATT profile, with the following services&lt;br /&gt;
* service 0xC760&lt;br /&gt;
** characteristic 0xC762 (WRITE)&lt;br /&gt;
** characteristic 0xC761 (NOTIFY)&lt;br /&gt;
*** example data: 0x23 0x06 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
*** example data: 0x23 0x08 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
*** data shown on screen was approximately: CO2=418ppm, HCHO=0.003mg/m3, TVOC=0.013mg/m3, temp=24degC, humi=35%&lt;br /&gt;
&lt;br /&gt;
So data in the characteristic 0xC761 seems to have a 4 byte constant header:&lt;br /&gt;
* 0x23&lt;br /&gt;
* length byte&lt;br /&gt;
&lt;br /&gt;
Then we have for the first message: 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0xF1 is temperature in 0.1 degree Celcius most likely (24.1)&lt;br /&gt;
* 0x00 is ...&lt;br /&gt;
* 0x23 is humidity most likely (35)&lt;br /&gt;
* 0x65 is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
And for the second message: 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0x01 0x9A is the CO2 concentration (410)&lt;br /&gt;
* 0x00 0x0A is TVOC most likely (10)&lt;br /&gt;
* 0x00 0x03 is HCHO most likely (3)&lt;br /&gt;
* 0x0E is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
=== ribbon tweeter for bat audio ===&lt;br /&gt;
Someone gave me this idea:&lt;br /&gt;
Use a ribbon tweeter like this for playing back bat audio:&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/4000973201791.html&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/1005002565880660.html&amp;lt;/s&amp;gt;&lt;br /&gt;
https://nl.aliexpress.com/item/1005002635086050.html&lt;br /&gt;
&lt;br /&gt;
The frequency spectrum shows no sign of dropping off at 20 kHz.&lt;br /&gt;
&lt;br /&gt;
=== 3d glasses ===&lt;br /&gt;
I got some 2nd hand 3d glasses, they look exactly like these ones:&lt;br /&gt;
* GH-15 https://www.dhgate.com/product/g15-dlp-3d-active-shutter-glasses-96-144hz/213983026.html&lt;br /&gt;
* Sintron https://www.amazon.de/Sintron-Kompatibel-TDG-BT500A-TDG-BT400A-Deutschland/dp/B015PCWMZ8&lt;br /&gt;
The common name appears to be &amp;quot;G15-DLP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A tear-down here:&lt;br /&gt;
* https://blog.danman.eu/3d-shutter-glasses-teardown/&lt;br /&gt;
&lt;br /&gt;
Interesting documents:&lt;br /&gt;
* http://cmst.curtin.edu.au/wp-content/uploads/sites/4/2016/05/2012-28-woods-helliwell-cross-compatibility_of_shutter_glasses.pdf&lt;br /&gt;
* http://cmst.curtin.edu.au/local/docs/pubs/2011-17-woods-helliwell-3D-Sync-IR.pdf&lt;br /&gt;
&lt;br /&gt;
Someone claims he got something to work with some hacks:&lt;br /&gt;
https://www.avsforum.com/threads/how-i-got-cheap-dlp-link-glasses-to-work-great.1887145/&lt;br /&gt;
&lt;br /&gt;
=== Waterniveaumeter ===&lt;br /&gt;
Op verschillende plekken in Gouda staat er water in de kruipruimte van huizen van bewoners.&lt;br /&gt;
Kunnen we dat meten en inzichtelijk maken, voor bewoners, op een kaart bijvoorbeeld?&lt;br /&gt;
&lt;br /&gt;
Idee:&lt;br /&gt;
* in de kruipruimte plaats je een module die waterhoogte kan meten&lt;br /&gt;
* de module bestaat uit een microcontroller en een afstandsmeter, die de waterhoogte bepaalt&lt;br /&gt;
* de gegevens worden via WiFi doorgestuurd naar een centraal punt, waar de data wordt verwerkt en gevisualiseerd&lt;br /&gt;
* op een webpagina kan je een overzicht zien van alle meters die online zijn&lt;br /&gt;
* de meting wordt gedaan door bijv. een laser-afstandsmeter of een ultrasoon-afstandsmeter&lt;br /&gt;
* voeding? lastig, hoe krijg je 5v naar een potentieel natte plek?&lt;br /&gt;
* kosten? verwachting &amp;lt; E 40,-&lt;br /&gt;
&lt;br /&gt;
In Gouda wordt op veel verschillende plekken de grondwaterstand gemeten, zie https://opendata.munisense.net/portal/wareco-water2/group/581/Gouda-KJ38A , maar:&lt;br /&gt;
* geen visualisatie op de kaart, je ziet alleen de meetlokaties d.m.v. een icoontje!&lt;br /&gt;
* geen meetpunten in Gouda noord!&lt;br /&gt;
&lt;br /&gt;
=== Online bat detector ===&lt;br /&gt;
Idea: use an ultrasonic microphone, connect it to a WebSDR, so people can tune into bat sounds remotely.&lt;br /&gt;
&lt;br /&gt;
=== Raspberry pi airplane tracking ===&lt;br /&gt;
Apparently now you can also participate in MLAT tracking of planes that don&#039;t transmit GPS coordinates themselves.&lt;br /&gt;
&lt;br /&gt;
=== APRS gateway ===&lt;br /&gt;
http://qso365.co.uk/2017/02/a-guide-to-setting-up-an-aprs-receive-only-igate-using-a-raspberry-pi-and-an-rtl-sdr-dongle/&lt;br /&gt;
&lt;br /&gt;
=== JQ6500 ===&lt;br /&gt;
Small inexpensive modules that play mp3 from an internal flash. Could be nice for a custom door bell for example.&lt;br /&gt;
&lt;br /&gt;
More info at: &lt;br /&gt;
* https://www.elecfreaks.com/wiki/index.php?title=JQ6500_Mini_MP3_Module&lt;br /&gt;
* https://sparks.gogo.co.nz/jq6500/index.html&lt;br /&gt;
&lt;br /&gt;
=== FPGA ===&lt;br /&gt;
Cheap FPGA boards and nice applications:&lt;br /&gt;
* https://bitbucket.org/appanp/artificial-neural-networks/wiki/Home/FPGAsAndNeuralNets.md#!sbcs-and-iot-boards &lt;br /&gt;
* [http://nl.aliexpress.com/item/Altera-fpga-cycloneii-ep2c5t144-learning-board-development-board/872520721.html inexpensive ep2c5t144 board] &lt;br /&gt;
* http://land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board&lt;br /&gt;
&lt;br /&gt;
=== Neural networks on low-end hardware ===&lt;br /&gt;
Investigate if you can run a powerful neural network on relatively low-end/cheap/low-power hardware. For example a Raspberry pi.&lt;br /&gt;
A RPI runs Linux, run python, just like some common neural frameworks.&lt;br /&gt;
Do we need hardware acceleration from the GPU and does the RPI GPU support that?&lt;br /&gt;
&lt;br /&gt;
Read list:&lt;br /&gt;
* https://www.zdnet.com/pictures/raspberry-pi-meets-ai-the-projects-that-put-machine-learning-on-the-35-board/&lt;br /&gt;
* https://www.pyimagesearch.com/2017/12/18/keras-deep-learning-raspberry-pi/&lt;br /&gt;
* https://www.indiegogo.com/projects/sipeed-maix-the-world-first-risc-v-64-ai-module#/&lt;br /&gt;
* https://ai.intel.com/intel-neural-compute-stick-2-smarter-faster-plug-and-play-ai-at-the-edge/&lt;br /&gt;
&lt;br /&gt;
Bought a MaixPy:&lt;br /&gt;
* see https://maixpy.sipeed.com/en/&lt;br /&gt;
* see https://www.youtube.com/watch?v=KResVuAIMb4&lt;br /&gt;
* see http://educ8s.tv/sipeed-m1-dock-review/&lt;br /&gt;
* interesting? https://www.instructables.com/id/Transfer-Learning-With-Sipeed-MaiX-and-Arduino-IDE/&lt;br /&gt;
&lt;br /&gt;
=== mini word clock in dutch ===&lt;br /&gt;
Basically an monochrome 8x8 word clock, in Dutch, showing local time in the Netherlands.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bertrik/miniwordclock This git repo] has the current code.&lt;br /&gt;
&lt;br /&gt;
See [https://plus.google.com/103276078656203197145/posts/7ki7rpJzk3a here for a demo] running on an arduino nano.&lt;br /&gt;
&lt;br /&gt;
The plan is to run this from an ESP8266 instead of an arduino nano, so it can get the time from the internet using NTP.&lt;br /&gt;
Andreas Spiess demonstrated on youtube how existing libraries on the ESP8266 can be used to do the local time (including summer-time) calculations.&lt;br /&gt;
&lt;br /&gt;
=== Cypress PSOC5 ===&lt;br /&gt;
Play with the Cypress PSOC5 platform, which combines a ARM Cortex-m3 processor with configurable analog blocks. I&#039;m thinking of combining it with a 24 GHz doppler radar sensor, to process the signal and present it as a USB audio device (stereo signal contains I and Q parts). See [[RadarOnAStick]].&lt;br /&gt;
&lt;br /&gt;
=== Simple Doppler motion sensors ===&lt;br /&gt;
You can find basic doppler microwave motion sensors based on a single transistor, with some weird traces on the PCB very cheaply, for example&lt;br /&gt;
* https://www.aliexpress.com/item/RCWL-0516-microwave-radar-sensor-module-Human-body-induction-switch-module-Intelligent-sensor/32708877914.html&lt;br /&gt;
&lt;br /&gt;
Typically the microwave part of these consists of a single transistor with a rectangular area on one leg and a meandering trace (with lots of vias to the other side) on the other leg.&lt;br /&gt;
The output of this circuit seems to go into a chip very much like the ones used in PIR sensors.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/jdesbonnet/RCWL-0516 for a reverse engineering effort of these doppler radar modules.&lt;br /&gt;
&lt;br /&gt;
=== Bare-bones Arduino bat detector ===&lt;br /&gt;
This is an idea for a very basic heterodyne bat detector, doing signal processing on an Arduino, requiring minimal external components.&lt;br /&gt;
&lt;br /&gt;
The basic principle of a heterodyne detector is that it just mixes (multiplies) the audio signal with a square wave, low-pass filters the result and puts it on a speaker.&lt;br /&gt;
&lt;br /&gt;
Multiplying with a square wave can also be considered to be just alternatively inverting and not-inverting the signal.&lt;br /&gt;
So if you sample an ultrasonic signal at twice the rate you want to multiply, you can just subtract odd samples from even samples and low-pass filter that.&lt;br /&gt;
&lt;br /&gt;
How this can be done in an AVR Arduino:&lt;br /&gt;
* sample the audio signal at twice the detection frequency, say 84 kHz. An AVR should just be able to do that.&lt;br /&gt;
* apply a 1-pole IIR high-pass filter to remove DC bias, this takes one shift instruction and one addition.&lt;br /&gt;
* multiply by the detection frequency, this means just inverting the odd samples.&lt;br /&gt;
* low-pass filter the signal, this can be done using a moving average filter, say 16 samples long (first null at 5.25 kHz). Theoretically, averaging 16 samples should result in two bits extra accuracy. This operation takes some storage, an addition and a subtraction.&lt;br /&gt;
* output the filtered signal using PWM, possibly at the same rate that we are sampling the input audio.&lt;br /&gt;
&lt;br /&gt;
The microphone can be a 40 kHz piezo transducer, to keep it cheap (but also limited to 40 kHz).&lt;br /&gt;
The pre-amplifier can be a single transistor with some resistors around it, providing about 40x gain.&lt;br /&gt;
The arduino does the signal processing (mixing, low-pass filter) to shift the bat audio to human range.&lt;br /&gt;
The speaker amplifier can just be a simple two transistor push-pull circuit, since the output from the Arduino is digital/PWM.&lt;br /&gt;
&lt;br /&gt;
==== AVR Arduino sample rate ====&lt;br /&gt;
As far as I understand, the ADC clock can be set to 1 MHz.&lt;br /&gt;
Conversion takes 13 cycles, so this can be a problem to reach a sample rate above 80 kHz.&lt;br /&gt;
&lt;br /&gt;
=== Indoor radar speed sign ===&lt;br /&gt;
This idea about placing a simple IQ-output radar sensor indoors in the hacker space, do some basic signal processing on the IQ doppler signal and determine movement speed and direction, then display this on a LED display.&lt;br /&gt;
This is of no immediate practical use other than fun, but helps me to gain a bit more experience with microwave radar sensors and eventually build a more effective setup for detecting/counting bats flying in and out of a roost.&lt;br /&gt;
&lt;br /&gt;
Implement this on a PSOC5 platform or on the STM32 using Arduino.&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=34991</id>
		<title>User:Bertrik Sikken</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=User:Bertrik_Sikken&amp;diff=34991"/>
		<updated>2026-01-17T11:48:40Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* investigate thread/matter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Smoel&lt;br /&gt;
 |Name=Bertrik Sikken&lt;br /&gt;
 |Nick=bertrik&lt;br /&gt;
 |Tagline=heb ik niet&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You can reach me at [mailto:bertrik@sikken.nl bertrik@sikken.nl] or [mailto:bertrik@gmail.com bertrik@gmail.com].&lt;br /&gt;
&lt;br /&gt;
Studied Electrical Engineering at Twente University.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Main interests:&lt;br /&gt;
* reverse-engineering things (USB stuff, mp3 players), worked on http://rockbox.org (sansa clip players)&lt;br /&gt;
* studying bats and making electronics for recording/listening to bat sounds&lt;br /&gt;
* radio stuff, in particular software-defined radio&lt;br /&gt;
* energy-related stuff, visualisation&lt;br /&gt;
* citizen science, particulate matter measurement, noise&lt;br /&gt;
&lt;br /&gt;
Projects I work(ed) on ([https://revspace.nl/index.php?title=User:Bertrik_Sikken&amp;amp;action=purge refresh]):&lt;br /&gt;
{{#ask:[[Category:Project]][[Project Contact::bertrik]]&lt;br /&gt;
|?Project Status&lt;br /&gt;
|headers=show&lt;br /&gt;
|link=all&lt;br /&gt;
|order=ASC,ASC&lt;br /&gt;
|sort=Project Status,Project Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project ideas ==&lt;br /&gt;
[[File:always10oclock.jpg|right]]&lt;br /&gt;
[[File:idea.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas I&#039;m thinking about, but have not fully developed into an actual project yet.&lt;br /&gt;
&lt;br /&gt;
https://pine64.com/product/128mb-ox64-sbc-available-on-december-2-2022/&lt;br /&gt;
&lt;br /&gt;
=== investigate thread/matter ===&lt;br /&gt;
Matter/thread is the new IKEA standard for home automation thins apparently. &lt;br /&gt;
Thread is the wireless protocol, matter is a home automation protocol running on top of thread.&lt;br /&gt;
&lt;br /&gt;
I have a couple of nrf52840, these are good in doing thread.&lt;br /&gt;
&lt;br /&gt;
Next steps:&lt;br /&gt;
* check out openthread&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/openthread/openthread.git&lt;br /&gt;
cd openthread&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Prepare development environment:&lt;br /&gt;
  scripts/bootstrap&lt;br /&gt;
* Build it:&lt;br /&gt;
  ./script/build nrf52840 UART_trans -DOT_LOG_LEVEL=OT_LOG_LEVEL_INFO&lt;br /&gt;
&lt;br /&gt;
Thread on ESP32-C6: https://gist.github.com/gtxaspec/d26198daadfb0a8b0a0edeae2d3fd58f&lt;br /&gt;
&lt;br /&gt;
=== action lsc stekker ===&lt;br /&gt;
https://keetsupport.nl/2024/03/20/how-to-flash-lsc-power-plug-with-esphome/&lt;br /&gt;
&lt;br /&gt;
https://community.home-assistant.io/t/detailed-guide-on-how-to-flash-the-new-tuya-beken-chips-with-openbk7231t/437276&lt;br /&gt;
&lt;br /&gt;
=== sipeed maix dock ===&lt;br /&gt;
Bought this a couple of years ago. Get familiar with this board.&lt;br /&gt;
Can I run a chess program on this, for example?&lt;br /&gt;
&lt;br /&gt;
* https://wiki.sipeed.com/soft/maixpy/en/develop_kit_board/maix_dock.html&lt;br /&gt;
&lt;br /&gt;
=== rfid keyfob ===&lt;br /&gt;
* aliexpress page: https://nl.aliexpress.com/item/1005009569496736.html&lt;br /&gt;
* firmware github: &lt;br /&gt;
** https://github.com/RfidResearchGroup/ChameleonUltra&lt;br /&gt;
** https://github.com/GameTec-live/ChameleonUltraGUI&lt;br /&gt;
&lt;br /&gt;
=== advanced lidars for bat detection ===&lt;br /&gt;
livox:&lt;br /&gt;
* github page https://github.com/Livox-SDK/Livox-SDK/tree/master&lt;br /&gt;
* web page: https://www.livoxtech.com/&lt;br /&gt;
&lt;br /&gt;
=== cubecell meshtastic motion detector ===&lt;br /&gt;
I have a cubecell AB01 board.&lt;br /&gt;
This board is focused on low power, has a connection to attach a solar panel and has a lora radio.&lt;br /&gt;
Relatively small amount of RAM, barely enough to run a LoRaWAN stack but probably plenty to run meshtastic&lt;br /&gt;
&lt;br /&gt;
The plan is to build a simple motion detector from this (using a PIR).&lt;br /&gt;
The PIR can wake up the board from low-power, or a timer can wake it periodically.&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/HelTecAutomation/CubeCell-Arduino/tree/master/libraries/Basics/examples/LowPower&lt;br /&gt;
&lt;br /&gt;
=== configure multitech outdoor gateway ===&lt;br /&gt;
https://www.multitech.net/developer/products/multiconnect-conduit-platform/basestation/&lt;br /&gt;
&lt;br /&gt;
https://multitech.com/product/multitech-conduit-mtcdt-246a-868-eu-gb/&lt;br /&gt;
&lt;br /&gt;
emergency procedure:&lt;br /&gt;
https://www.multitech.net/developer/software/mlinux/using-mlinux/flashing-mlinux-firmware-for-conduit/&lt;br /&gt;
&lt;br /&gt;
=== esp32 wtf ===&lt;br /&gt;
* https://forum.arduino.cc/t/ttgo-lilygo-lora-esp32-26mhz-problem/1353750&lt;br /&gt;
* &amp;quot;26 MHz crystal has been deprecated&amp;quot; https://github.com/espressif/arduino-esp32/issues/10117&lt;br /&gt;
&lt;br /&gt;
=== kakofonie counter ===&lt;br /&gt;
Sample room audio, use neural network to distinguish voices to estimate number of people talking in the past 30 seconds or so.&lt;br /&gt;
Show this number on some kind of display, publish it to MQTT, make a nice graph of it.&lt;br /&gt;
&lt;br /&gt;
Stuff to figure out:&lt;br /&gt;
* this is called &#039;speaker diarization&#039;&lt;br /&gt;
* can it run on an ESP32?&lt;br /&gt;
* make a prototype&lt;br /&gt;
&lt;br /&gt;
=== hypno toad ===&lt;br /&gt;
Put these LEDS https://nl.aliexpress.com/item/1005007583528891.html into https://www.action.com/nl-nl/p/2560347/solar-tuinbeeldje/&lt;br /&gt;
&lt;br /&gt;
Turns out that the default circuit is really basic and output a rough step-up waveform to the LED.&lt;br /&gt;
The self-fading LEDs don&#039;t work very well with that.&lt;br /&gt;
&lt;br /&gt;
Also, putting some IPA on hotglue makes it release really easy.&lt;br /&gt;
&lt;br /&gt;
=== wasbeer / kat classifier ===&lt;br /&gt;
ESP32 with resnet50 neural net to distinguish house cats from other animals, see also:&lt;br /&gt;
* https://ieeexplore.ieee.org/document/10556848/&lt;br /&gt;
&lt;br /&gt;
=== Nespresso brew counter ===&lt;br /&gt;
Several hacker spaces have one of these Nespresso cup coffee makers, but there&#039;s no obvious easy way to monitor usage (monitor ALL the things!).&lt;br /&gt;
Inspired by https://hackaday.com/2021/04/25/arduino-mkr-makes-nespresso-monitoring-easy/ this idea is making an even simpler nespresso monitor,&lt;br /&gt;
using an inexpensive WiFi enabled ESP8266 with an ubiquitous I2S microphone such as the INMP441. &lt;br /&gt;
&lt;br /&gt;
Use this sound monitoring project:&lt;br /&gt;
https://github.com/aleiei/ESP8266-BUG-I2S-MIC&lt;br /&gt;
and turn it into a WiFi connected brew counter.&lt;br /&gt;
&lt;br /&gt;
Software for getting microphone data from an ESP8266/I2S mic into Linux https://github.com/bertrik/EspMicServer&lt;br /&gt;
Nespresso sound is typically 50 Hz with overtones.&lt;br /&gt;
In a recording with the ESP8266, it appears that oddly the 17th harmonic (around 850 Hz) is quite strong.&lt;br /&gt;
&lt;br /&gt;
The plan in the short term is this:&lt;br /&gt;
* apply a gentle IIR filter to subtract any DC bias from the microphone signal&lt;br /&gt;
* calculate autocovariance at offsets 0 and 20 ms (inverse of 50 Hz), representing the total energy and the energy at 50 Hz respectively&lt;br /&gt;
* compare amplitudes to decide about presence of 50 Hz signal, e.g. calculate ratio in dB&lt;br /&gt;
* use this to count the length of time that a 50 Hz signal is heard (increments of 100 ms or so)&lt;br /&gt;
* decide about none / espresso / lungo based on time&lt;br /&gt;
&lt;br /&gt;
Might even integrate with esphome / home assistant later.&lt;br /&gt;
&lt;br /&gt;
=== Remote bat box monitor ===&lt;br /&gt;
Idea:&lt;br /&gt;
* goal: check if remote bat boxes are occupied and identify the species&lt;br /&gt;
* challenges:&lt;br /&gt;
** connectivity: need to transport images/videos (no LoRaWAN), possibly out of range of mobile data networks&lt;br /&gt;
** autonomy: cannot reach the bat box once installed&lt;br /&gt;
** power: no fixed power connection, so probably needs a battery + solar panel&lt;br /&gt;
* design&lt;br /&gt;
** wake up every hour, take a picture, go to sleep, upload photos/videos once per day&lt;br /&gt;
** run from batteries, recharge by solar, rules of thumb&lt;br /&gt;
*** batteries should last for about 10 days&lt;br /&gt;
*** battery should be able to charge in 1 day&lt;br /&gt;
*** consider only 10% of peak solar power&lt;br /&gt;
** KPN &amp;quot;4G-op-zee&amp;quot; somewhat confusing article: https://www.kpn.com/zakelijk/mobiel/roaming/noordzee&lt;br /&gt;
* hardware&lt;br /&gt;
** main processor: raspberry pi zero&lt;br /&gt;
*** raspberry pi power consumption overview: https://www.pidramble.com/wiki/benchmarks/power-consumption&lt;br /&gt;
** this hat to wake up the main CPU: https://www.waveshare.com/wiki/Power_Management_HAT_(B) sold at https://www.kiwi-electronics.com/en/power-management-hat-for-raspberry-pi-with-rtc-and-rp2040-mcu-11373&lt;br /&gt;
&lt;br /&gt;
=== KNMI API ===&lt;br /&gt;
Get familiar with https://developer.dataplatform.knmi.nl/open-data-api&lt;br /&gt;
&lt;br /&gt;
=== Grid frequency measurer with web page ===&lt;br /&gt;
See https://github.com/bertrik/GridFrequency&lt;br /&gt;
SSE source is gridfrequency.local/events&lt;br /&gt;
&lt;br /&gt;
=== WeAct CH55x board ===&lt;br /&gt;
Cheap little boards, using a similar chip as used in USB-serial converters.&lt;br /&gt;
&lt;br /&gt;
The hardware&lt;br /&gt;
https://github.com/WeActStudio/WeActStudio.CH552CoreBoard&lt;br /&gt;
&lt;br /&gt;
Flashing it:&lt;br /&gt;
https://hackaday.io/page/137447-flashing-the-ch552-dev-board-from-the-command-line&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://hackaday.io/project/198238-more-weact-ch5xx&lt;br /&gt;
* https://community.platformio.org/t/manually-adding-support-for-ch55x-controller-by-adding-existing-ardunio-core/41138&lt;br /&gt;
&lt;br /&gt;
=== Zigbee device with esp32 ===&lt;br /&gt;
See https://github.com/P-R-O-C-H-Y/arduino-esp32/blob/8169a434c3e46e1bb7711ebcc04f27267db2093c/libraries/ESP32/examples/Zigbee/Zigbee_Light_Bulb/Zigbee_Light_Bulb.ino&lt;br /&gt;
&lt;br /&gt;
See https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Zigbee&lt;br /&gt;
&lt;br /&gt;
Espressif32 arduino platform git: https://github.com/platformio/platform-espressif32&lt;br /&gt;
&lt;br /&gt;
=== Cameratoezicht in Gouda ===&lt;br /&gt;
Gemeente Gouda publiceert een lijst van camera&#039;s in Gouda, zie&lt;br /&gt;
https://gis.gouda.nl/nl/app/Basisviewer_open#!eAGT8uRiNBRy4ZIRYFKSyKkssjJwdzFxNDMz8TKKsLC0cnb0dQ1y5FIByirgkg3xd43ydPYIAQBXGBFm&lt;br /&gt;
&lt;br /&gt;
Aanmelden (semi-automatisch) bij bijvoorbeeld [https://mapcomplete.org/surveillance Surveillance-under-surveillance] ?&lt;br /&gt;
&lt;br /&gt;
=== SolarEdge ===&lt;br /&gt;
Interact with the solar edge api for PV installations.&lt;br /&gt;
&lt;br /&gt;
https://developers.solaredge.com/&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/solaredge-api&lt;br /&gt;
&lt;br /&gt;
=== Stookalert ===&lt;br /&gt;
Idee: gekleurd lampje dat aangeeft of er op dit moment een stookalert actief is&lt;br /&gt;
&lt;br /&gt;
Implementatie:&lt;br /&gt;
* kijk m.b.v. WiFi locatieservice in welke provincie je je bevindt&lt;br /&gt;
* haal JSON op bij https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* toon de bijbehorende kleur op het lampje&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
* Officiele pagina: https://www.atlasleefomgeving.nl/stookwijzer&lt;br /&gt;
* Achterliggende JSON met toestand per provincie: https://www.lml.rivm.nl/stookalert/stookalert.json&lt;br /&gt;
* Er moet ook nog ergens een API zijn die fijnmaziger aangeeft wat de toestand is ...&lt;br /&gt;
&lt;br /&gt;
=== Display of current electricity usage ===&lt;br /&gt;
I have a [https://www.zuidwijk.com/product/slimmelezer-plus/ slimme lezer] connected to the P1 port of my smart electricity meter.&lt;br /&gt;
The default firmware exposes meter readings using an event stream (SSE) at http://slimmelezer.local/events&lt;br /&gt;
&lt;br /&gt;
So for example, you can read this with curl:&lt;br /&gt;
  curl http://slimmelezer.local/events&lt;br /&gt;
With result:&lt;br /&gt;
  event: state&lt;br /&gt;
  data: {&amp;quot;id&amp;quot;:&amp;quot;sensor-power_consumed_phase_1&amp;quot;,&amp;quot;value&amp;quot;:0.046,&amp;quot;state&amp;quot;:&amp;quot;0.046 kW&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Specification of SSE: https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream&lt;br /&gt;
&lt;br /&gt;
What I would like to do is to read these events and control a simple display to display  the current usage number.&lt;br /&gt;
&lt;br /&gt;
=== Participating in ultrasonic sound project ===&lt;br /&gt;
https://bat-migration-europe.netlify.app/project/&lt;br /&gt;
&lt;br /&gt;
Use an audiomoth for this.&lt;br /&gt;
&lt;br /&gt;
=== ESP32 C3 ===&lt;br /&gt;
* [https://www.espressif.com/en/products/socs/esp32-c3 processor page]&lt;br /&gt;
* [https://wiki.luatos.com/chips/esp32c3/index.html luatos basic esp32 c3 board]&lt;br /&gt;
&lt;br /&gt;
=== Flexible LED ticker ===&lt;br /&gt;
Ordered a flexible 32x8 RGB LED display:&lt;br /&gt;
https://nl.aliexpress.com/item/4001296811800.html&lt;br /&gt;
&lt;br /&gt;
Matching diffuser to be 3D printed:&lt;br /&gt;
https://www.thingiverse.com/thing:1903744&lt;br /&gt;
&lt;br /&gt;
=== Washing machine API ===&lt;br /&gt;
https://tratt.net/laurie/blog/2023/displaying_my_washing_machines_remaining_time_with_curl_jq_pizauth.html&lt;br /&gt;
&lt;br /&gt;
=== TinyML ===&lt;br /&gt;
Investigate TinyML, see https://www.tinyml.org/&lt;br /&gt;
Apparently can run on a RP2040 (raspi pi pico).&lt;br /&gt;
&lt;br /&gt;
https://www.hackster.io/mjrobot/esp32-cam-tinyml-image-classification-fruits-vs-veggies-4ab970&lt;br /&gt;
&lt;br /&gt;
=== Bat box busy signal ===&lt;br /&gt;
My brother built little pyramid &#039;blinkies&#039;: solar cell + Lithium-supercapacitor + harvesting circuit + LED encased in clear expoxy.&lt;br /&gt;
&lt;br /&gt;
Can we add a low-power PIR sensor to this, and make a blinky that blinks if movement was detected by the PIR in the past hour?&lt;br /&gt;
&lt;br /&gt;
=== Super tiny RFID ===&lt;br /&gt;
See https://www.sparkfun.com/products/16464 an almost sand grain size RFID chip, 1.25mmx1.25mmx0.55mm&lt;br /&gt;
&lt;br /&gt;
The accompanying reader &amp;quot;M6E Nano&amp;quot; is still quite expensive at $235.95 : https://www.sparkfun.com/products/14066&lt;br /&gt;
&lt;br /&gt;
Uses the MuRata LXMSJZNCMF-198:&lt;br /&gt;
&amp;quot;This product can be used as an ultra small tag and this can be&lt;br /&gt;
fit on any metal objects, non-metal objects, as well as&lt;br /&gt;
embedding into any objects by glue or adhesive and so on.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See also: ISO18000-63 and EPC global Gen2(v2)&lt;br /&gt;
&lt;br /&gt;
Specification:&lt;br /&gt;
* https://www.gs1.org/standards/rfid/uhf-air-interface-protocol&lt;br /&gt;
&lt;br /&gt;
=== TheThingsNetwork-Sondehub bridge ===&lt;br /&gt;
Uploads balloon telemetry to sondehub.&lt;br /&gt;
&lt;br /&gt;
See https://github.com/bertrik/ttnhabbridge/issues/6&lt;br /&gt;
&lt;br /&gt;
=== Actually smart boiler ===&lt;br /&gt;
The boiler for hot water is about half of my electricity bill.&lt;br /&gt;
The idea is to use/build a smart switch that switches it on at time when electricity prices are lowest.&lt;br /&gt;
&lt;br /&gt;
Currently have a &amp;quot;Slimme boiler module&amp;quot; from Eneco, which is *not* actually smart,&lt;br /&gt;
since it allows me no control whatsoever when it switches on (besides cutting the power in the meterkast).&lt;br /&gt;
For example, it will switch on mid-day when my price is high and eneco&#039;s price is low, perhaps good for Eneco, not for me. &lt;br /&gt;
Apparently, they even received a [https://nieuws.eneco.nl/slim-apparaatje-bij-boiler-vangt-pieken-wind--en-zonnestroom-op/ subsidy] for this.&lt;br /&gt;
&lt;br /&gt;
A boiler is a pretty big load, about 3 kW, but it is not inductive.&lt;br /&gt;
&lt;br /&gt;
Alternatives:&lt;br /&gt;
* https://www.shelly.cloud/en-nl/products/product-overview/shelly-plus-1-pm-2-pack/shelly-plus-1-pm&lt;br /&gt;
* https://www.solyxenergy.nl/solar-iboost/ to store excess solar energy in hot water, might also be useful for just controlling a boiler to use cheaper rates&lt;br /&gt;
* tuya smartplug, like https://www.wifilampkoning.nl/merken-slimme-verlichting/tuya/tuya-enkele-smartplug-met-energiemeting ?&lt;br /&gt;
* tuya 20A smart plug: https://nl.aliexpress.com/item/1005003347568206.html&lt;br /&gt;
&lt;br /&gt;
=== Receiving gas meters ===&lt;br /&gt;
Apparently gas meters send gas consumption data to the slimme meter using a wireless link in the 868 MHz band.&lt;br /&gt;
Probably just FSK at 38.4, as mentioned here: https://a35.veron.nl/nieuwe-elektra-en-gasmeters/&lt;br /&gt;
&lt;br /&gt;
Interesting leads:&lt;br /&gt;
* https://github.com/stef/smeter&lt;br /&gt;
* https://www.rtl-sdr.com/reading-household-wireless-utility-meters-with-an-rtl-sdr-and-plotting-the-data-in-home-automation-software/&lt;br /&gt;
* https://github.com/bemasher/rtlamr&lt;br /&gt;
&lt;br /&gt;
=== Multi-network wifi manager ===&lt;br /&gt;
Figure out or create software so that ESP8266/ESP32 wifi manager can use multiple networks to connect (not just one),&lt;br /&gt;
so it allowing storing credentials for more than one network. For example, the network at home, the hacker space, at work.&lt;br /&gt;
Instead of reconfiguring the wifi manager for each network, you just *add* your credentials (and the existing credentials&lt;br /&gt;
are not replaced).&lt;br /&gt;
&lt;br /&gt;
See https://github.com/folkertvanheusden/M.A.X.X&lt;br /&gt;
&lt;br /&gt;
Interesting candidates:&lt;br /&gt;
* https://registry.platformio.org/libraries/martinverges/ESP32%20Wifi%20Manager wifi manager for ESP32, has a REST API for managing wifi network, but is incomplete in the sense that you need to write your own code (e.g. javascript) to actually *use* its API&lt;br /&gt;
* https://github.com/arduino-libraries/Arduino_MultiWiFi is the arduino multi wifi library, to allow connecting to multiple different WiFi networks, but it is not a wifi manager, that starts a captive portal, etc&lt;br /&gt;
&lt;br /&gt;
=== Automated bat counting ===&lt;br /&gt;
Can we automatically count the number of bats from the image of a webcam mounted in a bat colony?&lt;br /&gt;
Perhaps using some kind of AI or machine learning algorithm?&lt;br /&gt;
&lt;br /&gt;
The image in question:&lt;br /&gt;
https://stofradar.nl/coenecoop/&lt;br /&gt;
&lt;br /&gt;
=== Use TheThingsIndoorGateway as Helium/ThingSix hotspot ===&lt;br /&gt;
I have a spare TTIG that could perhaps be used as a Helium gateway, investigate what is possible.&lt;br /&gt;
&lt;br /&gt;
One possiblity is to capture the gateway traffic from the TTN gateway events API, convert uplink data to a format that the Helium network understands and forward it.&lt;br /&gt;
I don&#039;t really care about the Helium crypto tokens, this is just for fun and science.&lt;br /&gt;
&lt;br /&gt;
What I definitely can do:&lt;br /&gt;
* Capture data from the TTN gateway events API, convert it back to Semtech UP format and forward it somewhere to Helium (just not sure where!)&lt;br /&gt;
* See also my https://github.com/bertrik/ttn-gateway-collector project which contains an initial implementation of TTN-to-UDP conversion&lt;br /&gt;
&lt;br /&gt;
Showstoppers:&lt;br /&gt;
* If you want to be a gateway on the Helium network, you have to *pay Helium*! Obviously I don&#039;t want that, I just want to share data to improve *their* network. &lt;br /&gt;
&lt;br /&gt;
Open work:&lt;br /&gt;
* Investigate if Helium has an open uplink API for their hotspots, if so study it etc, without paying the gateway fee&lt;br /&gt;
* Investigate if Thingsix has an open uplink API for their hotspots, if so study it etc, without paying any gateway fee&lt;br /&gt;
* Investigate if Thingsix is just another Helium, with weird crypto money&lt;br /&gt;
&lt;br /&gt;
Interesting stuff:&lt;br /&gt;
* https://docs.helium.com/use-the-network/setup-a-packet-forwarder unfortunately the link to setting up the &#039;light hotspot client&#039; does not work!&lt;br /&gt;
* https://docs.helium.com/mine-hnt/light-hotspots/&lt;br /&gt;
* https://thingsix.com/&lt;br /&gt;
&lt;br /&gt;
=== Adding BLE GATT interface to sensors ===&lt;br /&gt;
The GATT specification allows measurement properties to be defined and transferred continuously over Bluetooth low-energy.&lt;br /&gt;
&lt;br /&gt;
With GATT you can define a collection of properties (e.g. measurement items like temperature/humidity/particulate matter/noise, etc)&lt;br /&gt;
organised in a simple structure of a BLE service.&lt;br /&gt;
The &#039;notification&#039; method allows you to basically push the data continuously to a connected host, e.g. a smart phone.&lt;br /&gt;
&lt;br /&gt;
Services collects characteristic, a characteristic has values with units.&lt;br /&gt;
Each of these (service, characteristic, unit) have their own unique &amp;quot;UUID&amp;quot;.&lt;br /&gt;
This is described in the so-called [https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20Numbers%20Document.pdf 16-bit UUID numbers document]&lt;br /&gt;
&lt;br /&gt;
Interesting stuff in GATT:&lt;br /&gt;
* See GATT_Specification_Supplement_v5 paragraph 3.151, it has a noise characteristic with 1 dB resolution.&lt;br /&gt;
* 0x27C3 is the GATT *unit* for sound pressure&lt;br /&gt;
* 0x181A is the GATT environmental sensing *service*, document name &amp;quot;ESP_V1.0.0.pdf&amp;quot;&lt;br /&gt;
* 0x2A6E is the GATT Characteristic and Object Type for temperature&lt;br /&gt;
* 0x2A6F is the GATT Characteristic and Object Type for humidity&lt;br /&gt;
* 0x2BD5 is the GATT Characteristic and Object Type for Particulate Matter - PM1 Concentration&lt;br /&gt;
* 0x2BD6 is the GATT Characteristic and Object Type for Particulate Matter - PM2.5 Concentration&lt;br /&gt;
* 0x2BD7 is the GATT Characteristic and Object Type for Particulate Matter - PM10 Concentration&lt;br /&gt;
* Unfortunately I cannot find a characteristic for carbon-dioxide (CO2) in the BLE GATT unit document&lt;br /&gt;
&lt;br /&gt;
See also https://programmaticponderings.com/2020/08/04/getting-started-with-bluetooth-low-energy-ble-and-generic-attribute-profile-gatt-specification-for-iot/&lt;br /&gt;
&lt;br /&gt;
=== Reverse engineering XS-8217 bluetooth air quality meter ===&lt;br /&gt;
This is a thing that measures CO2, humidity, temperature, TVOC and formaldehyde.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.liutyi.info/display/CO2/ZN-2CO3+Inside&lt;br /&gt;
&lt;br /&gt;
This teardown looks a lot like my sensor: https://www.youtube.com/watch?v=APnjhMrJChI&lt;br /&gt;
Mine contains a &amp;quot;TPM-300A&amp;quot; sensor for measuring VOC.&lt;br /&gt;
&lt;br /&gt;
It has a bluetooth interface, device name is XS-8217.&lt;br /&gt;
It has a BLE GATT profile, with the following services&lt;br /&gt;
* service 0xC760&lt;br /&gt;
** characteristic 0xC762 (WRITE)&lt;br /&gt;
** characteristic 0xC761 (NOTIFY)&lt;br /&gt;
*** example data: 0x23 0x06 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
*** example data: 0x23 0x08 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
*** data shown on screen was approximately: CO2=418ppm, HCHO=0.003mg/m3, TVOC=0.013mg/m3, temp=24degC, humi=35%&lt;br /&gt;
&lt;br /&gt;
So data in the characteristic 0xC761 seems to have a 4 byte constant header:&lt;br /&gt;
* 0x23&lt;br /&gt;
* length byte&lt;br /&gt;
&lt;br /&gt;
Then we have for the first message: 0x10 0x04 0xF1 0x00 0x23 0x65&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0xF1 is temperature in 0.1 degree Celcius most likely (24.1)&lt;br /&gt;
* 0x00 is ...&lt;br /&gt;
* 0x23 is humidity most likely (35)&lt;br /&gt;
* 0x65 is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
And for the second message: 0x10 0x04 0x01 0x9A 0x00 0x0A 0x00 0x03 0x0E&lt;br /&gt;
* 0x10 0x04 fixed header&lt;br /&gt;
* 0x01 0x9A is the CO2 concentration (410)&lt;br /&gt;
* 0x00 0x0A is TVOC most likely (10)&lt;br /&gt;
* 0x00 0x03 is HCHO most likely (3)&lt;br /&gt;
* 0x0E is ... checksum perhaps&lt;br /&gt;
&lt;br /&gt;
=== ribbon tweeter for bat audio ===&lt;br /&gt;
Someone gave me this idea:&lt;br /&gt;
Use a ribbon tweeter like this for playing back bat audio:&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/4000973201791.html&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;https://nl.aliexpress.com/item/1005002565880660.html&amp;lt;/s&amp;gt;&lt;br /&gt;
https://nl.aliexpress.com/item/1005002635086050.html&lt;br /&gt;
&lt;br /&gt;
The frequency spectrum shows no sign of dropping off at 20 kHz.&lt;br /&gt;
&lt;br /&gt;
=== 3d glasses ===&lt;br /&gt;
I got some 2nd hand 3d glasses, they look exactly like these ones:&lt;br /&gt;
* GH-15 https://www.dhgate.com/product/g15-dlp-3d-active-shutter-glasses-96-144hz/213983026.html&lt;br /&gt;
* Sintron https://www.amazon.de/Sintron-Kompatibel-TDG-BT500A-TDG-BT400A-Deutschland/dp/B015PCWMZ8&lt;br /&gt;
The common name appears to be &amp;quot;G15-DLP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A tear-down here:&lt;br /&gt;
* https://blog.danman.eu/3d-shutter-glasses-teardown/&lt;br /&gt;
&lt;br /&gt;
Interesting documents:&lt;br /&gt;
* http://cmst.curtin.edu.au/wp-content/uploads/sites/4/2016/05/2012-28-woods-helliwell-cross-compatibility_of_shutter_glasses.pdf&lt;br /&gt;
* http://cmst.curtin.edu.au/local/docs/pubs/2011-17-woods-helliwell-3D-Sync-IR.pdf&lt;br /&gt;
&lt;br /&gt;
Someone claims he got something to work with some hacks:&lt;br /&gt;
https://www.avsforum.com/threads/how-i-got-cheap-dlp-link-glasses-to-work-great.1887145/&lt;br /&gt;
&lt;br /&gt;
=== Waterniveaumeter ===&lt;br /&gt;
Op verschillende plekken in Gouda staat er water in de kruipruimte van huizen van bewoners.&lt;br /&gt;
Kunnen we dat meten en inzichtelijk maken, voor bewoners, op een kaart bijvoorbeeld?&lt;br /&gt;
&lt;br /&gt;
Idee:&lt;br /&gt;
* in de kruipruimte plaats je een module die waterhoogte kan meten&lt;br /&gt;
* de module bestaat uit een microcontroller en een afstandsmeter, die de waterhoogte bepaalt&lt;br /&gt;
* de gegevens worden via WiFi doorgestuurd naar een centraal punt, waar de data wordt verwerkt en gevisualiseerd&lt;br /&gt;
* op een webpagina kan je een overzicht zien van alle meters die online zijn&lt;br /&gt;
* de meting wordt gedaan door bijv. een laser-afstandsmeter of een ultrasoon-afstandsmeter&lt;br /&gt;
* voeding? lastig, hoe krijg je 5v naar een potentieel natte plek?&lt;br /&gt;
* kosten? verwachting &amp;lt; E 40,-&lt;br /&gt;
&lt;br /&gt;
In Gouda wordt op veel verschillende plekken de grondwaterstand gemeten, zie https://opendata.munisense.net/portal/wareco-water2/group/581/Gouda-KJ38A , maar:&lt;br /&gt;
* geen visualisatie op de kaart, je ziet alleen de meetlokaties d.m.v. een icoontje!&lt;br /&gt;
* geen meetpunten in Gouda noord!&lt;br /&gt;
&lt;br /&gt;
=== Online bat detector ===&lt;br /&gt;
Idea: use an ultrasonic microphone, connect it to a WebSDR, so people can tune into bat sounds remotely.&lt;br /&gt;
&lt;br /&gt;
=== Raspberry pi airplane tracking ===&lt;br /&gt;
Apparently now you can also participate in MLAT tracking of planes that don&#039;t transmit GPS coordinates themselves.&lt;br /&gt;
&lt;br /&gt;
=== APRS gateway ===&lt;br /&gt;
http://qso365.co.uk/2017/02/a-guide-to-setting-up-an-aprs-receive-only-igate-using-a-raspberry-pi-and-an-rtl-sdr-dongle/&lt;br /&gt;
&lt;br /&gt;
=== JQ6500 ===&lt;br /&gt;
Small inexpensive modules that play mp3 from an internal flash. Could be nice for a custom door bell for example.&lt;br /&gt;
&lt;br /&gt;
More info at: &lt;br /&gt;
* https://www.elecfreaks.com/wiki/index.php?title=JQ6500_Mini_MP3_Module&lt;br /&gt;
* https://sparks.gogo.co.nz/jq6500/index.html&lt;br /&gt;
&lt;br /&gt;
=== FPGA ===&lt;br /&gt;
Cheap FPGA boards and nice applications:&lt;br /&gt;
* https://bitbucket.org/appanp/artificial-neural-networks/wiki/Home/FPGAsAndNeuralNets.md#!sbcs-and-iot-boards &lt;br /&gt;
* [http://nl.aliexpress.com/item/Altera-fpga-cycloneii-ep2c5t144-learning-board-development-board/872520721.html inexpensive ep2c5t144 board] &lt;br /&gt;
* http://land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board&lt;br /&gt;
&lt;br /&gt;
=== Neural networks on low-end hardware ===&lt;br /&gt;
Investigate if you can run a powerful neural network on relatively low-end/cheap/low-power hardware. For example a Raspberry pi.&lt;br /&gt;
A RPI runs Linux, run python, just like some common neural frameworks.&lt;br /&gt;
Do we need hardware acceleration from the GPU and does the RPI GPU support that?&lt;br /&gt;
&lt;br /&gt;
Read list:&lt;br /&gt;
* https://www.zdnet.com/pictures/raspberry-pi-meets-ai-the-projects-that-put-machine-learning-on-the-35-board/&lt;br /&gt;
* https://www.pyimagesearch.com/2017/12/18/keras-deep-learning-raspberry-pi/&lt;br /&gt;
* https://www.indiegogo.com/projects/sipeed-maix-the-world-first-risc-v-64-ai-module#/&lt;br /&gt;
* https://ai.intel.com/intel-neural-compute-stick-2-smarter-faster-plug-and-play-ai-at-the-edge/&lt;br /&gt;
&lt;br /&gt;
Bought a MaixPy:&lt;br /&gt;
* see https://maixpy.sipeed.com/en/&lt;br /&gt;
* see https://www.youtube.com/watch?v=KResVuAIMb4&lt;br /&gt;
* see http://educ8s.tv/sipeed-m1-dock-review/&lt;br /&gt;
* interesting? https://www.instructables.com/id/Transfer-Learning-With-Sipeed-MaiX-and-Arduino-IDE/&lt;br /&gt;
&lt;br /&gt;
=== mini word clock in dutch ===&lt;br /&gt;
Basically an monochrome 8x8 word clock, in Dutch, showing local time in the Netherlands.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bertrik/miniwordclock This git repo] has the current code.&lt;br /&gt;
&lt;br /&gt;
See [https://plus.google.com/103276078656203197145/posts/7ki7rpJzk3a here for a demo] running on an arduino nano.&lt;br /&gt;
&lt;br /&gt;
The plan is to run this from an ESP8266 instead of an arduino nano, so it can get the time from the internet using NTP.&lt;br /&gt;
Andreas Spiess demonstrated on youtube how existing libraries on the ESP8266 can be used to do the local time (including summer-time) calculations.&lt;br /&gt;
&lt;br /&gt;
=== Cypress PSOC5 ===&lt;br /&gt;
Play with the Cypress PSOC5 platform, which combines a ARM Cortex-m3 processor with configurable analog blocks. I&#039;m thinking of combining it with a 24 GHz doppler radar sensor, to process the signal and present it as a USB audio device (stereo signal contains I and Q parts). See [[RadarOnAStick]].&lt;br /&gt;
&lt;br /&gt;
=== Simple Doppler motion sensors ===&lt;br /&gt;
You can find basic doppler microwave motion sensors based on a single transistor, with some weird traces on the PCB very cheaply, for example&lt;br /&gt;
* https://www.aliexpress.com/item/RCWL-0516-microwave-radar-sensor-module-Human-body-induction-switch-module-Intelligent-sensor/32708877914.html&lt;br /&gt;
&lt;br /&gt;
Typically the microwave part of these consists of a single transistor with a rectangular area on one leg and a meandering trace (with lots of vias to the other side) on the other leg.&lt;br /&gt;
The output of this circuit seems to go into a chip very much like the ones used in PIR sensors.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/jdesbonnet/RCWL-0516 for a reverse engineering effort of these doppler radar modules.&lt;br /&gt;
&lt;br /&gt;
=== Bare-bones Arduino bat detector ===&lt;br /&gt;
This is an idea for a very basic heterodyne bat detector, doing signal processing on an Arduino, requiring minimal external components.&lt;br /&gt;
&lt;br /&gt;
The basic principle of a heterodyne detector is that it just mixes (multiplies) the audio signal with a square wave, low-pass filters the result and puts it on a speaker.&lt;br /&gt;
&lt;br /&gt;
Multiplying with a square wave can also be considered to be just alternatively inverting and not-inverting the signal.&lt;br /&gt;
So if you sample an ultrasonic signal at twice the rate you want to multiply, you can just subtract odd samples from even samples and low-pass filter that.&lt;br /&gt;
&lt;br /&gt;
How this can be done in an AVR Arduino:&lt;br /&gt;
* sample the audio signal at twice the detection frequency, say 84 kHz. An AVR should just be able to do that.&lt;br /&gt;
* apply a 1-pole IIR high-pass filter to remove DC bias, this takes one shift instruction and one addition.&lt;br /&gt;
* multiply by the detection frequency, this means just inverting the odd samples.&lt;br /&gt;
* low-pass filter the signal, this can be done using a moving average filter, say 16 samples long (first null at 5.25 kHz). Theoretically, averaging 16 samples should result in two bits extra accuracy. This operation takes some storage, an addition and a subtraction.&lt;br /&gt;
* output the filtered signal using PWM, possibly at the same rate that we are sampling the input audio.&lt;br /&gt;
&lt;br /&gt;
The microphone can be a 40 kHz piezo transducer, to keep it cheap (but also limited to 40 kHz).&lt;br /&gt;
The pre-amplifier can be a single transistor with some resistors around it, providing about 40x gain.&lt;br /&gt;
The arduino does the signal processing (mixing, low-pass filter) to shift the bat audio to human range.&lt;br /&gt;
The speaker amplifier can just be a simple two transistor push-pull circuit, since the output from the Arduino is digital/PWM.&lt;br /&gt;
&lt;br /&gt;
==== AVR Arduino sample rate ====&lt;br /&gt;
As far as I understand, the ADC clock can be set to 1 MHz.&lt;br /&gt;
Conversion takes 13 cycles, so this can be a problem to reach a sample rate above 80 kHz.&lt;br /&gt;
&lt;br /&gt;
=== Indoor radar speed sign ===&lt;br /&gt;
This idea about placing a simple IQ-output radar sensor indoors in the hacker space, do some basic signal processing on the IQ doppler signal and determine movement speed and direction, then display this on a LED display.&lt;br /&gt;
This is of no immediate practical use other than fun, but helps me to gain a bit more experience with microwave radar sensors and eventually build a more effective setup for detecting/counting bats flying in and out of a roost.&lt;br /&gt;
&lt;br /&gt;
Implement this on a PSOC5 platform or on the STM32 using Arduino.&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=NRF52840&amp;diff=34983</id>
		<title>NRF52840</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=NRF52840&amp;diff=34983"/>
		<updated>2026-01-12T16:13:48Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=NRF52840&lt;br /&gt;
   |Picture=nrf52840-supermini.png&lt;br /&gt;
   |Omschrijving=Running Arduino with platformio on NRF52840&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
This page is about getting inexpensive NRF52840 boards to work with Arduino and platformio.&lt;br /&gt;
&lt;br /&gt;
NRF52840 is a nice platform:&lt;br /&gt;
* low-power&lt;br /&gt;
* inexpensive&lt;br /&gt;
* decent amount of flash (1024k), RAM (256k) and CPU cycles (64 MHz)&lt;br /&gt;
* support various radio protocols like zigbee, ble, thread, enhanced shockburst&lt;br /&gt;
* built-in support for quadrature counting&lt;br /&gt;
* can run arduino too&lt;br /&gt;
&lt;br /&gt;
However the eco-system of inexpensive boards is a complicated landscape:&lt;br /&gt;
* AliExpress sellers offer &amp;quot;promicro&amp;quot; and &amp;quot;supermini&amp;quot; board with unclear characteristics&lt;br /&gt;
* LEDs are sometimes swapped (blue = hardware charge, red = software led?)&lt;br /&gt;
* Various firmware upload interface options (which one to use?):&lt;br /&gt;
** Using nrfutil, sends a .zip file containing various parts, over USB-serial&lt;br /&gt;
** Mass storage UF2, activated using the double-reset&lt;br /&gt;
** SWD debug interface (requires soldering!)&lt;br /&gt;
* Confusing situation regarding bootloaders:&lt;br /&gt;
** Most boards seem to come with a modified version of a bootloader meant for another type of board&lt;br /&gt;
** Type of bootloader depends on type of firmware you want to run, &amp;quot;ZMK&amp;quot;, Arduino using Arduino IDE, Arduino using platformio&lt;br /&gt;
** Risk of accidentally overwriting the bootloader, with UF2 flash offsets sometimes being absolute, sometimes being relative&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:nrf52840-supermini-pinout.png|right|thumb|pinout]]&lt;br /&gt;
&lt;br /&gt;
The boards I have are the &amp;quot;promicro&amp;quot; and &amp;quot;supermini&amp;quot;.&lt;br /&gt;
These boards look basically identical hardware-wise.&lt;br /&gt;
&lt;br /&gt;
There is a 4-pad connector to program it using SWD (VDD/SWD/SDC/GND).&lt;br /&gt;
This can be used to write the bootloader for example.&lt;br /&gt;
The pads have a spacing of 1.5mm.&lt;br /&gt;
&lt;br /&gt;
The blue LED appears to flash independently of software, this is probably the charge circuit behaving randomly without a battery present.&lt;br /&gt;
The red LED appears to be under software control.&lt;br /&gt;
&lt;br /&gt;
Pinout/schematic: https://nicekeyboards.com/docs/nice-nano/pinout-schematic&lt;br /&gt;
&lt;br /&gt;
=== bootloader ===&lt;br /&gt;
The INFO_UF2.TXT says (after double-tap reset):&lt;br /&gt;
  UF2 Bootloader 0.6.0 lib/nrfx (v2.0.0) lib/tinyusb (0.10.1-41-gdf0cda2d) lib/uf2 (remotes/origin/configupdate-9-gadbb8c7)&lt;br /&gt;
  Model: nice!nano&lt;br /&gt;
  Board-ID: nRF52840-nicenano&lt;br /&gt;
  SoftDevice: S140 version 6.1.1&lt;br /&gt;
  Date: Jun 19 2021&lt;br /&gt;
&lt;br /&gt;
The CURRENT.UF2 file is 1.4 MB&lt;br /&gt;
&lt;br /&gt;
Kernel log says:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[509372.005339] usb 1-2.3: new full-speed USB device number 96 using xhci_hcd&lt;br /&gt;
[509372.132351] usb 1-2.3: New USB device found, idVendor=239a, idProduct=00b3, bcdDevice= 1.00&lt;br /&gt;
[509372.132361] usb 1-2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[509372.132364] usb 1-2.3: Product: nice!nano&lt;br /&gt;
[509372.132366] usb 1-2.3: Manufacturer: Nice Keyboards&lt;br /&gt;
[509372.132368] usb 1-2.3: SerialNumber: 98D93A272A6CCC7D&lt;br /&gt;
[509372.187474] cdc_acm 1-2.3:1.0: ttyACM0: USB ACM device&lt;br /&gt;
[509372.190177] usb-storage 1-2.3:1.2: USB Mass Storage device detected&lt;br /&gt;
[509372.190467] scsi host3: usb-storage 1-2.3:1.2&lt;br /&gt;
[509373.200470] scsi host3: scsi scan: INQUIRY result too short (5), using 36&lt;br /&gt;
[509373.200481] scsi 3:0:0:0: Direct-Access     Adafruit nRF UF2          1.0  PQ: 0 ANSI: 2&lt;br /&gt;
[509373.200825] sd 3:0:0:0: Attached scsi generic sg0 type 0&lt;br /&gt;
[509373.202317] sd 3:0:0:0: [sdb] 65801 512-byte logical blocks: (33.7 MB/32.1 MiB)&lt;br /&gt;
[509373.202556] sd 3:0:0:0: [sdb] Write Protect is off&lt;br /&gt;
[509373.202559] sd 3:0:0:0: [sdb] Mode Sense: 03 00 00 00&lt;br /&gt;
[509373.202782] sd 3:0:0:0: [sdb] No Caching mode page found&lt;br /&gt;
[509373.202784] sd 3:0:0:0: [sdb] Assuming drive cache: write through&lt;br /&gt;
[509373.296933]  sdb:&lt;br /&gt;
[509373.297002] sd 3:0:0:0: [sdb] Attached SCSI removable disk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Working platformio example project for the nice!nano and supermini/promicro nrf52840 clones:&lt;br /&gt;
https://github.com/bertrik/nicenano-example &lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* Nordic technical documentation: https://docs.nordicsemi.com/category/nrf52840-category&lt;br /&gt;
* Here is a wiki full of useful information on specific boards: https://github.com/joric/nrfmicro/wiki&lt;br /&gt;
** Specifically the supermini https://github.com/joric/nrfmicro/wiki/Alternatives#supermini-nrf52840&lt;br /&gt;
* nRFMicro Arduino Core:&lt;br /&gt;
** Meant for integration with Arduino IDE, not platformio!&lt;br /&gt;
** See https://github.com/pdcook/nRFMicro-Arduino-Core&lt;br /&gt;
** Uses https://github.com/NordicSemiconductor/nrfx for NRF52840 specific drivers&lt;br /&gt;
* Platformio support for supermini:&lt;br /&gt;
** Focused on platformio&lt;br /&gt;
** https://github.com/ICantMakeThings/Nicenano-NRF52-Supermini-PlatformIO-Support&lt;br /&gt;
** Bit awkward installation (copy/overwrite files inside existing platformio folder)&lt;br /&gt;
* https://docs.nordicsemi.com/bundle/ncs-3.1.0/page/zephyr/boards/others/promicro_nrf52840/doc/index.html pro-micro information from Nordic Semi&lt;br /&gt;
&lt;br /&gt;
Getting &#039;circuitpython&#039; to work:&lt;br /&gt;
* Here&#039;s a page on making it work on nicenano: https://circuitpython.org/board/nice_nano/&lt;br /&gt;
* HOWEVER, it also says &amp;quot;On nRF boards, CircuitPython 8.2.0 and later require UF2 bootloader version 0.6.1 or later. Older bootloaders cannot load the firmware. See Update UF2 Bootloader below.&amp;quot;. Guess what bootloader came with my board ... 0.6.0&lt;br /&gt;
* They point you to https://github.com/adafruit/Adafruit_nRF52_Bootloader/releases/tag/0.9.2 but now what!?!!!&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=File:Nrf52840-supermini.png&amp;diff=34982</id>
		<title>File:Nrf52840-supermini.png</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=File:Nrf52840-supermini.png&amp;diff=34982"/>
		<updated>2026-01-10T20:48:11Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: Bertrik Sikken uploaded a new version of File:Nrf52840-supermini.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=File:Nrf52840-supermini.png&amp;diff=34981</id>
		<title>File:Nrf52840-supermini.png</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=File:Nrf52840-supermini.png&amp;diff=34981"/>
		<updated>2026-01-10T20:46:59Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
</feed>