L14-Click 1.0
STM32WLE5CC LoRaWAN Sensor Platform
Loading...
Searching...
No Matches
mysensors.c
Go to the documentation of this file.
1/*
2 * mysensors.c
3 *
4 * Created on: 6. 1. 2026
5 * Author: Milan
6 * Pressure: ILS22: 5Ch
7 * Pressure: BMP585: 46h(SDO=0) or 47h(SDO=1)
8 * Temp&Hum: SHT45: 44h
9 * NFC: st25dv04kc: 53h & 57h
10 * Ambient: TSL2591: 29h
11 * CO2: SCD41: 62h
12 * PM: SPS30: 69h
13
14 */
15
16
17
18#include "main.h"
19#include "mysensors.h"
20#include "mysensors_base.h"
21#include "i2c.h"
22#include "utils/utils.h"
23
24
25#include "stm32_timer.h"
26#include "stm32_seq.h"
27#include "sys_app.h"
28#include "adc_if.h"
29#include "CayenneLpp.h"
30
31#include <stdio.h>
32#include <string.h>
33#include <inttypes.h>
34
35/**
36 * @brief sensor groups for reading - the sensors in one group are read together
37 * This is necessary to processing of the similar sensors together as tempHum, ambient, barometer etc. depends on their consumption
38 * every sensor's group has it own count of measuring, timeout between measure
39 * At the end of measure, maybe any sensors need to service, therefor is called method NeedService, which returns 1 - sensor is servicing 0 - not, or
40 * service has been finished
41 */
42typedef enum
43{
44 SENS_GRP_0 = 0, // group 0 (tempHum, ambient, barometer)
45 SENS_GRP_1, // group 1 (sdc41, sps30)
48 SENS_GRP_ALL // all groups - do not use in _sensors
50
51/**
52 * @brief the definition for group of sensor sens_ReadingGrp_t
53 * the number of readings and timeout for reading data from sensors
54 */
55#pragma pack(1)
56typedef struct
57{
58 sens_ReadingGrp_t Group; // group number
59 uint8_t MaxReadCount; // the number of readings data from sensors (0 - no read[temporary off], 255 max)
60 uint16_t TimeoutRead; // timeout between reading from sensor,
62
63/**
64 * @brief sensor definition - interface
65 */
66typedef struct
67{
69 // follows control methods
70 HAL_StatusTypeDef (*Init)(I2C_HandleTypeDef *hi2c); // sensor initialization
71 int8_t (*Is)(I2C_HandleTypeDef *hi2c, int8_t tryInit); // sensor is/isn't present
72 HAL_StatusTypeDef (*On)(I2C_HandleTypeDef *hi2c); // sensor ON - HAL_OK - sensor can work, other sensor fails or not present
73 HAL_StatusTypeDef (*Off)(I2C_HandleTypeDef *hi2c); // sensor OFF
74 HAL_StatusTypeDef (*Read)(I2C_HandleTypeDef *hi2c); // reads data
75 int8_t (*Service)(I2C_HandleTypeDef *hi2c); // service of sensor, sensors must On, processing of service and Off self
76 void (*LogData)(char *buf); // optional, write log data to buf
77 systemParams_Sensors_t Type; // type of sensor
78 const char *Name; // the name of sensor
80#pragma pack()
81/**
82 * @brief definition of sensors group
83 */
85 {
86 { SENS_GRP_0, 5, 500 }, // tempHum,barometer,ambient
87 { SENS_GRP_1, 3, 5100 }, // scd41 - every 5seconds
88 { SENS_GRP_2, 5, 1100 }, // sps30 - every 1second
89 //{ SENS_GRP_3, 10, 3000 } // for debug only - all sensors together
90 };
91
92// !!! the sensor of tempHum must be before barometer, because the barometer sensors needs value of temperature !!!
93
95{
96#ifdef SENSOR_SHT45
98 tmphm_sht45_LogData, SYSPARAM_TEMP_HUM, "tempHum sensor" },
99#endif
100#ifdef SENSOR_BAR_ILS22QS
102 bar_ils22qs_LogData, SYSPARAM_BAR, "barometer ILS22 sensor" },
103#endif
104#ifdef SENSOR_AMB_TSL2591
106 amb_tsl2591_LogData, SYSPARAM_AMBIENT, "ambient sensor" },
107#endif
108#ifdef SENSOR_BAR_BMP585
110 bar_bmp585_LogData, SYSPARAM_BAR, "barometer BMP585 sensor" },
111#endif
112#ifdef SENSOR_SCD41
114 scd41_LogData, SYSPARAM_CO2, "scd41 sensor" },
115#endif
116#ifdef SENSOR_SPS30
118 sps30_LogData, SYSPARAM_PARTICULAR, "sps30 sensor" }, //
119#endif
120};
121
122static I2C_HandleTypeDef *_hi2c = NULL; // current I2C handler -
123
124
125static sens_ProcessDef_t _processDef = SENS_DONE; // process reading sensor data, sensor Reading sequence must start via sensors_Start
126static int _groupInxTiming = 0; // index of current group process
127static sleeper_t _processDelay = {}; // global process timing -> _groupTiming
128static int _groupReadCount = 0; // counter or reading for group -> sens_GrpTiming_t.MaxReadCount
129
130// for sequencer processing
131static UTIL_TIMER_Object_t _sensorTimerReading = {};
132static uint32_t _sensorSeqID = 0, _mylorawanSeqID = 0;
133
134static uint16_t _sensorMeasureTime = 0; // part of memory to know how was interval
135
137{
138 return sizeof(_groupTiming) / sizeof(sens_GrpTiming_t);
139}
141{
142 return sizeof(_sensors) / sizeof(sens_processing_t);
143}
144
145#ifdef WRITELOG
146static char _sensBuffer[1024] = {}; // sensor buffer
147
148static void sensBuffer_Reset()
149{
150 _sensBuffer[0] = '\0';
151}
152
153static void sensBuffer_Add(const char *format, ...)
154{
155 va_list argList;
156 va_start(argList, format);
157 int len = strlen(_sensBuffer);
158
159 vsprintf(_sensBuffer + len, format, argList);
160 va_end(argList);
161}
162
163static char* sensBuffer_Get()
164{
165 return _sensBuffer + strlen(_sensBuffer);
166}
167
168static void sensBuffer_Send()
169{
170 if (_sensBuffer[0])
171 {
172 strcat(_sensBuffer, "\r\n");
174 }
175}
176#else
177#define sensBuffer_Reset()
178#define sensBuffer_Add(format, ...)
179#define sensBuffer_Get() NULL
180#define sensBuffer_Send()
181#endif
182
183static int _i2cOnOff = 1; // default is ON
184void i2c_OnOff(uint8_t onOff)
185{
186 if (onOff)
187 {
188 if (_i2cOnOff++ == 0)
189 MX_I2C2_Init(); // reinit
190 }
191 else
192 if (_i2cOnOff > 0)
193 {
194 if (--_i2cOnOff == 0)
195 MX_I2C2_DeInit(); // deinit - low power
196 }
197}
198
199/**
200 * @brief On/Off sensors according to group
201 * @param grp - specified group, if SENS_GRP_LAST - all sensors
202 * @return number of sensors started from group
203 */
204static int sensors_OnOff(sens_ReadingGrp_t grp, int onOff)
205{
206 int i, count = getCount_Sensors(), started = 0;
207
208 writeLog("Sensors:%s", (onOff ? "On" : "Off"));
209 for (i = 0; i < count; i++)
210 {
211 if (systemParams_IsSensorAvaiable(_sensors[i].Type) && (grp == SENS_GRP_ALL || _sensors[i].GroupTiming.Group == grp))
212 {
213 if (onOff)
214 {
215 if (_sensors[i].On != NULL)
216 if (_sensors[i].On(_hi2c) == HAL_OK)
217 started++;
218 }
219 else
220 {
221 if (_sensors[i].Off != NULL)
222 _sensors[i].Off(_hi2c);
223 }
224 }
225 }
226 return started;
227}
228
229/**
230 * @brief reading sensor one by one in specified group
231 * @param grp specified group, if SENS_GRP_LAST - all sensors
232 */
234{
235 HAL_StatusTypeDef status;
236 int i, count = getCount_Sensors();
237
239 sensBuffer_Add("group:%d ", (int) grp);
240 for (i = 0; i < count; i++)
241 {
242 if (systemParams_IsSensorAvaiable(_sensors[i].Type) && (grp == SENS_GRP_ALL || _sensors[i].GroupTiming.Group == grp))
243 {
244 if (_sensors[i].Is != NULL && _sensors[i].Is(_hi2c, _tryInit) && _sensors[i].Read != NULL)
245 {
246 status = _sensors[i].Read(_hi2c);
247 if (status == HAL_OK)
248 if (_sensors[i].LogData != NULL)
249 _sensors[i].LogData(sensBuffer_Get());
250 }
251 }
252 }
254}
255
256/**
257 * @brief Move to next used group in _sensors[]
258 */
259static uint8_t sensors_NextGroup()
260{
261 int i, count = getCount_Sensors();
262
264 for (i = 0; i < count; i++)
265 {
266 if (_sensors[i].GroupTiming.Group == _groupTiming[_groupInxTiming].Group)
267 return 1; // the group has been found
268 }
269 return 0;
270}
271
272static uint8_t sensors_Service()
273{
274 int i, count = getCount_Sensors();
275 uint8_t underService = 0;
276
277 for (i = 0; i < count; i++)
278 if (systemParams_IsSensorAvaiable(_sensors[i].Type) && _sensors[i].Service != NULL && _sensors[i].Service(_hi2c))
279 underService++;
280 return underService;
281}
282
283///////////////////////////////////////////////////////////////////
284// sequencer
285///////////////////////////////////////////////////////////////////
286/**
287 * @brief task sensor sequencer
288 */
289static void tasksensors_Work()
290{
292
293 switch (s)
294 {
295 case SENS_DONE:
296 UTIL_TIMER_Start(&_sensorTimerReading); // next start, nevertheless data send or not from memory - no, next process to start measure is joined to wakeup - is start sensorsBase_StopTimerToOff -> sensors_Retiming
297 break;
298
299 case SENS_DATAREADY:
300 //UTIL_SEQ_SetEvt(_mylorawanSeqID); // data can be processing, event is fired
301 UTIL_SEQ_SetTask((1 << _mylorawanSeqID), CFG_SEQ_Prio_0); // the mylorawan processing for send data, better than event? CFG_SEQ_Task_MyLoraSend -> myloraWan_MeasureFinish
302 //break; ok, after SENS_DATAREADY, task must be started
303 default:
304 UTIL_SEQ_SetTask((1 << _sensorSeqID), CFG_SEQ_Prio_0); // next calling of tasksensors_Work
305 }
306}
307
309{
310 if (_systemParams.DevOnOff)
311 {
313 UTIL_SEQ_SetTask((1 << _sensorSeqID), CFG_SEQ_Prio_0); // start of tasksensors_Work
314 }
315}
316
317// ------------- public -----------------------
318
320{
322 _groupInxTiming = -1;
324 _groupReadCount = 0;
325 sleeper_SetSleepMS(&_processDelay, 0); // no timer at start
326}
327
329{
331 {
332 switch (_processDef)
333 {
334 case SENS_BEGIN:
335 i2c_OnOff(1); // I2C on
336 sleeper_SetSleepMS(&_processDelay, 500); // little pause after init of I2C
338 break;
339 case SENS_INIT:
340 sensors_Init(NULL);
341 sleeper_SetSleepMS(&_processDelay, 500); // little pause after init of sensors
343 break;
344 case SENS_START:
345 _groupReadCount = 0;
346 if (sensors_OnOff(_groupTiming[_groupInxTiming].Group, 1) > 0) // start sensors for specified group
347 {
348 sleeper_SetSleepMS(&_processDelay, _groupTiming[_groupInxTiming].TimeoutRead); // reading data from sensor every x msseconds for group
350 }
351 else
352 {
353 _processDef = SENS_STOP; // no sensors from group is available
354 _processDelay.SleepMS = 0; //
355 }
356 break;
357 case SENS_READ:
358 if (_groupTiming[_groupInxTiming].MaxReadCount) // is required any reading?
359 {
362 togle_LedOff(0);
364 }
365 if (_groupReadCount >= _groupTiming[_groupInxTiming].MaxReadCount) // maximum read count has been reached
366 {
368 _processDelay.SleepMS = 0; // stop timer
369 togle_LedOff(1);
370 }
371 break;
372 case SENS_STOP:
373 _processDelay.SleepMS = 0; // stop timer
374 sensors_OnOff(_groupTiming[_groupInxTiming].Group, 0); // stop sensors for specified group
375 if (sensors_NextGroup())
377 else
378 _processDef = SENS_DATAREADY; // no more group, data ready
379 break;
380 case SENS_DATAREADY:
382 break;
383 case SENS_SERVICE:
384 if (!sensors_Service())
386 break;
387 case SENS_END:
389 i2c_OnOff(0);
390 break;
391 case SENS_DONE:
392 // never reach this line
393 break;
394 }
395 }
396 return _processDef;
397}
398
399void sensors_Init(I2C_HandleTypeDef *hi2c)
400{
401 HAL_StatusTypeDef status;
402 int i, count = getCount_Sensors();
403
404 if (hi2c != NULL)
405 _hi2c = hi2c;
406
407// initialization of individual sensors
408 for (i = 0; i < count; i++)
409 {
410 if (_sensors[i].Init != NULL)
411 {
413 {
414 status = _sensors[i].Init(_hi2c);
415 writeLog("%d. %s Init %s.", i, ((_sensors[i].Name != NULL) ? _sensors[i].Name : "sensor"), ((status == HAL_OK) ? "OK" : "failed"));
416 }
417 }
418 else
419 writeLog("%d. sensor: Init is NULL", i);
420 }
421 sensors_OnOff(SENS_GRP_ALL, 0); // on start, all sensors OFF
422}
423
425{
426 if (_systemParams.DevOnOff)
427 {
428 UTIL_TIMER_Stop(&_sensorTimerReading);
429 UTIL_TIMER_Start(&_sensorTimerReading);
430 }
431}
432
433/**
434 * @brief task sequencer initialization for sensors reading
435 */
436void sensorsSeq_Init(uint32_t sensortAppBit, uint32_t mylorawanAppBit)
437{
438 _sensorSeqID = sensortAppBit;
439 _mylorawanSeqID = mylorawanAppBit;
440 UTIL_SEQ_RegTask((1 << _sensorSeqID), UTIL_SEQ_RFU, tasksensors_Work);
441 UTIL_TIMER_Create(&_sensorTimerReading, _systemParams.SensTimeoutMeasure, UTIL_TIMER_ONESHOT, tasksensors_OnTimeout, NULL);
442 tasksensors_OnTimeout(); // start reading of sensors data and timer after reading
443 //UTIL_TIMER_Start(&_sensorTimerReading);
444}
445
446
448{
449#ifdef SENSOR_SHT45
451#endif
452#ifdef SENSOR_AMB_TSL2591
454#endif
455#ifdef SENSOR_BAR_ILS22QS
457#endif
458#ifdef SENSOR_BAR_BMP585
460#endif
461#ifdef SENSOR_SCD41
463#endif
464#ifdef SENSOR_SPS30
466#endif
467}
468
469uint8_t* sensors_CayennelFromBckData(uint8_t *sizeOut)
470{
471 uint8_t sz, channel = 1;
472// float batVoltage = (float) SYS_GetBatteryLevel() / 100.0f; // abs value of voltage
473 float batPerc = ((float) GetBatteryLevel() / 254.0f) * 100.0f;
474
476#ifdef SENSOR_SHT45
477 if (_bck_tmphm_sht45Data.IsDataValid)
478 {
479 CayenneLppAddTemperature(channel++, _bck_tmphm_sht45Data.Temperature);
481 }
482#endif
483#ifdef SENSOR_AMB_TSL2591
484 if (_bck_amb_tsl2591Data.IsDataValid)
485 {
486 CayenneLppAddLuminosity(channel++, (uint16_t) _bck_amb_tsl2591Data.Lux);
487 }
488#endif
489#ifdef SENSOR_BAR_ILS22QS
490 if (_bck_bar_ils22qsData.IsDataValid)
491 {
492 //CayenneLppAddTemperature(channel++, _tempBarometerData.Temperature);
494 }
495#endif
496#ifdef SENSOR_BAR_BMP585
497 if (_bck_bar_bmp585Data.IsDataValid)
498 {
499 //CayenneLppAddTemperature(channel++, _tempBarometerData.Temperature);
501 }
502#endif
503#ifdef SENSOR_SCD41
504 if (_bck_scd41Data.IsDataValid)
505 {
506 CayenneLppAddConcentration(channel++, (uint16_t) _bck_scd41Data.Co2);
507 CayenneLppAddTemperature(channel++, _bck_scd41Data.Temperature);
509 }
510#endif
511#ifdef SENSOR_SPS30
512 if (_bck_sps30Data.IsDataValid)
513 {
516 }
517#endif
518 //CayenneLppAddTimeFromJoin(channel++, 666);
519 // CayenneLppAddVoltage(channel++, batVoltage);
520 CayenneLppAddVoltage(channel++, batPerc);
521// CayenneLppAddTimeFromJoin(channel++, SysTimeGet().Seconds); // LINUX time
522 CayenneLppAddMeasureInterval(channel++, _sensorMeasureTime);// time of measure - interval in minutes
523
524 sz = CayenneLppGetSize();
525 if (sizeOut != NULL)
526 *sizeOut = sz;
527 return (sz) ? CayenneLppGetBuffer() : NULL;
528}
529
531{
532 uint16_t off = 0;
533
534 // measure time
535 _sensorMeasureTime = (uint16_t)(((float)_systemParams.SensTimeoutMeasure / (1000.0f * 60.0f)) * 10.0f); // from ms to minutes*10
536
537 memcpy(data->Data + off, &_sensorMeasureTime, sizeof(_sensorMeasureTime));
538 off += sizeof(_sensorMeasureTime);
539
540
541
542#ifdef SENSOR_SHT45
543 memcpy(data->Data + off, &_bck_tmphm_sht45Data, sizeof(_bck_tmphm_sht45Data));
544 off += sizeof(_bck_tmphm_sht45Data);
545#endif
546#ifdef SENSOR_AMB_TSL2591
547 memcpy(data->Data + off, &_bck_amb_tsl2591Data, sizeof(_bck_amb_tsl2591Data));
548 off += sizeof(_bck_amb_tsl2591Data);
549#endif
550#ifdef SENSOR_BAR_ILS22QS
551 memcpy(data->Data + off, &_bck_bar_ils22qsData, sizeof(_bck_bar_ils22qsData));
552 off += sizeof(_bck_bar_ils22qsData);
553#endif
554#ifdef SENSOR_BAR_BMP585
555 memcpy(data->Data + off, &_bck_bar_bmp585Data, sizeof(_bck_bar_bmp585Data));
556 off += sizeof(_bck_bar_bmp585Data);
557#endif
558#ifdef SENSOR_SCD41
559 memcpy(data->Data + off, &_bck_scd41Data, sizeof(_bck_scd41Data));
560 off += sizeof(_bck_scd41Data);
561#endif
562#ifdef SENSOR_SPS30
563 memcpy(data->Data + off, &_bck_sps30Data, sizeof(_bck_sps30Data));
564 off += sizeof(_bck_sps30Data);
565#endif
566 if (off > SENSORS_DATASIZE)
567 {
568 writeLog("The sensors_FillDataBlock %d>=SENSORS_DATASIZE(%d)!", (int)off, (int)SENSORS_DATASIZE);
570 }
572 data->Size = (uint8_t)off;
573}
574
576{
577 uint8_t off = 0;
578 if (data->Type == MEMS_DATATYPE_SENSOR)
579 {
580 // measure time
581 memcpy(&_sensorMeasureTime, data->Data + off, sizeof(_sensorMeasureTime));
582 off += sizeof(_sensorMeasureTime);
583
584#ifdef SENSOR_SHT45
585 memcpy(&_bck_tmphm_sht45Data, data->Data + off, sizeof(_bck_tmphm_sht45Data));
586 off += sizeof(_bck_tmphm_sht45Data);
587#endif
588#ifdef SENSOR_AMB_TSL2591
589 memcpy(&_bck_amb_tsl2591Data, data->Data + off, sizeof(_bck_amb_tsl2591Data));
590 off += sizeof(_bck_amb_tsl2591Data);
591#endif
592#ifdef SENSOR_BAR_ILS22QS
593 memcpy(&_bck_bar_ils22qsData, data->Data + off, sizeof(_bck_bar_ils22qsData));
594 off += sizeof(_bck_bar_ils22qsData);
595#endif
596#ifdef SENSOR_BAR_BMP585
597 memcpy(&_bck_bar_bmp585Data, data->Data + off, sizeof(_bck_bar_bmp585Data));
598 off += sizeof(_bck_bar_bmp585Data);
599#endif
600#ifdef SENSOR_SCD41
601 memcpy(&_bck_scd41Data, data->Data + off, sizeof(_bck_scd41Data));
602 off += sizeof(_bck_scd41Data);
603#endif
604#ifdef SENSOR_SPS30
605 memcpy(&_bck_sps30Data, data->Data + off, sizeof(_bck_sps30Data));
606 off += sizeof(_bck_sps30Data);
607#endif
608 }
609 return off;
610}
uint8_t CayenneLppAddTemperature(uint8_t channel, float celsius)
Definition CayenneLpp.c:261
uint8_t * CayenneLppGetBuffer(void)
Definition CayenneLpp.c:127
uint8_t CayenneLppAddConcentration(uint8_t channel, uint16_t ppm)
Add CO2 concentration data to the buffer.
Definition CayenneLpp.c:418
uint8_t CayenneLppAddLuminosity(uint8_t channel, uint16_t lux)
Definition CayenneLpp.c:224
uint8_t CayenneLppAddBarometricPressure(uint8_t channel, float hpa)
Definition CayenneLpp.c:326
uint8_t CayenneLppAddVoltage(uint8_t channel, float voltage)
Add voltage data to the buffer.
Definition CayenneLpp.c:437
void CayenneLppReset(void)
Definition CayenneLpp.c:111
uint8_t CayenneLppAddParticulateMatter_1_0(uint8_t channel, float concentration_1_0)
Add particulate matter of 1mm concentration data to the buffer.
Definition CayenneLpp.c:457
uint8_t CayenneLppAddParticulateMatter_2_5(uint8_t channel, float concentration_2_5)
Add particulate matter 2.5mm concentration data to the buffer.
Definition CayenneLpp.c:477
uint8_t CayenneLppAddRelativeHumidity(uint8_t channel, float rh)
Definition CayenneLpp.c:281
uint8_t CayenneLppGetSize(void)
Definition CayenneLpp.c:119
uint8_t CayenneLppAddMeasureInterval(uint8_t channel, uint16_t min10)
Add the measure interval in minutes *10 of data measuring.
Definition CayenneLpp.c:526
Implements the Cayenne Low Power Protocol.
Header for ADC interface configuration.
void amb_tsl2591_LogData(char *buf)
log data to buffer
amb_tsl2591_t _bck_amb_tsl2591Data
Snapshot copy of the last completed TSL2591 measurement; used for LoRaWAN transmission.
Definition amb_tsl2591.c:33
amb_tsl2591_t _amb_tsl2591Data
Live measurement data from the TSL2591 sensor; updated by amb_tsl2591_Read().
Definition amb_tsl2591.c:32
int8_t amb_tsl2591_Is(I2C_HandleTypeDef *hi2c, int8_t tryInit)
check if light sensor is present
Definition amb_tsl2591.c:35
HAL_StatusTypeDef amb_tsl2591_Read(I2C_HandleTypeDef *hi2c)
read value from sensor, the value is in _ambientData
HAL_StatusTypeDef amb_tsl2591_Off(I2C_HandleTypeDef *hi2c)
turn off sensor
HAL_StatusTypeDef amb_tsl2591_On(I2C_HandleTypeDef *hi2c)
turn on sensor, read value 4x to automatically configure the sensor.
Definition amb_tsl2591.c:57
HAL_StatusTypeDef amb_tsl2591_Init(I2C_HandleTypeDef *hi2c)
initialization of light sensor, and check if sensor is present or not Subsequently the sensor is turn...
HAL_StatusTypeDef bar_bmp585_On(I2C_HandleTypeDef *hi2c)
Turn on sensor - wakeup the sensor and start to processing of pressure measure.
Definition bar_bmp585.c:96
HAL_StatusTypeDef bar_bmp585_Off(I2C_HandleTypeDef *hi2c)
Turn off sensor - stop measure and put sensor in very deep sleep mode.
Definition bar_bmp585.c:112
HAL_StatusTypeDef bar_bmp585_Read(I2C_HandleTypeDef *hi2c)
Read value from sensor, pressure and temperature. Sensor must be turned on before.
Definition bar_bmp585.c:154
void bar_bmp585_LogData(char *buf)
Log data to buffer.
Definition bar_bmp585.c:219
HAL_StatusTypeDef bar_bmp585_Init(I2C_HandleTypeDef *hi2c)
Initialize sensor, check if it really is this sensor. After check the sensor is turned off to save po...
Definition bar_bmp585.c:119
bar_bmp585_t _bar_bmp585Data
Live measurement data from the BMP585 sensor; updated by bar_bmp585_Read().
Definition bar_bmp585.c:47
bar_bmp585_t _bck_bar_bmp585Data
Snapshot copy of the last completed BMP585 measurement; used for LoRaWAN transmission.
Definition bar_bmp585.c:48
int8_t bar_bmp585_Is(I2C_HandleTypeDef *hi2c, int8_t tryInit)
Check if sensor is present.
Definition bar_bmp585.c:89
int8_t bar_ils22qs_Is(I2C_HandleTypeDef *hi2c, int8_t tryInit)
Check if the ILPS22QS barometric pressure sensor is present on the I2C bus.
Definition bar_ils22qs.c:67
HAL_StatusTypeDef bar_ils22qs_Init(I2C_HandleTypeDef *hi2c)
Initialise the ILPS22QS sensor and verify it is present on the I2C bus. The sensor is put into low-po...
HAL_StatusTypeDef bar_ils22qs_Read(I2C_HandleTypeDef *hi2c)
read value from sensor, pressure and temperature. Sensor must be turned on before
HAL_StatusTypeDef bar_ils22qs_On(I2C_HandleTypeDef *hi2c)
turn on sensor
Definition bar_ils22qs.c:74
void bar_ils22qs_LogData(char *buf)
log data to buffer
bar_ils22qs_t _bar_ils22qsData
Live measurement data from the ILPS22QS sensor; updated by bar_ils22qs_Read().
Definition bar_ils22qs.c:31
HAL_StatusTypeDef bar_ils22qs_Off(I2C_HandleTypeDef *hi2c)
turn off sensor
Definition bar_ils22qs.c:94
bar_ils22qs_t _bck_bar_ils22qsData
Snapshot copy of the last completed ILPS22QS measurement; used for LoRaWAN transmission.
Definition bar_ils22qs.c:32
This file contains all the function prototypes for the i2c.c file.
void MX_I2C2_Init(void)
Initialise the I2C2 peripheral (hi2c2) as configured by STM32CubeMX. Sets clock speed,...
Definition i2c.c:30
void MX_I2C2_DeInit(void)
Deinitialise the I2C2 peripheral to reduce current consumption in low-power mode. Call before enterin...
Definition i2c.c:150
: Header for main.c file. This file contains the common defines of the application.
void Error_Handler(void)
Default error handler called by HAL on unrecoverable errors. Disables interrupts and enters an infini...
Definition main.c:505
void writeLog(const char *format,...)
Format and send a log message over UART (printf-style). Available only when WRITELOG is defined; comp...
Definition main.c:97
void togle_LedOff(int off)
togle led
Definition main.c:151
void writeLogNL(const char *buf)
Send a pre-formatted C string to the UART log followed by a newline.
Definition main.c:80
@ MEMS_DATATYPE_SENSOR
Definition mymems.h:67
static I2C_HandleTypeDef * _hi2c
Definition mysensors.c:122
static int getCount_GroupTiming()
Definition mysensors.c:136
sens_ReadingGrp_t
sensor groups for reading - the sensors in one group are read together This is necessary to processin...
Definition mysensors.c:43
@ SENS_GRP_1
Definition mysensors.c:45
@ SENS_GRP_2
Definition mysensors.c:46
@ SENS_GRP_0
Definition mysensors.c:44
@ SENS_GRP_3
Definition mysensors.c:47
@ SENS_GRP_ALL
Definition mysensors.c:48
static uint8_t sensors_NextGroup()
Move to next used group in _sensors[].
Definition mysensors.c:259
void sensors_Init(I2C_HandleTypeDef *hi2c)
Initialization of all sensors, must be called before for store of hi2c handler.
Definition mysensors.c:399
void sensors_WriteFromBckToDataBlock(mems_DataBlock_t *data)
filling the data block from sensor data - store to memory the methods works with _bck_XXXXX senzor,...
Definition mysensors.c:530
sens_ProcessDef_t sensors_Work()
no sequncer processing reading data from sensor according to group specification
Definition mysensors.c:328
void sensorsSeq_Init(uint32_t sensortAppBit, uint32_t mylorawanAppBit)
task sequencer initialization for sensors reading
Definition mysensors.c:436
static int _i2cOnOff
Definition mysensors.c:183
void sensors_Start()
non squncer processing start of reading - prepare of internal state machine
Definition mysensors.c:319
uint8_t * sensors_CayennelFromBckData(uint8_t *sizeOut)
collecting sensor data into CayenneLppGetBuffer buffer for sending them via LoRa the methods works wi...
Definition mysensors.c:469
static void tasksensors_Work()
task sensor sequencer
Definition mysensors.c:289
void sensors_Retiming()
the System goes to OFF mode - retiming of timer sensor reading
Definition mysensors.c:424
static sens_ProcessDef_t _processDef
Definition mysensors.c:125
static void sensBuffer_Add(const char *format,...)
Definition mysensors.c:153
static uint32_t _mylorawanSeqID
Definition mysensors.c:132
static uint16_t _sensorMeasureTime
Definition mysensors.c:134
static void sensBuffer_Reset()
Definition mysensors.c:148
static const sens_GrpTiming_t _groupTiming[]
definition of sensors group
Definition mysensors.c:84
static int _groupReadCount
Definition mysensors.c:128
static void sensBuffer_Send()
Definition mysensors.c:168
static char _sensBuffer[1024]
Definition mysensors.c:146
static UTIL_TIMER_Object_t _sensorTimerReading
Definition mysensors.c:131
static char * sensBuffer_Get()
Definition mysensors.c:163
static void sensors_Read(sens_ReadingGrp_t grp)
reading sensor one by one in specified group
Definition mysensors.c:233
static int _groupInxTiming
Definition mysensors.c:126
static int getCount_Sensors()
Definition mysensors.c:140
static void tasksensors_OnTimeout()
Definition mysensors.c:308
void i2c_OnOff(uint8_t onOff)
possible to I2C turn on/off - cumulative
Definition mysensors.c:184
static sleeper_t _processDelay
Definition mysensors.c:127
static const sens_processing_t _sensors[]
Definition mysensors.c:94
static uint8_t sensors_Service()
Definition mysensors.c:272
void sensors_CopyToBck()
The copying data from current sensors buffer to backUp - _bck_XXXXX.
Definition mysensors.c:447
static uint32_t _sensorSeqID
Definition mysensors.c:132
uint8_t sensors_ReadToBckFromDataBlock(const mems_DataBlock_t *data)
reading from memory block and filling specified sensor from memory - ready for sensors_CayennelData t...
Definition mysensors.c:575
static int sensors_OnOff(sens_ReadingGrp_t grp, int onOff)
On/Off sensors according to group.
Definition mysensors.c:204
sens_ProcessDef_t
State machine states for the sensor reading process.
Definition mysensors.h:26
@ SENS_SERVICE
Definition mysensors.h:33
@ SENS_INIT
Definition mysensors.h:28
@ SENS_START
Definition mysensors.h:29
@ SENS_READ
Definition mysensors.h:30
@ SENS_DATAREADY
Definition mysensors.h:32
@ SENS_DONE
Definition mysensors.h:35
@ SENS_STOP
Definition mysensors.h:31
@ SENS_BEGIN
Definition mysensors.h:27
@ SENS_END
Definition mysensors.h:34
systemParams_t _systemParams
systemParams_Sensors_t
Bitmask of sensor modules that are enabled / available for data collection. Used in systemParams_t....
@ SYSPARAM_CO2
@ SYSPARAM_BAR
@ SYSPARAM_PARTICULAR
@ SYSPARAM_AMBIENT
@ SYSPARAM_TEMP_HUM
#define SENSORS_DATASIZE
Total size in bytes of one packed sensor data record. Computed as the sum of all enabled sensor struc...
int8_t _tryInit
uint8_t systemParams_IsSensorAvaiable(systemParams_Sensors_t sensorType)
Check whether a particular sensor is enabled in _systemParams.AvailableSensors.
HAL_StatusTypeDef scd41_Off(I2C_HandleTypeDef *hi2c)
stop reading
Definition scd41.c:94
void scd41_LogData(char *buf)
log data to buffer
Definition scd41.c:228
HAL_StatusTypeDef scd41_Init(I2C_HandleTypeDef *hi2c)
initialization of sensor sdc41
Definition scd41.c:99
scd41_t _scd41Data
Live measurement data from the SCD41 sensor; updated by scd41_Read().
Definition scd41.c:39
HAL_StatusTypeDef scd41_Read(I2C_HandleTypeDef *hi2c)
read value from sensor
Definition scd41.c:190
HAL_StatusTypeDef scd41_On(I2C_HandleTypeDef *hi2c)
start reading - turn on sensor, reading mode can be: SCD41_CMD_START_PERIODIC - every 5s - this is pr...
Definition scd41.c:77
int8_t scd41_Is(I2C_HandleTypeDef *hi2c, int8_t tryInit)
check if CO2 sensor is present
Definition scd41.c:70
scd41_t _bck_scd41Data
Snapshot copy of the last completed measurement; used for LoRaWAN transmission.
Definition scd41.c:40
sps30_t _bck_sps30Data
Snapshot copy of the last completed SPS30 measurement; used for LoRaWAN transmission.
Definition sps30.c:39
HAL_StatusTypeDef sps30_Read(I2C_HandleTypeDef *hi2c)
Read data if data is available.
Definition sps30.c:224
void sps30_LogData(char *buf)
log data to buffer
Definition sps30.c:356
HAL_StatusTypeDef sps30_Off(I2C_HandleTypeDef *hi2c)
Turn off laser and fan to stop measurements.
Definition sps30.c:175
int8_t sps30_Is(I2C_HandleTypeDef *hi2c, int8_t tryInit)
check if SPS30 sensor is present
Definition sps30.c:83
int8_t sps30_Service(I2C_HandleTypeDef *hi2c)
the sensor need to be cleaning
Definition sps30.c:367
HAL_StatusTypeDef sps30_Init(I2C_HandleTypeDef *hi2c)
initialization of sensor sps30
Definition sps30.c:90
HAL_StatusTypeDef sps30_On(I2C_HandleTypeDef *hi2c)
Turn on laser and fan to allow measurements.
Definition sps30.c:128
sps30_t _sps30Data
Live measurement data from the SPS30 sensor; updated by sps30_Read().
Definition sps30.c:38
Sensor data record stored as one element in the flash circular queue.
Definition mymems.h:78
uint8_t Size
Definition mymems.h:81
mems_DataType_t Type
Definition mymems.h:80
uint8_t Data[(sizeof(uint16_t)+sizeof(tmphm_sht45_t)+sizeof(amb_tsl2591_t)+sizeof(bar_ils22qs_t)+sizeof(bar_bmp585_t)+sizeof(scd41_t)+sizeof(sps30_t))]
Definition mymems.h:82
the definition for group of sensor sens_ReadingGrp_t the number of readings and timeout for reading d...
Definition mysensors.c:57
sens_ReadingGrp_t Group
Definition mysensors.c:58
uint16_t TimeoutRead
Definition mysensors.c:60
uint8_t MaxReadCount
Definition mysensors.c:59
sensor definition - interface
Definition mysensors.c:67
int8_t(* Is)(I2C_HandleTypeDef *hi2c, int8_t tryInit)
Definition mysensors.c:71
HAL_StatusTypeDef(* Read)(I2C_HandleTypeDef *hi2c)
Definition mysensors.c:74
systemParams_Sensors_t Type
Definition mysensors.c:77
const char * Name
Definition mysensors.c:78
int8_t(* Service)(I2C_HandleTypeDef *hi2c)
Definition mysensors.c:75
sens_GrpTiming_t GroupTiming
Definition mysensors.c:68
HAL_StatusTypeDef(* Off)(I2C_HandleTypeDef *hi2c)
Definition mysensors.c:73
HAL_StatusTypeDef(* Init)(I2C_HandleTypeDef *hi2c)
Definition mysensors.c:70
HAL_StatusTypeDef(* On)(I2C_HandleTypeDef *hi2c)
Definition mysensors.c:72
void(* LogData)(char *buf)
Definition mysensors.c:76
Non-blocking timer utility – similar to HAL_Delay but without CPU blocking.
Definition utils.h:28
Function prototypes for sys_app.c file.
uint8_t GetBatteryLevel(void)
callback to get the battery level in % of full charge (254 full charge, 0 no charge)
Definition sys_app.c:152
HAL_StatusTypeDef tmphm_sht45_On(I2C_HandleTypeDef *hi2c)
Zapnutie sensora dummy.
Definition tmphm_sht45.c:57
HAL_StatusTypeDef tmphm_sht45_Init(I2C_HandleTypeDef *hi2c)
initialization, check if sensor is present or not. Checks main (0x44) and alternative address (0x45) ...
Definition tmphm_sht45.c:76
HAL_StatusTypeDef tmphm_sht45_Read(I2C_HandleTypeDef *hi2c)
read temperature and humidity from sensor, values are in _tempHumData
void tmphm_sht45_LogData(char *buf)
log data to buffer
tmphm_sht45_t _bck_tmphm_sht45Data
Snapshot copy of the last completed SHT45 measurement; used for LoRaWAN transmission.
Definition tmphm_sht45.c:28
HAL_StatusTypeDef tmphm_sht45_Off(I2C_HandleTypeDef *hi2c)
turn off sensor - dummy
Definition tmphm_sht45.c:70
tmphm_sht45_t _tmphm_sht45Data
Live measurement data from the SHT45 sensor; updated by tmphm_sht45_Read().
Definition tmphm_sht45.c:27
int8_t tmphm_sht45_Is(I2C_HandleTypeDef *hi2c, int8_t tryInit)
check if tempHum sensor is present
Definition tmphm_sht45.c:40
@ CFG_SEQ_Prio_0
void sleeper_SetSleepMS(sleeper_t *v, uint32_t sleepMS)
Change the sleep duration and restart the timer from now.
Definition utils.c:41
void sleeper_Next(sleeper_t *v)
Restart the timer so the next period begins from now. InicTime is updated to the current HAL tick.
Definition utils.c:35
int sleeper_IsElapsed(const sleeper_t *v)
Check whether the configured time interval has elapsed.
Definition utils.c:21