Управление электрокотлом на ардуино


Привет! 🙂

Представляю мой новый проект — автоматическое управление отоплением и вентиляцией на базе Arduino Nano 3.0.

Довольно долго я бился над решением задачи создания оптимального микроклимата в ванной комнате, и наконец-то, благодаря знаниям, полученным в процессе изучения Arduino и различных датчиков температуры и влажности, мне это удалось! 🙂 

 

 

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


итоге, устав от необходимости бегать включать/выключать батарею и вытяжку по нескольку раз в день, а также имея практический опыт создания автоматизированной заслонки на базе Arduino, решил сконструировать прибор для автоматического управления отоплением и вентиляцией в ванной комнате. О результатах проделанной работы рассказано в этом видео.

А теперь предлагаю подробнее рассмотреть как все работает, включая программу (скетч) для Arduino!

На передней панели системы управления отоплением и вентиляции находится двухстрочный дисплей LCD 1602 I2C, который отображает текущие значения температуры и влажности, а также позволяет просматривать меню установок прибора. Красная и зеленая кнопки — кнопки управления (оказалось вполне достаточно двух кнопок для изменения настроек и управления устройством). Красный светодиод загорается при включении отопления, а зеленый — при включении вентиляции. На левой стороне расположен датчик температуры и влажности DHT22 а также USB-порт модуля Arduino, который пришлось заклеить для лучшей сохранности.


Система для управления отоплением и вентиляцией на базе Arduino. Вид сбоку
Система для управления отоплением и вентиляцией на базе Arduino. Вид сбоку

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

Система для управления отоплением и вентиляцией на базе Arduino. Вид сбоку
Система для управления отоплением и вентиляцией на базе Arduino. Вид сбоку

Система контроля микроклимата работает от сети 220 вольт и подключена к ближайшей розетке.


Система для управления отоплением и вентиляцией на базе Arduino. Общий вид
Система для управления отоплением и вентиляцией на базе Arduino.

Заглянем внутрь корпуса. Сам корпус является обычной распределительной коробкой. На его передней панели имеются 4 болта, открутив которые можно легко и быстро получить доступ к мозгам системы, а также к коммутационным реле, которые управляют нагрузкой.

Система для управления отоплением и вентиляцией на базе Arduino со снятой лицевой панелью
Система для управления отоплением и вентиляцией на базе Arduino со снятой лицевой панелью

Внутри находится сборка из модуля ардуино нано 3.0, силовых реле с максимальным током до 10 ампер, и блоком питания на 9 вольт.


Система для управления отоплением и вентиляцией на базе Arduino. Вид изнутри
Система для управления отоплением и вентиляцией на базе Arduino. Вид изнутри

Панель управления подключена к основному модулю при помощи шлейфов.

Система для управления отоплением и вентиляцией на базе Arduino. Вид изнутри
Система для управления отоплением и вентиляцией на базе Arduino. Вид изнутри

Панель управления можно легко отсоединить от устройства для проведения профилактических работ или модернизации. Как уже упоминалось выше, в состав панели входит LCD модуль, 2 светодиода и 2 управляющие кнопки.


Панель управления системы контроля микроклимата на базе Arduino
Панель управления системы контроля микроклимата на базе Arduino

Управляющий модуль сконструирован на монтажной плате и имеет разъемы для подключения датчика влажности и температуры DHT22, панели управления, нагрузки (4 разъема), а также источника питания. Первый, второй и четвертый разъемы работают в режиме ключа (замыкают и размыкают цепь). Третий разъем обеспечивает выход с напряжением 5 вольт для управления дистанционной розеткой.

Главный модуль системы контроля микроклимата на базе Arduino
Главный модуль системы контроля микроклимата на базе Arduino

Силовые элементы надежно припаяны при помощи медных проводов на обратной стороне монтажной платы. Логические элементы аккуратно спаяны меду собой, все реле управляются через транзисторы. Ссылку на схему более совершенной модели этого прибора см. в конце статьи!


Главный модуль системы контроля микроклимата на базе Arduino. Монтажная плата
Главный модуль системы контроля микроклимата на базе Arduino. Монтажная плата

Корпус системы — обычная электрическая разветвительная коробка стандартного размера.

