EnglishRussian

Мониторинг температуры на Arduino и Cosmo GSM Connect

Разберем пример устройства позволяющего удаленно отслеживать показания сенсоров, например — датчиков температуры. В качестве аппаратной части устройства будем использовать — Arduino (Uno или другие версии), GSM-шилд «Cosmo GSM Connect», датчики температуры.

Основные возможности системы.

  • Получать СМС при понижении/повышении температуры, причем индивидуально для каждого датчика.
  • Получать СМС при возвращении температуры в заданный интервал.
  • Запрашивать по дозвону текущие показания всех датчиков.

При превышении заданного порогового значения температуры произойдет отправка тревожного СМС-сообщения. При возвращении показаний датчика в нормальный температурный диапазон — отправка соответствующее СМС уведомление. Также реализуем возможность получения показания датчиков по запросу.

Для получения точных значений температуры будем использовать цифровой температурный датчик DS18B20. Его диапазон измерений от –55°C до +125°C и точность 0.5°C в диапазоне от –10°C до +85°C. DS18B20 обменивается данными по 1-Wire шине в 9-12 битном (программируется пользователем) коде с ценой младшего разряда от 0.5°C до 0.0625°C и при этом датчик может быть как единственным устройством, так и работать в группе.

Питание датчика возможно двумя способами — внешнее и паразитное питание. При паразитном питании максимально измеряемая температура составляет + 100 °C. Для расширения диапазона температур до + 125 °C необходимо использовать внешнее питание.

Сенсор DS18B20 отличается наличием во внутренней энергонезависимой памяти (EEPROM) программируемых установок по превышению температуры (TH) и по понижению температуры (TL). Внутренний регистр флага будет выставлен, когда измеренная температура больше чем TH или меньше чем TL.

Итак, возьмем два датчика DS18B20 и подключим их по паразитной схеме питания к 8 пину Ардуино.

Воспользуемся функциональной возможностью встроенной в датчик EEPROM и укажем для каждого сенсора свой диапазон температур. При пересечении этого диапазона, как в большую, так и в меньшую сторону — произойдет срабатывание регистра и в этом случае будем производить отправку тревожного СМС.

Реализуем, чтобы по возвращению температуры в заданные параметры, также отправлялось сообщение о нормализации пареметров.

Для работы с датчиками DS18B20 скачайте и установите библиотеку DallasTemperature.

Для работы с шилдом «Cosmo GSM Connect» скачайте и установите библиотеку GSM

Итак, запускаем Arduino IDE, копируем в него следующий скетч.

#include <GSM.h>
#include <avr/pgmspace.h>

const char RemoteID[] PROGMEM =  "+79281112233"; // Шаблон номера, с которого ждём звонка
//и на который отправляем СМС
const char PIN[] PROGMEM =  "0000"; // ПИН-код!

unsigned long interval = 60000; // Интервал проверки состояния GPRS соединения; 60 секунд
unsigned long currentMillis;
unsigned long previousMillis;

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8 // Номер линии, к которой подключены датчики температуры

boolean alarm1 = false;
boolean alarm2 = false;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress sensor_1, sensor_2; // Используем 2 температурных датчика

unsigned long previousMillisTemp = 0;
unsigned long intervalTemp = 1000; // Интервал опроса датчиков; 1 секунда

String textMessage;
char s[16];
float tempS1;
float tempS2;


void setup() {
  sensors.begin();
  if (!sensors.getAddress(sensor_1, 0)) {}; 
  if (!sensors.getAddress(sensor_2, 1)) {};
  sensors.setHighAlarmTemp(sensor_1, 30); // alarm when temp is higher than 30C
  sensors.setLowAlarmTemp(sensor_1, -10); // alarm when temp is lower than -10C
  sensors.setHighAlarmTemp(sensor_2, 30); // alarm when temp is higher than 30C
  sensors.setLowAlarmTemp(sensor_2, 27); // alarn when temp is lower than 27C
  while (GSM.Init(PIN)<0);
  GSM.NewSMSindic();
  GSM.WaitCall();    
  GSM.WaitSMS();
  previousMillis=millis();
}

void loop() {        
  // Начало отсчёта 60 сек.       
  currentMillis = millis();
  
  // Проверяем входящие вызововы
  if (IncomingCall == 1) { //пришёл звонок!
    while (GSM.TerminateCall()<0);
    IncomingCall = 0;
    if (strstr_P(CallerID, RemoteID)) { // Номер звонящего совпал с шаблоном
      sendData(0, 0, 0); // Отправляем СМС с показаниями по запросу
    }
    GSM.WaitCall();
    currentMillis = previousMillis = millis();
  }
  
  // Пора проверить состояние GPRS подключения
  if(currentMillis - previousMillis > interval) {
    if ((GSM.CheckStatus() != 1)) { // GPRS соединение не установлено!
      while (GSM.Init(PIN)<0); // Делаем инициализацию
    }
    GSM.WaitCall();
    currentMillis = previousMillis = millis();
  }

  // Считываем показания датчиков температуры
  if(currentMillis - previousMillisTemp > intervalTemp) {
    previousMillisTemp = currentMillis;
    
    sensors.requestTemperatures();
    
    if (sensors.hasAlarm(sensor_1)) { // у сенсора 1 сработал Alarm
      if(!alarm1) {
        sendData(1, 1, true); // Отправляем тревожное СМС
      }
    }
    else {
      if(alarm1) {
        sendData(2, 1, false); // Отправляем СМС о нормализации температуры
      }
    }
    
    if (sensors.hasAlarm(sensor_2)) { // у сенсора 1 сработал Alarm
      if(!alarm2) {
        sendData(1, 2, true); // Отправляем тревожное СМС
      }
    }
    else {
      if(alarm2) {
        sendData(2, 2, false); // Отправляем СМС о нормализации температуры
      }
    }
      
    
  }
 
}


void sendData(int rule, int name, boolean param) {
  tempS1 = sensors.getTempC(sensor_1);
  tempS2 = sensors.getTempC(sensor_2);
  
  if(rule == 0) {
    textMessage = "Temperature: ";
  }
  if(rule == 1) {
    textMessage = "Alarm! ";
  }
  if(rule == 2) {
    textMessage = "Now temperature is OK ";
  }
  textMessage += "Sensor1 = ";
  textMessage += dtostrf(tempS1, 2, 2, s);
  textMessage += " Sensor2 = ";
  textMessage += dtostrf(tempS2, 2, 2, s);
  char Out[textMessage.length()+1];
  textMessage.toCharArray(Out,(textMessage.length())+1);
  while(GSM.SendSMS(RemoteID, Out) < 0);
  if (name == 1) {
    alarm1 = param;
  }
  if (name == 2) {
    alarm2 = param;
  }
  
}

Редактируем номер телефона (const char RemoteID[]), с которого можно будет производить дозвон и на который будут приходить СМС. При необходимости можно убрать проверку на номер и тогда на все входящие вызовы шилд будет отправлять смс со значениями датчиков.

Задание температурного диапазона для датчика "sensor_1" от +30 до -10 градусов цельсия, выглядит следующим образом:

sensors.setHighAlarmTemp(sensor_1, 30);
sensors.setLowAlarmTemp(sensor_1, -10);

Аналогичным способом задаем диапазон срабатывания и для второго датчика. Уже в том случае, как будет зафиксировано значение вне заданного диапазона сработает Alarm.

if (sensors.hasAlarm(sensor_1)) {

Таким образом, получилась несложная система мониторинга температуры, позволяющая устанавливать каждому температурному датчику свой диапазон срабатываний.