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#include "utils/mydefs.h"
24
25
26#include "stm32_timer.h"
27#include "stm32_seq.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
101 { _groupTiming[0], bar_ils22qs_Init, bar_ils22qs_Is, bar_ils22qs_On, bar_ils22qs_Off, bar_ils22qs_Read, NULL,
102 bar_ils22qs_LogData, SYSPARAM_BAR, "barometer ILS22 sensor" },
103#endif
104#ifdef SENSOR_AMB_TSL2591
105 { _groupTiming[0], amb_tsl2591_Init, amb_tsl2591_Is, amb_tsl2591_On, amb_tsl2591_Off, amb_tsl2591_Read, NULL,
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
113 { _groupTiming[1], scd41_Init, scd41_Is, scd41_On, scd41_Off, scd41_Read, NULL,
114 scd41_LogData, SYSPARAM_CO2, "scd41 sensor" },
115#endif
116#ifdef SENSOR_SPS30
117 { _groupTiming[2], sps30_Init, sps30_Is, sps30_On, sps30_Off, sps30_Read, sps30_Service,
118 sps30_LogData, SYSPARAM_PARTICULAR, "sps30 sensor" }, //
119#endif
120};
121
122/**
123 * @brief anonymous global struct for current sensor data flow
124 */
125static struct
126{
127 I2C_HandleTypeDef *Hi2c; /**< current I2C handler */
128 sens_ProcessDef_t ProcessDef; /**< process reading sensor data, sensor Reading sequence must start via sensors_Start */
129 int8_t GroupInxTiming : 4; /**< index of current group process - max 7 groups, can be negative */
130 sleeper_t ProcessDelay; /**< global process timing -> _groupTiming */
131 uint8_t GroupReadCount; /**< counter or reading for group -> sens_GrpTiming_t.MaxReadCount */
132
133 // for sequencer processing
134 UTIL_TIMER_Object_t SensorTimerReading; /**< semsor timer reading */
135 uint8_t SensorSeqID : 4; /**< bit sequencer for sensor reading CFG_SEQ_Task_Sensors - max 4 bit, CFG_SEQ_Task_Sensors */
136 uint8_t MylorawanSeqID : 4; /**< bit sequencer for mylorawan - the measure is finished, data processing send */
137
138 SysTime_t MeasureTime; /**< time when measure was done */
140
141
143{
144 return sizeof(_groupTiming) / sizeof(sens_GrpTiming_t);
145}
147{
148 return sizeof(_sensors) / sizeof(sens_processing_t);
149}
150
151#ifdef WRITELOG
152static char _sensBuffer[1024] = {}; // sensor buffer
153
154static void sensBuffer_Reset()
155{
156 _sensBuffer[0] = '\0';
157}
158
159static void sensBuffer_Add(const char *format, ...)
160{
161 va_list argList;
162 va_start(argList, format);
163 int len = strlen(_sensBuffer);
164
165 vsprintf(_sensBuffer + len, format, argList);
166 va_end(argList);
167}
168
169static char* sensBuffer_Get()
170{
171 return _sensBuffer + strlen(_sensBuffer);
172}
173
174static void sensBuffer_Send()
175{
176 if (_sensBuffer[0])
177 {
178 strcat(_sensBuffer, "\r\n");
180 }
181}
182#else
183#define sensBuffer_Reset()
184#define sensBuffer_Add(format, ...)
185#define sensBuffer_Get() NULL
186#define sensBuffer_Send()
187#endif
188
189static int _i2cOnOff = 1; // default is ON, 3V3 too, set in CubeMX
190void i2c_OnOff(uint8_t onOff)
191{
192 if (onOff)
193 {
194 if (_i2cOnOff++ == 0)
195 {
196 Power3v3_On(); // the peripherials must be ON
197 MX_I2C2_Init(); // reinit
198 }
199 }
200 else
201 if (_i2cOnOff > 0)
202 {
203 if (--_i2cOnOff == 0)
204 {
205 MX_I2C2_DeInit(); // deinit - low power
206 Power3v3_Off(); // powering off
207 }
208 }
209}
210
211/**
212 * @brief On/Off sensors according to group
213 * @param grp - specified group, if SENS_GRP_LAST - all sensors
214 * @return number of sensors started from group
215 */
216static int sensors_OnOff(sens_ReadingGrp_t grp, int onOff)
217{
218 int i, count = getCount_Sensors(), started = 0;
219
220 writeLog("Sensors:%s", (onOff ? "On" : "Off"));
221 for (i = 0; i < count; i++)
222 {
223 if (systemParams_IsSensorAvaiable(_sensors[i].Type) && (grp == SENS_GRP_ALL || _sensors[i].GroupTiming.Group == grp))
224 {
225 if (onOff)
226 {
227 if (_sensors[i].On != NULL)
228 if (_sensors[i].On(_.Hi2c) == HAL_OK)
229 started++;
230 }
231 else
232 {
233 if (_sensors[i].Off != NULL)
234 _sensors[i].Off(_.Hi2c);
235 }
236 }
237 }
238 return started;
239}
240
241/**
242 * @brief reading sensor one by one in specified group
243 * @param grp specified group, if SENS_GRP_LAST - all sensors
244 */
246{
247 HAL_StatusTypeDef status;
248 int i, count = getCount_Sensors();
249
251 sensBuffer_Add("group:%d ", (int) grp);
252 for (i = 0; i < count; i++)
253 {
254 if (systemParams_IsSensorAvaiable(_sensors[i].Type) && (grp == SENS_GRP_ALL || _sensors[i].GroupTiming.Group == grp))
255 {
256 if (_sensors[i].Is != NULL && _sensors[i].Is(_.Hi2c, _tryInit) && _sensors[i].Read != NULL)
257 {
258 status = _sensors[i].Read(_.Hi2c);
259 if (status == HAL_OK)
260 if (_sensors[i].LogData != NULL)
261 _sensors[i].LogData(sensBuffer_Get());
262 }
263 }
264 }
266}
267
268/**
269 * @brief Move to next used group in _sensors[]
270 */
271static uint8_t sensors_NextGroup()
272{
273 int i, count = getCount_Sensors();
274
275 while (++_.GroupInxTiming < getCount_GroupTiming())
276 for (i = 0; i < count; i++)
277 {
278 if (_sensors[i].GroupTiming.Group == _groupTiming[_.GroupInxTiming].Group)
279 return 1; // the group has been found
280 }
281 return 0;
282}
283
284static uint8_t sensors_Service()
285{
286 int i, count = getCount_Sensors();
287 uint8_t underService = 0;
288
289 for (i = 0; i < count; i++)
290 if (systemParams_IsSensorAvaiable(_sensors[i].Type) && _sensors[i].Service != NULL && _sensors[i].Service(_.Hi2c))
291 underService++;
292 return underService;
293}
294
295///////////////////////////////////////////////////////////////////
296// sequencer
297///////////////////////////////////////////////////////////////////
298/**
299 * @brief task sensor sequencer
300 */
301static void tasksensors_Work()
302{
304
305 switch (s)
306 {
307 case SENS_DONE:
308 // measure is done, system is ready for next measure
309 // measure time - time between measure, not time from system is going to sleep
311 break;
312
313 case SENS_DATAREADY:
314 //UTIL_SEQ_SetEvt(_.MylorawanSeqID); // data can be processing, event is fired
315 UTIL_SEQ_SetTask((1 << _.MylorawanSeqID), CFG_SEQ_Prio_0); // the mylorawan processing for send data, better than event? CFG_SEQ_Task_MyLoraSend -> myloraWan_MeasureFinish
316 //break; ok, after SENS_DATAREADY, task must be started
317 default:
318 UTIL_SEQ_SetTask((1 << _.SensorSeqID), CFG_SEQ_Prio_0); // next calling of tasksensors_Work
319 }
320}
321
323{
324 if (_systemParams.DevOnOff)
325 {
327 UTIL_SEQ_SetTask((1 << _.SensorSeqID), CFG_SEQ_Prio_0); // start of tasksensors_Work
328 }
329}
330
331// ------------- public -----------------------
332
334{
335 _.ProcessDef = SENS_BEGIN;
336 _.GroupInxTiming = -1;
338 _.GroupReadCount = 0;
339 sleeper_SetSleepMS(&_.ProcessDelay, 0); // no timer at start
340}
341
343{
344 if (sleeper_IsElapsed(&_.ProcessDelay))
345 {
346 switch (_.ProcessDef)
347 {
348 case SENS_BEGIN:
349 i2c_OnOff(1); // I2C on
350 sleeper_SetSleepMS(&_.ProcessDelay, 500); // little pause after init of I2C
351 _.ProcessDef = SENS_INIT;
352 break;
353 case SENS_INIT:
354 sensors_Init(NULL);
355 sleeper_SetSleepMS(&_.ProcessDelay, 500); // little pause after init of sensors
356 _.ProcessDef = SENS_START;
357 break;
358 case SENS_START:
359 _.GroupReadCount = 0;
360 if (sensors_OnOff(_groupTiming[_.GroupInxTiming].Group, 1) > 0) // start sensors for specified group
361 {
362 sleeper_SetSleepMS(&_.ProcessDelay, _groupTiming[_.GroupInxTiming].TimeoutRead); // reading data from sensor every x msseconds for group
363 _.ProcessDef = SENS_READ;
364 }
365 else
366 {
367 _.ProcessDef = SENS_STOP; // no sensors from group is available
368 _.ProcessDelay.SleepMS = 0; //
369 }
370 break;
371 case SENS_READ:
372 if (_groupTiming[_.GroupInxTiming].MaxReadCount) // is required any reading?
373 {
374 sensors_Read(_groupTiming[_.GroupInxTiming].Group);
375 sleeper_Next(&_.ProcessDelay);
376 togle_LedOff(0);
377 _.GroupReadCount++;
378 }
379 if (_.GroupReadCount >= _groupTiming[_.GroupInxTiming].MaxReadCount) // maximum read count has been reached
380 {
381 _.ProcessDef = SENS_STOP;
382 _.ProcessDelay.SleepMS = 0; // stop timer
383 togle_LedOff(1);
384 }
385 break;
386 case SENS_STOP:
387 _.ProcessDelay.SleepMS = 0; // stop timer
388 sensors_OnOff(_groupTiming[_.GroupInxTiming].Group, 0); // stop sensors for specified group
389 if (sensors_NextGroup())
390 _.ProcessDef = SENS_START;
391 else
392 _.ProcessDef = SENS_DATAREADY; // no more group, data ready
393 break;
394 case SENS_DATAREADY:
395 _.ProcessDef = SENS_SERVICE;
396 break;
397 case SENS_SERVICE:
398 if (!sensors_Service())
399 _.ProcessDef = SENS_END;
400 break;
401 case SENS_END:
402 _.ProcessDef = SENS_DONE;
403 i2c_OnOff(0);
404 break;
405 case SENS_DONE:
406 // never reach this line
407 break;
408 }
409 }
410 return _.ProcessDef;
411}
412
413void sensors_Init(I2C_HandleTypeDef *hi2c)
414{
415 HAL_StatusTypeDef status;
416 int i, count = getCount_Sensors();
417
418 if (hi2c != NULL)
419 _.Hi2c = hi2c;
420
421// initialization of individual sensors
422 for (i = 0; i < count; i++)
423 {
424 if (_sensors[i].Init != NULL)
425 {
427 {
428 status = _sensors[i].Init(_.Hi2c);
429 writeLog("%d. %s Init %s.", i, ((_sensors[i].Name != NULL) ? _sensors[i].Name : "sensor"), ((status == HAL_OK) ? "OK" : "failed"));
430 }
431 }
432 else
433 writeLog("%d. sensor: Init is NULL", i);
434 }
435 sensors_OnOff(SENS_GRP_ALL, 0); // on start, all sensors OFF
436}
437
439{
440 if (_systemParams.DevOnOff)
441 {
442 // create timer, if was not created yet
443 if (_.SensorTimerReading.ReloadValue == 0)
444 UTIL_TIMER_Create(&_.SensorTimerReading, _systemParams.SensTimeoutMeasure, UTIL_TIMER_ONESHOT, tasksensors_OnTimeout, NULL);
445 UTIL_TIMER_Stop(&_.SensorTimerReading);
446 UTIL_TIMER_Start(&_.SensorTimerReading); // new time for start
447 }
448}
449
450
451/**
452 * @brief task sequencer initialization for sensors reading
453 */
454void sensorsSeq_Init(uint32_t sensortAppBit, uint32_t mylorawanAppBit)
455{
456 _.SensorSeqID = sensortAppBit;
457 _.MylorawanSeqID = mylorawanAppBit;
458 UTIL_SEQ_RegTask((1 << _.SensorSeqID), UTIL_SEQ_RFU, tasksensors_Work);
459 tasksensors_OnTimeout(); // start reading of sensors data and timer after reading
460}
461
462
464{
465#ifdef SENSOR_SHT45
467#endif
468#ifdef SENSOR_AMB_TSL2591
469 _bck_amb_tsl2591Data = _amb_tsl2591Data;
470#endif
471#ifdef SENSOR_BAR_ILS22QS
472 _bck_bar_ils22qsData = _bar_ils22qsData;
473#endif
474#ifdef SENSOR_BAR_BMP585
476#endif
477#ifdef SENSOR_SCD41
478 _bck_scd41Data = _scd41Data;
479#endif
480#ifdef SENSOR_SPS30
481 _bck_sps30Data = _sps30Data;
482#endif
483}
484
485/*
486// !!! The adding of more data for Caynnel, check the size of MEASUEREDATANFC_SIZE
487 */
488uint8_t* sensors_CayennelFromBckData(uint8_t *sizeOut, SysTime_t* prevMeasureTime)
489{
490 uint8_t sz, channel = 1;
491 SysTime_t currentTime = SysTimeGet();
492#ifdef SENSOR_SCD41
493 uint8_t isTempHum = 0;
494#endif
495
497 sensBuffer_Add("------- ");
499#ifdef SENSOR_SHT45
500 if (_bck_tmphm_sht45Data.IsDataValid)
501 {
502 CayenneLppAddTemperature(channel++, _bck_tmphm_sht45Data.Temperature);
504#ifdef SENSOR_SCD41
505 isTempHum = 1;
506#endif
507 sensBuffer_Add("tmp:" PRIf_02 " hum:" PRIf_02 " ", PRIf_02D(_bck_tmphm_sht45Data.Temperature), PRIf_02D(_bck_tmphm_sht45Data.Humidity));
508 }
509#endif
510#ifdef SENSOR_AMB_TSL2591
511 if (_bck_amb_tsl2591Data.IsDataValid)
512 {
513 CayenneLppAddLuminosity(channel++, (uint16_t) _bck_amb_tsl2591Data.Lux);
514 sensBuffer_Add("amb:" PRIf_02 " ", PRIf_02D(_bck_amb_tsl2591Data.Lux));
515 }
516#endif
517#ifdef SENSOR_BAR_ILS22QS
518 if (_bck_bar_ils22qsData.IsDataValid)
519 {
520 //CayenneLppAddTemperature(channel++, _tempBarometerData.Temperature); if temperature is added, modify SIZE_ILS22QS_NFC also
521 CayenneLppAddBarometricPressure(channel++, _bck_bar_ils22qsData.PressureSEA);
522 sensBuffer_Add("bar:" PRIf_02 " ", PRIf_02D(_bck_bar_ils22qsData.PressureSEA));
523 }
524#endif
525#ifdef SENSOR_BAR_BMP585
526 if (_bck_bar_bmp585Data.IsDataValid)
527 {
528 //CayenneLppAddTemperature(channel++, _tempBarometerData.Temperature); if temperature is added, modify SIZE_BMP585_NFC also
530 sensBuffer_Add("bar:" PRIf_02 " ", PRIf_02D(_bck_bar_bmp585Data.PressureSEA));
531 }
532#endif
533#ifdef SENSOR_SCD41
534 if (_bck_scd41Data.IsDataValid)
535 {
536 CayenneLppAddConcentration(channel++, (uint16_t) _bck_scd41Data.Co2);
537 if (!isTempHum)
538 {
539 CayenneLppAddTemperature(channel++, _bck_scd41Data.Temperature);
540 CayenneLppAddRelativeHumidity(channel++, _bck_scd41Data.Humidity);
541 }
542 sensBuffer_Add("co2:" PRIf_02 " ", PRIf_02D(_bck_scd41Data.Co2));
543 }
544#endif
545#ifdef SENSOR_SPS30
546 if (_bck_sps30Data.IsDataValid)
547 {
548 CayenneLppAddParticulateMatter_1_0(channel++, _bck_sps30Data.Mass_pm1_0);
549 CayenneLppAddParticulateMatter_2_5(channel++, _bck_sps30Data.Mass_pm2_5);
550 sensBuffer_Add("part:" PRIf_02 " " PRIf_02 " ", PRIf_02D(_bck_sps30Data.Mass_pm1_0), PRIf_02D(_bck_sps30Data.Mass_pm2_5));
551 }
552#endif
553
554 // time check of sending battery level
555 if (currentTime.Seconds > _memsMainBlock.Bat_SendTimeSendUNIX + SYSTEMPARAMS_BATTIMESEND)
556 {
557 uint8_t batPerc = _batPercLevel;
558
559 CayenneLppAddBatteryPerc(channel++, batPerc);
560 _memsMainBlock.Bat_SendTimeSendUNIX = currentTime.Seconds;
561 sensBuffer_Add("bat:%d ", (int)batPerc);
563 }
564
565
566 // is reference time defined?
567 if (prevMeasureTime != NULL && prevMeasureTime->Seconds > 0)
568 {
569 uint32_t timeToBuff = (_.MeasureTime.Seconds >= prevMeasureTime->Seconds) ?
570 _.MeasureTime.Seconds - prevMeasureTime->Seconds :
571 prevMeasureTime->Seconds - _.MeasureTime.Seconds;
572
573 timeToBuff /= 60; // seconds -> minutes
574 if (timeToBuff) // zero - no time
575 {
576 if (timeToBuff <= 255)
577 {
578 CayenneLppAddTimeMeasureMIN8(channel++, (uint8_t)timeToBuff); // value < 255
579 sensBuffer_Add("tim8:%dmin ", (int)timeToBuff);
580 }
581 else
582 if (timeToBuff <= 65535)
583 {
584 CayenneLppAddTimeMeasureMIN16(channel++, (uint16_t)timeToBuff); // value < 65535
585 sensBuffer_Add("tim16:%dmin ", (int)timeToBuff);
586 }
587 else
588 {
589 CayenneLppAddTimeMeasureABS(channel++, _.MeasureTime.Seconds); // absolute, UNIX time
590 sensBuffer_Add("timABS ");
591 }
592 }
593 }
594 sensBuffer_Add("-------");
596 sz = CayenneLppGetSize();
597 if (sizeOut != NULL)
598 *sizeOut = sz;
599 return (sz) ? CayenneLppGetBuffer() : NULL;
600}
601
602
603
605{
606 uint16_t off = 0;
607
608 // measure time - must be 1st, because of sensors_GetTimeFromBlock
609 _.MeasureTime = SysTimeGet();
610 memcpy(data->Data + off, &_.MeasureTime, sizeof(_.MeasureTime));
611 off += sizeof(_.MeasureTime);
612
613#ifdef SENSOR_SHT45
614 memcpy(data->Data + off, &_bck_tmphm_sht45Data, sizeof(_bck_tmphm_sht45Data));
615 off += sizeof(_bck_tmphm_sht45Data);
616#endif
617#ifdef SENSOR_AMB_TSL2591
618 memcpy(data->Data + off, &_bck_amb_tsl2591Data, sizeof(_bck_amb_tsl2591Data));
619 off += sizeof(_bck_amb_tsl2591Data);
620#endif
621#ifdef SENSOR_BAR_ILS22QS
622 memcpy(data->Data + off, &_bck_bar_ils22qsData, sizeof(_bck_bar_ils22qsData));
623 off += sizeof(_bck_bar_ils22qsData);
624#endif
625#ifdef SENSOR_BAR_BMP585
626 memcpy(data->Data + off, &_bck_bar_bmp585Data, sizeof(_bck_bar_bmp585Data));
627 off += sizeof(_bck_bar_bmp585Data);
628#endif
629#ifdef SENSOR_SCD41
630 memcpy(data->Data + off, &_bck_scd41Data, sizeof(_bck_scd41Data));
631 off += sizeof(_bck_scd41Data);
632#endif
633#ifdef SENSOR_SPS30
634 memcpy(data->Data + off, &_bck_sps30Data, sizeof(_bck_sps30Data));
635 off += sizeof(_bck_sps30Data);
636#endif
637 if (off > SENSORS_DATASIZE)
638 {
639 writeLog("The sensors_FillDataBlock %d>=SENSORS_DATASIZE(%d)!", (int)off, (int)SENSORS_DATASIZE);
641 }
643 data->Size = (uint8_t)off;
644}
645
647{
648 uint8_t off = 0;
649 if (data->Type == MEMS_DATATYPE_SENSOR)
650 {
651 // measure time
652 memcpy(&_.MeasureTime, data->Data + off, sizeof(_.MeasureTime));
653 off += sizeof(_.MeasureTime);
654
655#ifdef SENSOR_SHT45
656 memcpy(&_bck_tmphm_sht45Data, data->Data + off, sizeof(_bck_tmphm_sht45Data));
657 off += sizeof(_bck_tmphm_sht45Data);
658#endif
659#ifdef SENSOR_AMB_TSL2591
660 memcpy(&_bck_amb_tsl2591Data, data->Data + off, sizeof(_bck_amb_tsl2591Data));
661 off += sizeof(_bck_amb_tsl2591Data);
662#endif
663#ifdef SENSOR_BAR_ILS22QS
664 memcpy(&_bck_bar_ils22qsData, data->Data + off, sizeof(_bck_bar_ils22qsData));
665 off += sizeof(_bck_bar_ils22qsData);
666#endif
667#ifdef SENSOR_BAR_BMP585
668 memcpy(&_bck_bar_bmp585Data, data->Data + off, sizeof(_bck_bar_bmp585Data));
669 off += sizeof(_bck_bar_bmp585Data);
670#endif
671#ifdef SENSOR_SCD41
672 memcpy(&_bck_scd41Data, data->Data + off, sizeof(_bck_scd41Data));
673 off += sizeof(_bck_scd41Data);
674#endif
675#ifdef SENSOR_SPS30
676 memcpy(&_bck_sps30Data, data->Data + off, sizeof(_bck_sps30Data));
677 off += sizeof(_bck_sps30Data);
678#endif
679 }
680 return off;
681}
682
684{
685 SysTime_t ss;
686
687 memcpy(&ss, data->Data, sizeof(ss));
688 return ss;
689}
690
uint8_t CayenneLppAddTemperature(uint8_t channel, float celsius)
Definition CayenneLpp.c:266
uint8_t CayenneLppAddBatteryPerc(uint8_t channel, uint8_t perc)
Add battery percent of voltage data to the buffer (1B).
Definition CayenneLpp.c:543
uint8_t * CayenneLppGetBuffer(void)
Definition CayenneLpp.c:132
uint8_t CayenneLppAddConcentration(uint8_t channel, uint16_t ppm)
Add CO2 concentration data to the buffer.
Definition CayenneLpp.c:423
uint8_t CayenneLppAddLuminosity(uint8_t channel, uint16_t lux)
Definition CayenneLpp.c:229
uint8_t CayenneLppAddBarometricPressure(uint8_t channel, float hpa)
Definition CayenneLpp.c:331
uint8_t CayenneLppAddTimeMeasureABS(uint8_t channel, uint32_t timeMeasure)
Add UTC time of measure to the buffer.
Definition CayenneLpp.c:503
void CayenneLppReset(void)
Definition CayenneLpp.c:116
uint8_t CayenneLppAddTimeMeasureMIN16(uint8_t channel, uint16_t timeOffsetMin16)
Add the relative time of measuring - offset from previous measured data less than 65535 minutes (abou...
Definition CayenneLpp.c:530
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:462
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:482
uint8_t CayenneLppAddRelativeHumidity(uint8_t channel, float rh)
Definition CayenneLpp.c:286
uint8_t CayenneLppGetSize(void)
Definition CayenneLpp.c:124
uint8_t CayenneLppAddTimeMeasureMIN8(uint8_t channel, uint8_t timeOffsetMin8)
Add the relative time of measuring - offset from previous measured data less than 255 minutes The tim...
Definition CayenneLpp.c:519
Implements the Cayenne Low Power Protocol.
Header for ADC interface configuration.
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:104
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:118
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:172
void bar_bmp585_LogData(char *buf)
Log data to buffer.
Definition bar_bmp585.c:237
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:123
bar_bmp585_t _bar_bmp585Data
Live measurement data from the BMP585 sensor; updated by bar_bmp585_Read().
Definition bar_bmp585.c:50
bar_bmp585_t _bck_bar_bmp585Data
Snapshot copy of the last completed BMP585 measurement; used for LoRaWAN transmission.
Definition bar_bmp585.c:51
int8_t bar_bmp585_Is(I2C_HandleTypeDef *hi2c, int8_t tryInit)
Check if sensor is present.
Definition bar_bmp585.c:97
This file contains all the function prototypes for the i2c.c file.
void MX_I2C2_Init(void)
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
static struct @042147022327042232212126043022001043033342036075 _
: Header for main.c file. This file contains the common defines of the application....
void Error_Handler(void)
This function is executed in case of error occurrence.
Definition main.c:589
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:105
void Power3v3_On()
Cumulative turn the all peripheries to ON state - pull-up the _3V3_Enb_Pin pin.
Definition main.c:250
void togle_LedOff(int off)
togle led
Definition main.c:159
void writeLogNL(const char *buf)
Send a pre-formatted C string to the UART log followed by a newline.
Definition main.c:88
void Power3v3_Off()
Cumulative turn the all peripheries to OFF state - pull-down the _3V3_Enb_Pin pin.
Definition main.c:262
#define PRIf_02D(fData)
Expands to integer and fractional arguments for use with PRIf_02. Splits a float/double into the inte...
Definition mydefs.h:38
#define PRIf_02
printf format string for printing a float/double as integer with 2 decimal places....
Definition mydefs.h:30
mems_MainBlock_t _memsMainBlock
Global instance of the main flash control block; loaded by mems_ReadMainBlock().
Definition mymems.c:29
@ MEMS_DATATYPE_SENSOR
Definition mymems.h:71
HAL_StatusTypeDef mems_WriteMainBlock()
writing the main block on flash. The main block is stored on address 0
Definition mymems.c:142
uint8_t MylorawanSeqID
Definition mysensors.c:136
I2C_HandleTypeDef * Hi2c
Definition mysensors.c:127
uint8_t SensorSeqID
Definition mysensors.c:135
static int getCount_GroupTiming()
Definition mysensors.c:142
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:271
void sensors_Init(I2C_HandleTypeDef *hi2c)
Initialization of all sensors, must be called before for store of hi2c handler.
Definition mysensors.c:413
uint8_t * sensors_CayennelFromBckData(uint8_t *sizeOut, SysTime_t *prevMeasureTime)
collecting sensor data into CayenneLppGetBuffer buffer for sending them via LoRaWan,...
Definition mysensors.c:488
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:604
uint8_t GroupReadCount
Definition mysensors.c:131
sens_ProcessDef_t sensors_Work()
no sequncer processing reading data from sensor according to group specification
Definition mysensors.c:342
SysTime_t MeasureTime
Definition mysensors.c:138
void sensorsSeq_Init(uint32_t sensortAppBit, uint32_t mylorawanAppBit)
task sequencer initialization for sensors reading
Definition mysensors.c:454
static int _i2cOnOff
Definition mysensors.c:189
void sensors_Start()
non squncer processing start of reading - prepare of internal state machine
Definition mysensors.c:333
UTIL_TIMER_Object_t SensorTimerReading
Definition mysensors.c:134
static void tasksensors_Work()
task sensor sequencer
Definition mysensors.c:301
void sensors_Retiming()
stop and start of sensor timer for next measure
Definition mysensors.c:438
static void sensBuffer_Add(const char *format,...)
Definition mysensors.c:159
static void sensBuffer_Reset()
Definition mysensors.c:154
static const sens_GrpTiming_t _groupTiming[]
definition of sensors group
Definition mysensors.c:84
static void sensBuffer_Send()
Definition mysensors.c:174
static char _sensBuffer[1024]
Definition mysensors.c:152
static char * sensBuffer_Get()
Definition mysensors.c:169
static void sensors_Read(sens_ReadingGrp_t grp)
reading sensor one by one in specified group
Definition mysensors.c:245
SysTime_t sensors_GetTimeFromBlock(const mems_DataBlock_t *data)
getting the SysTime_t from block data of memory
Definition mysensors.c:683
static int getCount_Sensors()
Definition mysensors.c:146
static void tasksensors_OnTimeout()
Definition mysensors.c:322
int8_t GroupInxTiming
Definition mysensors.c:129
void i2c_OnOff(uint8_t onOff)
possible to I2C turn on/off - cumulative
Definition mysensors.c:190
sleeper_t ProcessDelay
Definition mysensors.c:130
static const sens_processing_t _sensors[]
Definition mysensors.c:94
static uint8_t sensors_Service()
Definition mysensors.c:284
void sensors_CopyToBck()
The copying data from current sensors buffer to backUp - _bck_XXXXX.
Definition mysensors.c:463
sens_ProcessDef_t ProcessDef
Definition mysensors.c:128
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:646
static int sensors_OnOff(sens_ReadingGrp_t grp, int onOff)
On/Off sensors according to group.
Definition mysensors.c:216
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
uint8_t _batPercLevel
#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
#define SYSTEMPARAMS_BATTIMESEND
The time, in seconds, the battery level sending interval - 12h.
uint8_t systemParams_IsSensorAvaiable(systemParams_Sensors_t sensorType)
Check whether a particular sensor is enabled in _systemParams.AvailableSensors.
Sensor data record stored as one element in the flash circular queue.
Definition mymems.h:82
uint8_t Size
Definition mymems.h:85
mems_DataType_t Type
Definition mymems.h:84
uint8_t Data[(sizeof(SysTime_t)+sizeof(tmphm_sht45_t)+0+0+sizeof(bar_bmp585_t)+0+0)]
Definition mymems.h:86
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:39
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:61
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:55
int sleeper_IsElapsed(const sleeper_t *v)
Check whether the configured time interval has elapsed.
Definition utils.c:41