Корпус системы контроля микроклимата
Корпус системы контроля микроклимата

Настенный конвектор, отлично подсушивающий влажный воздух, находится на противоположной стене от модуля управления микроклиматом.


Настенный конвектор, управляемый системой на базе Arduino
Настенный конвектор, управляемый системой на базе Arduino

Обогреватель управляется при помощи дистанционной розетки, о которой уже говорилось в одной из прошлых публикаций.

Розетка с дистанционным управлением системы контроля микроклимата на базе Arduino
Розетка с дистанционным управлением системы контроля микроклимата на базе Arduino

Теперь, пожалуй, самое интересное 🙂 Предлагаю вашему вниманию полный скетч для управления отоплением и вентиляцией на базе Arduino. Скажу сразу, что скетч модернизировался после первого запуска системы целых 3 раза. И на то были определенные причины.


Изначально температура измерялась каждые 2 секунды, и в зависимости от этого срабатывали правила включения и выключения электроприборов. Бывало так, что вытяжка включалась и выключалась каждые 2 секунды, в моменты колебания влажности или температуры на пограничных значениях.

Решением данной ситуации стало изменение алгоритма программы таким образом, чтобы измерения проводились 5 раз подряд (в течение 10 секунд), а затем для всех показателей вычислялось среднее значение, на основании которого применялись правила включения/отключения нагрузки. Это позволило избавиться от таких «скачков» с выключением вытяжки или батареи!

Итак, скетч под этим спойлером:

Скетч занимает около 50% памяти ардуино и требует дополнительных библиотек для работы с датчиком DHT22 и экраном LCD через интерфейс I2C, найти которые можно на просторах интернета.

На момент написания статьи уже месяц система работает в штатном режиме, микроклимат в ванной стал практически идеальным, конечно пришлось несколько раз менять настройки включения и выключения вытяжки и батареи, но подобрав нужные параметры все стало просто идеально — и днем и ночью комфортные ощущения при нахождении в этом помещении! 🙂


Обновлено 05.11.2018

Прошло пол года с момента начала активной эксплуатации устройства, и обнаружились некоторые проблемы, а именно, периодические зависания модуля ардуино. Начав разбираться, первым делом наткнулся на некий WatchDog, который способен автоматически перезагрузить систему при зависании микроконтроллера. Подумал — вот оно подходящее решение. Но как выяснилось, на моей китайской копии Arduino Nano 3.0 WatchDog работает неправильно из-за некорректной прошивки загрузчика. Для того чтобы это исправить, нужна «правильная» прошивка загрузчика, найти которую можно в интернете, и программатор, которым все это дело будет «зашиваться» внутрь чипа. Пока ждал программатор с Китая, решил поискать реальные причины зависания контроллера.

Просадка напряжения

Пытаясь найти объективную причину зависания, я стал грешить на некачественный блок питания и просадку напряжения при включении реле, особенно когда несколько реле включаются одновременно, ведь зависания происходили не так часто, а всего лишь 1-2 раза в месяц.

Первым делом решил добавить 2 конденсатора по 1000 мкф в надежде, что они уменьшат просадку напряжения при срабатывании реле. Первый поставил параллельно выходу с блока питания (там кстати уже был свой конденсатор, но второй лишним не будет, подумал я), а второй — установил параллельно выходу +5V на плате ардуино, откуда как раз берется питание для реле. С этого же выхода питается и сам микроконтроллер. Складывается логичная ситуация — когда все реле включаются одновременно, микроконтроллеру не хватает напряжения и он зависает.


После добавление конденсаторов зависания практически прекратились, но все же, 1 раз в месяц могло и зависнуть.

Доработка скетча Ардуино

Поигравшись с конденсаторами, решил проверить программное обеспечение устройства на наличие неоптимального кода, который мог бы приводить к зависаниям микроконтроллера. Первым делом начал с проверки процедуры DoAll(), которая управляет включением и отключением реле. И тут меня как осенило, откуда берутся просадки напряжения.

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

