/** * Скетч предназначен для вывода данных о температуре, измеряемой бортовым датчиком на модуле MBee, * и влажности, получаемой модулем MBee с датчика HIH4000, в Cayenne MyDevises, а также, для вкл/выкл электропотребителей. * Максимальное число датчиков - 10 шт. * Принимающий и передающий модули MBee-868-x.0 работают под управлением ПО Serial Star. * **/ #include #include #include #include #define LED 2 //Вывод контрольного светодиода. #define ACTIVITY_CHECK_PERIOD 3600000 //Период проверик актуальности данных #define SENSOR_OFF 0 #define SENSOR_ON 1 #define SENSORS_MAX_COUNT 10 //Максимальное число автономных устройств, передающих показания датчиков температуры и влажности #define CMD_PARAMETER_LEN 1 // WiFi network info. char ssid[] = "ssid"; char wifiPassword[] = "wifiPassword"; // Cayenne authentication info. This should be obtained from the Cayenne Dashboard. char username[] = "username"; char password[] = "password"; char clientID[] = "clientID"; const uint16_t sensor[SENSORS_MAX_COUNT] = {0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B}; //Адреса автономных устройств, передающих показания датчиков температуры и влажности uint8_t flagActivityCheck [SENSORS_MAX_COUNT]; typedef struct { uint8_t sof = 0x7E; uint8_t lengthMsb = 0x00; uint8_t lengthLsb = 0x08; uint8_t frameType = 0x17; uint8_t frameID = 0x00; uint8_t MSBDestination = 0x00; uint8_t LSBDestination = 0x0C; uint8_t remoteCommandOptions = 0x0D; unsigned char code[2] = {'L','5'}; uint8_t commandParameter; uint8_t checkSum; }TxFrame_t; TxFrame_t frame; SerialStar mbee; RxIoSampleResponse ioSample; SimpleTimer timer; enum { NO_EVENTS, ACTUATOR_ON, ACTUATOR_OFF }events = NO_EVENTS; void setup() { Serial.begin(9600); mbee.begin(Serial); Cayenne.begin(username, password, clientID, ssid, wifiPassword); pinMode(LED, OUTPUT); //Настраиваем вывод контрольного светодиода. digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) timer.setInterval(ACTIVITY_CHECK_PERIOD, sensorActivityCheck); } void loop() { Cayenne.loop(); timer.run(); switch(events) { case ACTUATOR_ON: frame.commandParameter = 0x05; //Команда установки на L5 высокого уровня. frame.checkSum = 0x49; sendCommand(); events = NO_EVENTS; break; case ACTUATOR_OFF: frame.commandParameter = 0x04; //Переводим L5 в низкий уровень. frame.checkSum = 0x4A; sendCommand(); events = NO_EVENTS; break; default: break; } mbee.readPacket(); //Проверяем, если в буфере пакет. if(mbee.getResponse().isAvailable()) { if(mbee.getResponse().getApiId() == IO_DATA_SAMPLE_API_FRAME) //Является ли принятый пакет, пакетом с данными о состоянии датчиков удаленного модема? { /**********************************************************************************************************/ mbee.getResponse().getRxIoSampleResponse(ioSample); //Получаем пакет с данными. for(uint8_t i = 0; i < SENSORS_MAX_COUNT; i++) { if(sensor[i] == ioSample.getRemoteAddress()) { if(ioSample.getTemperature() < 128) //Переводим число из дополнительного кода в прямой. { Cayenne.celsiusWrite(i, ioSample.getTemperature()); } else { Cayenne.celsiusWrite(i, 256 - ioSample.getTemperature()); } Cayenne.virtualWrite(i + 10, getHIH4000Humidity(ioSample.getAnalog(1))); Cayenne.virtualWrite(i + 20, float(ioSample.getVbatt()) / 51); flagActivityCheck[i] = SENSOR_ON; } } } } } /*Функция пересчета влажности для датчика HIH4000**********************************************/ float getHIH4000Humidity(uint16_t adcData) { float humidity; humidity = ((adcData *1.9881158) / 50) - 31.20521173; //формула расчета влажности для данного датчика: (Vout*2-0.958)/0.0307. Умножаем на 2 из-за делителя на плате. Все остальное из datasheet на датчик return humidity; } /*Функция проверки актуальности данных от датчиков*********************************************/ void sensorActivityCheck(void) { for(uint8_t i = 0; i < SENSORS_MAX_COUNT; i++) { if(flagActivityCheck[i] == SENSOR_OFF) { Cayenne.celsiusWrite(i, 0); Cayenne.virtualWrite(i + 10, 0); Cayenne.virtualWrite(i + 20, 0); } else { flagActivityCheck[i] = SENSOR_OFF; } } } //Функция считывания из Cayenne********************************************* CAYENNE_IN(31) { if(getValue.asInt() == 1) { events = ACTUATOR_ON; } else if(getValue.asInt() == 0) { events = ACTUATOR_OFF; } } //Функция отправки данных модулю MBee********************************************* void sendCommand() { Serial.write((uint8_t*)&frame, sizeof(TxFrame_t)); } |