Исправив код этой процедуры, а именно, добавив искусственную задержку в 200 миллисекунд после включения/отключения какого-либо реле, я был крайне удивлен стабильной работой прибора. Зависания вовсе прекратились, и вот уже 2 месяца прибор работает стабильно. Теперь и WatchDog не нужен, хотя конечно он не помешает, на всякий случай.

В итоге можно сказать, что причиной зависания являлась несбалансированность нагрузки на источник питания при выполнении программного кода, а также низкое качество источника питания. Исправив программу, исчез и дисбаланс. Ниже представлен исправленный фрагмент кода процедуры DoAll(). Жирным текстом выделены те самые задержки по 200 мсек, которые были добавлены в программу и кардинально повысили стабильность работы микроконтроллера.

void DoAll(){    //включаем обогрев, разъем 3, дистанционная розетка    //сделаем чтобы батарея также включалась при повышенной влажности, чтобы подсушивать воздух    if (HeatState==0 && (t<=tempHeatOn || h>humVentOn)){      digitalWrite(4,1);      digitalWrite(14,HIGH);      HeatState=1;      delay(200);    }    //отключаем обогрев, когда температура пришла в норму, а также влажность не превышает верхний предел (порог включения вытяжки)    if (t>=tempHeatOff && HeatState==1 && h<=humVentOn){      digitalWrite(4,0);      digitalWrite(14,LOW);      HeatState=0;      delay(200);    }      //включаем вентиляцию, замыкаем разъемы 1 и 2 (реле 1 и 2)    //также включаем вытяжку, если температура превышает верхнее значение     //(т>температуры отключения обогрева, например если перегрели во время просушки,     //то вытяжка продолжит работать когда влажность уже в норме, но температура воздуха еще высокая)    if (VentState==0 && (h>=humVentOn || t>tempHeatOff)){      digitalWrite(9,1);      digitalWrite(2,1);      digitalWrite(15,HIGH);      VentState=1;      delay(200);    }    //отключаем вентиляцию, когда влажность и температура пришли в норму    if (h<=humVentOff && VentState==1 && t<=tempHeatOff){      digitalWrite(9,0);      digitalWrite(2,0);      digitalWrite(15,LOW);      VentState=0;      delay(200);    }    }  

Обновлено 02.02.2019

Зимой обнаружилось, что из одной из вытяжет стал капать конденсат, поэтому было решено отключать на зиму этот вентилятор. И чтобы не лазить каждый сезон с отверткой в развет коробку и уж тем более в само устройство, решил сделать все программно, поскольку каждый вентилятор управляется отдельным реле. Немного переработал скетч, добавив дополнительный экран настроек, на котором можно задействовать или отключить каждый вентилятор по отдельности Также уменьшил время одновременного нажатия кнопок для переключения между экранами настроек с 3 до 2 секунд. Свежий скетч можно скачать по ссылке ниже

Обновлено 19.11.2019

Многие спрашивают схему для сборки этого прибора, поэтому предлагаю вашему вниманию новый, более совершенный и интересный проект, созданный на базе этого, в котором есть схема, и подробно расписан весь процесс сборки, наладки и пуска системы! Читаем здесь 🙂

Спасибо за внимание! Будут вопросы — обращайтесь! 🙂

P.S. Планирую установить приточный клапан в ванной комнате, который позволит быстрее нормализовать влажность и температуру за счет поступления воздуха с улицы. Четвертый разъем системы предусмотрен именно для этих целей. Когда появится клапан, выложу обновления скетча для арудино.

Источник: eanik.ru

Подправил код (выровнял продолжительность вспышек индикатора независемо от периода).

 #define pump_OUT 9//насос #define heather_OUT 8//нагреватель #define termostat_IN 2//термостат #define StatLed 13//индикатор состояния unsigned long timer =0;//таймер для задержки unsigned long StatTime =0;//таймер инд состояния #define pause 180000//задержка отключения насоса #define ledON 250//продолжительность вспышки статуса <500 int pauseLed=0;//частота индикатора состояния  void setup() {  pinMode(termostat_IN, INPUT);  pinMode(pump_OUT, OUTPUT);   pinMode(heather_OUT, OUTPUT);  pinMode(StatLed, OUTPUT); }  void loop() {  if (DIn(termostat_IN) == HIGH){//если термостат замкнут  DOut (pump_OUT,HIGH);//включаем насос  DOut (heather_OUT,HIGH);//включаем нагреватель  PL(1000);//период мигания индикатора состояния 1с  }   if (DIn(heather_OUT)==HIGH && DIn(termostat_IN) == LOW){//выполняеться один раз для сброса таймера  timer=millis();//начало отсчета задержки  DOut(heather_OUT,LOW);// выключаем нагреватель  PL(500);//период мигания индикатора состояния 0,5с  }  if (millis()-timer >= pause && DIn(heather_OUT)==LOW){  DOut(pump_OUT,LOW); // выключаем насос  PL(3000);//период мигания индикатора состояния 3с  }   if(millis()> StatTime){  switch (DIn(StatLed)){//поверяем состояние индикатора  case 0://если выключен  StatTime=millis()+ledON;//устанавливаем время включенного состояния  DOut(StatLed,1);//включаем  break;  case 1:  StatTime=millis()+pauseLed;  DOut(StatLed,0);  break;  }  } }//end LOOP //-------изменение паузы между вспышками индикатора------- void PL(unsigned int p){  pauseLed=p-ledON;//период мигания индикатора }  //-------функция переключения реле---------- void DOut (byte pin, boolean state){  digitalWrite(pin,state); } //-------функция опроса цифровых входов---------- boolean DIn (byte pin){  return digitalRead(pin); } //Спасибо yasobe.ru/na/buter#form_submit //allduino.forum2x2.ru/t12-topic#17 //arduwir.netdo.ru/article/6264

При включеном насосе и тене 1 раз в сек.

При выключеном тене и включеном насосе 2 раза в сек.

При выключенном насосе и тене 1 раз в 3 сек.

Продолжительность вспышки 0,25 сек. в любом режиме.

Источник: arduino.ru

#include <SoftwareSerial.h>
#include "DHT.h"
#define DHTPIN 7    // pin на котором висит датчик температуры
#define DHTTYPE DHT22  // DHT 22 тип датчика
//Отсылается смс в формате: влажность;температура;устройство1;устройство2;устройство3;устройство4;Контроль периметра;Состояние периметра;Контроль автотемпературы;Установленная температура;STEWARD;
int greenLed = 13; //Зеленый светодиод на PIN13
int powerGSM = 6; //Пин включения GSM
int unit1 = 8; //Управляемое устройство 1
int unit2 = 9; //Управляемое устройство 2
int unit3 = 10;//Управляемое устройство 3
int unit4 = 11;//Управляемое устройство 4
int perimetr = 12;// Датчик периметра
String statusHome;
int t=0;
 
unsigned long currentTime;
unsigned long loopTime;
 
boolean unit1status = false; //Управляемое устройство 1
boolean unit2status = false; //Управляемое устройство 2
boolean unit3status = false;//Управляемое устройство 3
boolean unit4status = false;//Управляемое устройство 4
 
boolean isPerimetr = false; //Контроль периметра
boolean sendSMS = false; //Для проверки что смс отсылаем только один раз
boolean isAuto = false; //Автоматическое управление температурой
int autoTemp = 0;
int delta=2;
 
DHT dht(DHTPIN, DHTTYPE);
 
SoftwareSerial gprsSerial(2, 3);
 
boolean prevBtn = LOW;
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
 
void setup()
{
    pinMode(unit1, OUTPUT);
    pinMode(unit2, OUTPUT);
    pinMode(unit3, OUTPUT);
    pinMode(unit4, OUTPUT);
    pinMode(powerGSM, OUTPUT);
    pinMode(perimetr, INPUT);
    pinMode(greenLed, OUTPUT);
 
    digitalWrite(unit1, LOW);
    digitalWrite(unit2, LOW);
    digitalWrite(unit3, LOW);
    digitalWrite(unit4, LOW);
    digitalWrite(powerGSM, LOW);
    digitalWrite(greenLed, LOW);
 
    //Включаю GSM Модуль
    digitalWrite(powerGSM, HIGH);
    delay(1000);
    digitalWrite(powerGSM, LOW);
    delay(5000);
    gprsSerial.begin(19200);
    delay(300);
    // Настраиваем приём сообщений с других устройств
    // Между командами даём время на их обработку
    gprsSerial.print("AT+CMGF=1r");
    delay(300);
    gprsSerial.print("AT+IFC=1, 1r");
    delay(300);
    gprsSerial.print("AT+CPBS="SM"r");
    delay(300);
    gprsSerial.print("AT+CNMI=1,2,2,1,0r");
    delay(500);
 
    //Инициализация температурного датчика
    Serial.begin(9600);
    Serial.println("DHTxx test!");
 
    dht.begin();
    delay(3000);
// ParseSMS("1;20;0;1;1;1;1");
  currentTime = millis();
  loopTime = currentTime;
}
 
 
 
void GetDatchik() {
  // Пол
  // Sensor readings may also be up to 2 seconds ‘old’ (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    statusHome = int(h)+String(";")+int(t)+String(";")+int(unit1status)+String(";")+int(unit2status)+String(";")+int(unit3status)+String(";")+int(unit4status)+String(";")+int(isPerimetr)+String(";")+digitalRead(perimetr)+String(";")+int(isAuto)+String(";")+int(autoTemp)+String(";STEWARD");
    sendTextMessage(statusHome);
//  Serial.print("H"); //Влажность
//  Serial.print(h);
//  Serial.print(";");
//  Serial.print("T"); //Температура
//  Serial.print(t);
//  Serial.println(";");
//  Serial.println(statusHome);
 
  }
}
 
 
 
 
 
 
void loop()
{
// delay(5000);
// GetDatchik();
int sostPerimetr; //Состояние периметра
  if (gprsSerial.available()){
  char currSymb = gprsSerial.read();
// Serial.print(currSymb);
 
      //  return;
  //  char currSymb = gprsSerial.read();
  //  Serial.println(currSymb);
    if (‘r’ == currSymb) {
        if (isStringMessage) {
            //если текущая строка — SMS-сообщение,
            //отреагируем на него соответствующим образом
            if (!currStr.compareTo("STATUS"))
            {
              GetDatchik();
            }
            else if (currStr.startsWith("0")||currStr.startsWith("1")) {
              ParseSMS(currStr);
            }
         
            isStringMessage = false;
        } else {
            if (currStr.startsWith("+CMT")) {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
                isStringMessage = true;
            }
        }
        currStr = "";
    } else if (‘n’ != currSymb) {
        currStr += String(currSymb);
    }
  }
//  Контроль периметра!!!
  if (isPerimetr) { //Проверка Включен ли контроль периметра
      digitalWrite(greenLed, HIGH);
      sostPerimetr = digitalRead(perimetr);
        if (sostPerimetr==LOW) { //Проверка на разомкнутый периметр
          digitalWrite(greenLed, LOW);
          delay(200);
          digitalWrite(greenLed, HIGH);
          delay(200);
          //и отсылаем СМС
          if (sendSMS==false){
            sendTextMessage("WARNING! The perimeter of the broken!");
            sendSMS=true;
          }
      }
 
  } else {
    digitalWrite(greenLed, LOW);
  }
//  Контроль температуры!!!
  if (isAuto==true) { //Проверка Включен автоуправление батареями
  //Замер температуры можно проводить не чаще раз в 5 минут
      currentTime = millis();
  if(currentTime >= (loopTime + 60000)){
  t = int(dht.readTemperature());
  loopTime = currentTime;
  }
//
//  Serial.print("t=");
//  Serial.println(t);
//  Serial.print("autoTemp+delta=");
//  Serial.println(autoTemp+delta);
    if (t > autoTemp+delta) {
        if ( unit1status==true){
        digitalWrite(unit1, LOW);
        unit1status=false;
        }
        if ( unit2status==true){
        digitalWrite(unit2, LOW);
        unit2status=false;
        }
        if ( unit3status==true){
        digitalWrite(unit3, LOW);
        unit3status=false;
        }
        if ( unit4status==true){
        digitalWrite(unit4, LOW);
        unit4status=false;
        }
        } else if (t < autoTemp-delta) {
        if ( unit1status==false){
        digitalWrite(unit1, HIGH);
        unit1status=true;
        }
        if ( unit2status==false){
        digitalWrite(unit2, HIGH);
        unit2status=true;
        }
        if ( unit3status==false){
        digitalWrite(unit3, HIGH);
        unit3status=true;
        }
        if ( unit4status==false){
        digitalWrite(unit4, HIGH);
        unit4status=true;
        }
        }
 
  }
}
 
 
 
 
void ParseSMS(String currStr) {
  int firstSemicolon;
  //Распарсиваем SMS
  firstSemicolon = 1;//находим первую ;
  //Получаем значение Автоматического режима контроля температуры
  // if (currStr.substring(firstSemicolon+1,currStr.indexOf(‘;’, firstSemicolon + 1 )) == "0"){
    if (currStr.substring(0,1) == "0"){
    isAuto=false;
  }
    else{
      isAuto=true;
    }
  //  Serial.println(currStr.substring(0,1));
//  Serial.print("isAuto=");
//  Serial.println(isAuto);
  firstSemicolon = currStr.indexOf(‘;’);
  //Получаем значение Автоматического уровня температуры
  autoTemp = stringToNumber(currStr.substring(firstSemicolon+1,currStr.indexOf(‘;’, firstSemicolon + 1 )));
  firstSemicolon = currStr.indexOf(‘;’,firstSemicolon + 1 );
// Serial.println(autoTemp);
  //Получаем значение Контроля периметра
  if (currStr.substring(firstSemicolon+1,currStr.indexOf(‘;’, firstSemicolon + 1 )) == "0"){
    isPerimetr=false;
  } else {
      isPerimetr=true;
    }
//  Serial.println(isPerimetr);
  firstSemicolon = currStr.indexOf(‘;’,firstSemicolon + 1 );
 
  //Получаем значение Устройства 1
if ((currStr.substring(firstSemicolon+1,currStr.indexOf(‘;’, firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit1status=false;
    digitalWrite(unit1, LOW);
//  Serial.println("Устройство 1 ВЫКЛ");
  } else{
      unit1status=true;
      digitalWrite(unit1, HIGH);
  //    Serial.println("Устройство 1 ВКЛ");
    }
firstSemicolon = currStr.indexOf(‘;’,firstSemicolon + 1 );
 
  //Получаем значение Устройства 2
if ((currStr.substring(firstSemicolon+1,currStr.indexOf(‘;’, firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit2status=false;
    digitalWrite(unit2, LOW);
  } else {
      unit2status=true;
      digitalWrite(unit2, HIGH);
    }
  firstSemicolon = currStr.indexOf(‘;’,firstSemicolon + 1 );
 
  //Получаем значение Устройства 3
if ((currStr.substring(firstSemicolon+1,currStr.indexOf(‘;’, firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit3status=false;
    digitalWrite(unit3, LOW);
  } else {
      unit3status=true;
      digitalWrite(unit3, HIGH);
    }
  firstSemicolon = currStr.indexOf(‘;’,firstSemicolon + 1 );
 
  //Получаем значение Устройства 4
if ((currStr.substring(firstSemicolon+1,currStr.indexOf(‘;’, firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit4status=false;
    digitalWrite(unit4, LOW);
  } else {
      unit4status=true;
      digitalWrite(unit4, HIGH);
    }
 
 
 
  }
 
/*
* Функция отправки SMS-сообщения
*/
void sendTextMessage(String text) {
    // Устанавливает текстовый режим для SMS-сообщений
    gprsSerial.print("AT+CMGF=1r");
    delay(100); // даём время на усваивание команды
    // Устанавливаем адресата: телефонный номер в международном формате
    gprsSerial.println("AT + CMGS = "+7909939XXXX""); //Телефон нужно откорректировать
    delay(100);
    // Пишем текст сообщения
    gprsSerial.println(text);
    delay(100);
    // Отправляем Ctrl+Z, обозначая, что сообщение готово
    gprsSerial.println((char)26);
}
 
 
//Функция преобразовангия STRING в INT
int stringToNumber(String thisString) {
  int i, value = 0, length;
  length = thisString.length();
  for(i=0; i<length; i++) {
    value = (10*value) + thisString.charAt(i)-(int) ‘0’;;
  }
  return value;
}

Источник: forum.amperka.ru


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.