0

База скетчей для ардуино

Содержание

Вот и закончился базовый курс уроков программирования Arduino. Мы с вами изучили самые базовые понятия, вспомнили (или изучили) часть школьной программы по информатике, изучили большую часть синтаксиса и инструментов языка C++, и вроде бы весь набор Ардуино-функций, который предлагает нам платформа. Подчеркну – мы изучили C++ и функции Ардуино, потому что никакого “языка Arduino” нет, это ложное понятие. Arduino программируется на C или ассемблере, а платформа предоставляет нам всего лишь несколько десятков удобных функций для работы с микроконтроллером, именно функций, а не язык. Теперь перед нами чистый лист блокнота Arduino IDE и желание творить и программировать, давайте попробуем!

Структура программы

Прежде, чем переходить к реальным задачам, нужно поговорить о некоторых фундаментальных вещах. Микроконтроллер, как мы обсуждали в самом начале пути, это комплексное устройство, состоящее из вычислительного ядра, постоянной и оперативной памяти и различных периферийных устройств (таймеры/счётчики, АЦП и проч.). Обработкой нашего с вами кода занимается именно ядро микроконтроллера, оно раздаёт команды остальным “железкам”, которые в дальнейшем могут работать самостоятельно. Ядро выполняет различные команды, подгоняемое тактовым генератором: на большинстве плат Arduino стоит генератор с частотой 16 МГц. Каждый толчок тактового генератора заставляет вычислительное ядро выполнить следующую команду, таким образом Ардуино выполняет 16 миллионов операций в секунду. Много ли это? Для большинства задач более чем достаточно, главное использовать эту скорость с умом.

Зачем я об этом рассказываю: микроконтроллер может выполнить только одну задачу в один момент времени, так как у него только одно вычислительное ядро, поэтому реальной “многозадачности” нет и быть не может, но за счёт большой скорости выполнения ядро может выполнять задачи по очереди, и для человека это будет казаться многозадачностью, ведь что для нас “раз Миссисипи“, для микроконтроллера – 16 миллионов действий!

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

Помимо цикла у нас есть прерывания, которые позволяют реализовать некую “поточность” выполнения задач, особенно в тех ситуациях, когда важна скорость работы. Прерывание позволяет остановить выполнение основного цикла в любом его месте, отвлечься на выполнение некоторого блока кода, и после успешного его завершения вернуться к основному циклу и продолжить работу. Некоторые задачи можно решить только на прерываниях, не написав ни одной строчки в цикл loop()! Мы с вами изучали аппаратные прерывания, позволяющие прерваться при замыкании контактов. Такие прерывания являются внешними, то есть их провоцируют внешние факторы (человек нажал на кнопку, сработал датчик, и т.д.). Также у микроконтроллера есть внутренние прерывания, которые вызываются периферией микроконтроллера, и этих прерываний может быть не один десяток!

Одним из таких прерываний является прерывание таймера: по умолчанию Arduino IDE настраивает один из таймеров на счёт реального времени, благодаря этому у нас работают такие функции как millis() и micros(). Именно эти функции являются готовым инструментом для тайм-менеджмента нашего кода.

Многозадачность?

Большинство примеров к различным модулям/датчикам используют задержку delay() в качестве “торможения” программы, например для вывода данных с датчика в последовательный порт. Именно такие примеры портят восприятие новичка, и он тоже начинает использовать задержки. А на задержках далеко не уедешь!

Давайте вспомним конструкцию таймера на millis() из урока о функциях времени: у нас есть переменная, которая хранит время прошлого “срабатывания” таймера. Мы вычитаем это время из текущего времени, эта разница постоянно увеличивается, и по условию мы можем поймать тот момент, когда пройдёт нужное нам время. Будем учиться избавляться от delay()! Начнём с простого: классический blink:

Программа полностью останавливается на команде delay(), ждёт указанное время, а затем продолжает выполнение. Чем это плохо? (А вы ещё спрашиваете?) Во время этой остановки мы ничего не можем делать в цикле loop, например не сможем опрашивать датчик 10 раз в секунду: задержка не позволит коду пойти дальше. Можно использовать прерывания (например – таймера), но о них мы поговорим в продвинутых уроках. Сейчас давайте избавимся от задержки в самом простом скетче.

Первым делом внесём такую оптимизацию: сократим код вдвое и избавимся от одной задержки, используя флаг:

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

Что здесь происходит: цикл loop() выполняется несколько сотен тысяч раз в секунду, как ему и положено, потому что мы убрали задержку. Каждую свою итерацию мы проверяем, не настало ли время переключить светодиод, не прошла ли секунда? При помощи этой конструкции и создаётся нужная многозадачность, которой хватит для 99% всех мыслимых проектов, ведь таких “таймеров” можно создать очень много!

Данный код всё ещё мигает светодиодом раз в секунду, но помимо этого он с разными промежутками времени отправляет сообщения в последовательный порт. Если открыть его, можно увидеть следующий текст:

Это означает, что у нас спокойно работают 4 таймера с разным периодом срабатывания, работают “параллельно”, обеспечивая нам многозадачность: мы можем выводить данные на дисплей раз в секунду, и заодно опрашивать датчик 10 раз в секунду и усреднять его показания. Хороший пример для первого проекта! Давайте соберём простенькие метео-часы.

Читайте также:  Домашний прибор для измерения давления

Как соединить несколько скетчей?

Сила Arduino как конструктора заключается в том, что абсолютно по любой железке вы сможете найти в Гугле подробное описание, библиотеку, схему подключения и пример работы: полностью готовый набор для интеграции в свой проект! Вернёмся к нашим метео-часам и попробуем “собрать” такой проект из скетчей-примеров, ведь именно для этого примеры и нужны! Нам понадобится:

  • Arduino NANO
  • Дисплей. Пусть будет LCD1602 с переходником на i2c
  • Модуль реального времени, возьмём DS3231
  • Термометр ds18b20

Начинаем гуглить информацию по подключению и примеру для каждой железки:

Из уроков из Гугла мы узнаём такую важную информацию, как схемы подключения: дисплей и часы подключаются к шине i2c, а датчик ds18b20 можно подключить в любой другой пин. Схема нашего проекта:

Качаем библиотеки для наших модулей и устанавливаем. Библиотеку дисплея нам дают прямо в статье: https://iarduino.ru/file/134.html, библиотеку для часов по своему опыту советую RTClib (та, что в статье – не очень удобная). В статье про датчик температуры нам рассказали про библиотеку DallasTemperature.h, ссылку – не дали. Ну чтож, поищем сами “DallasTemperature.h”, найдём по первой ссылке. Для неё нужна ещё библиотека OneWire, ссылку на неё дали в статье про термометр. Итого у нас должны быть установлены 4 библиотеки.

Сейчас наша цель – найти рабочие примеры для каждой железки, убедиться в их работоспособности и выделить для себя минимальный набор кода для управления модулем, это бывает непросто – в статьях бывают ошибки и просто нерабочий код: эти статьи чаще всего являются копипастой от людей, далёких от темы. Я взял пример работы с дисплеем из статьи, а вот часы и термометр пришлось смотреть в примерах библиотеки. Немного причешем примеры, оставим только нужные нам функции получения значений или вывода, я оставил всё что мне нужно в setup():

Вот и закончился базовый курс уроков программирования Arduino. Мы с вами изучили самые базовые понятия, вспомнили (или изучили) часть школьной программы по информатике, изучили большую часть синтаксиса и инструментов языка C++, и вроде бы весь набор Ардуино-функций, который предлагает нам платформа. Подчеркну – мы изучили C++ и функции Ардуино, потому что никакого “языка Arduino” нет, это ложное понятие. Arduino программируется на C или ассемблере, а платформа предоставляет нам всего лишь несколько десятков удобных функций для работы с микроконтроллером, именно функций, а не язык. Теперь перед нами чистый лист блокнота Arduino IDE и желание творить и программировать, давайте попробуем!

Структура программы

Прежде, чем переходить к реальным задачам, нужно поговорить о некоторых фундаментальных вещах. Микроконтроллер, как мы обсуждали в самом начале пути, это комплексное устройство, состоящее из вычислительного ядра, постоянной и оперативной памяти и различных периферийных устройств (таймеры/счётчики, АЦП и проч.). Обработкой нашего с вами кода занимается именно ядро микроконтроллера, оно раздаёт команды остальным “железкам”, которые в дальнейшем могут работать самостоятельно. Ядро выполняет различные команды, подгоняемое тактовым генератором: на большинстве плат Arduino стоит генератор с частотой 16 МГц. Каждый толчок тактового генератора заставляет вычислительное ядро выполнить следующую команду, таким образом Ардуино выполняет 16 миллионов операций в секунду. Много ли это? Для большинства задач более чем достаточно, главное использовать эту скорость с умом.

Зачем я об этом рассказываю: микроконтроллер может выполнить только одну задачу в один момент времени, так как у него только одно вычислительное ядро, поэтому реальной “многозадачности” нет и быть не может, но за счёт большой скорости выполнения ядро может выполнять задачи по очереди, и для человека это будет казаться многозадачностью, ведь что для нас “раз Миссисипи“, для микроконтроллера – 16 миллионов действий!

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

Помимо цикла у нас есть прерывания, которые позволяют реализовать некую “поточность” выполнения задач, особенно в тех ситуациях, когда важна скорость работы. Прерывание позволяет остановить выполнение основного цикла в любом его месте, отвлечься на выполнение некоторого блока кода, и после успешного его завершения вернуться к основному циклу и продолжить работу. Некоторые задачи можно решить только на прерываниях, не написав ни одной строчки в цикл loop()! Мы с вами изучали аппаратные прерывания, позволяющие прерваться при замыкании контактов. Такие прерывания являются внешними, то есть их провоцируют внешние факторы (человек нажал на кнопку, сработал датчик, и т.д.). Также у микроконтроллера есть внутренние прерывания, которые вызываются периферией микроконтроллера, и этих прерываний может быть не один десяток!

Одним из таких прерываний является прерывание таймера: по умолчанию Arduino IDE настраивает один из таймеров на счёт реального времени, благодаря этому у нас работают такие функции как millis() и micros(). Именно эти функции являются готовым инструментом для тайм-менеджмента нашего кода.

Многозадачность?

Большинство примеров к различным модулям/датчикам используют задержку delay() в качестве “торможения” программы, например для вывода данных с датчика в последовательный порт. Именно такие примеры портят восприятие новичка, и он тоже начинает использовать задержки. А на задержках далеко не уедешь!

Давайте вспомним конструкцию таймера на millis() из урока о функциях времени: у нас есть переменная, которая хранит время прошлого “срабатывания” таймера. Мы вычитаем это время из текущего времени, эта разница постоянно увеличивается, и по условию мы можем поймать тот момент, когда пройдёт нужное нам время. Будем учиться избавляться от delay()! Начнём с простого: классический blink:

Программа полностью останавливается на команде delay(), ждёт указанное время, а затем продолжает выполнение. Чем это плохо? (А вы ещё спрашиваете?) Во время этой остановки мы ничего не можем делать в цикле loop, например не сможем опрашивать датчик 10 раз в секунду: задержка не позволит коду пойти дальше. Можно использовать прерывания (например – таймера), но о них мы поговорим в продвинутых уроках. Сейчас давайте избавимся от задержки в самом простом скетче.

Первым делом внесём такую оптимизацию: сократим код вдвое и избавимся от одной задержки, используя флаг:

Читайте также:  Для чего нужен термостат в холодильнике

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

Что здесь происходит: цикл loop() выполняется несколько сотен тысяч раз в секунду, как ему и положено, потому что мы убрали задержку. Каждую свою итерацию мы проверяем, не настало ли время переключить светодиод, не прошла ли секунда? При помощи этой конструкции и создаётся нужная многозадачность, которой хватит для 99% всех мыслимых проектов, ведь таких “таймеров” можно создать очень много!

Данный код всё ещё мигает светодиодом раз в секунду, но помимо этого он с разными промежутками времени отправляет сообщения в последовательный порт. Если открыть его, можно увидеть следующий текст:

Это означает, что у нас спокойно работают 4 таймера с разным периодом срабатывания, работают “параллельно”, обеспечивая нам многозадачность: мы можем выводить данные на дисплей раз в секунду, и заодно опрашивать датчик 10 раз в секунду и усреднять его показания. Хороший пример для первого проекта! Давайте соберём простенькие метео-часы.

Как соединить несколько скетчей?

Сила Arduino как конструктора заключается в том, что абсолютно по любой железке вы сможете найти в Гугле подробное описание, библиотеку, схему подключения и пример работы: полностью готовый набор для интеграции в свой проект! Вернёмся к нашим метео-часам и попробуем “собрать” такой проект из скетчей-примеров, ведь именно для этого примеры и нужны! Нам понадобится:

  • Arduino NANO
  • Дисплей. Пусть будет LCD1602 с переходником на i2c
  • Модуль реального времени, возьмём DS3231
  • Термометр ds18b20

Начинаем гуглить информацию по подключению и примеру для каждой железки:

Из уроков из Гугла мы узнаём такую важную информацию, как схемы подключения: дисплей и часы подключаются к шине i2c, а датчик ds18b20 можно подключить в любой другой пин. Схема нашего проекта:

Качаем библиотеки для наших модулей и устанавливаем. Библиотеку дисплея нам дают прямо в статье: https://iarduino.ru/file/134.html, библиотеку для часов по своему опыту советую RTClib (та, что в статье – не очень удобная). В статье про датчик температуры нам рассказали про библиотеку DallasTemperature.h, ссылку – не дали. Ну чтож, поищем сами “DallasTemperature.h”, найдём по первой ссылке. Для неё нужна ещё библиотека OneWire, ссылку на неё дали в статье про термометр. Итого у нас должны быть установлены 4 библиотеки.

Сейчас наша цель – найти рабочие примеры для каждой железки, убедиться в их работоспособности и выделить для себя минимальный набор кода для управления модулем, это бывает непросто – в статьях бывают ошибки и просто нерабочий код: эти статьи чаще всего являются копипастой от людей, далёких от темы. Я взял пример работы с дисплеем из статьи, а вот часы и термометр пришлось смотреть в примерах библиотеки. Немного причешем примеры, оставим только нужные нам функции получения значений или вывода, я оставил всё что мне нужно в setup():

Конструктор скетчей для Arduino

Добро пожаловать в ArduinoBlock

ArduinoBlock основан на BlocklyDuino , веб – основе, графического редактора программирования. Обеспечение языковых блоков статического типа и генераторы кода для программирования Arduino.

С ArduinoBlock легко начать работать с микроконтроллером на основе экспериментов и обучения.

Конструктор скетчей для Arduino запись закреплена

Добро пожаловать в ArduinoBlock

ArduinoBlock основан на BlocklyDuino ,
веб – основе, графического редактора программирования.
Обеспечение языковых блоков статического типа
и генераторы кода для программирования Arduino.

С ArduinoBlock легко начать работать с микроконтроллером на основе экспериментов и обучения. Веб-сайт: http://arduino.vsemstroj.ru

  • Все записи
  • Записи сообщества
  • Поиск

Жубаныш Бурлибаев запись закреплена
Максим Рудый запись закреплена
Виталий Жихарев запись закреплена
Александра Фролова запись закреплена
Александр Иванов запись закреплена

Евгений Муратов запись закреплена
Ренат Зинатуллин запись закреплена

Нужна помощь в оптимизация кода (GSM модуль, Ардуино, Реле).
Все работает но хочется уменьшить код , писал код сам так что возможно у кого то получится оптимизировать и указать на мои ошибки)

#include
#include // подключаем библиотеку EEPROM память
Показать полностью…
SoftwareSerial mySerial(10, 11); // GSM МодульRX, TX
int ch = 0; //Инфа с GSM модуля
int rele = 3; //Пин Реле
String val = ""; //Инфа из ком порта

void setup() <
delay(2000); //время на инициализацию модуля
digitalWrite(rele, true); //выключим реле при старте
digitalWrite(12, true); //выключаем светодиод при старте
pinMode(rele, OUTPUT);
pinMode(12, OUTPUT);

Serial.begin(9600); //скорость порта
Serial.println("GSM Dian Automatic v1 Start. ");
Serial.println(". ");
Serial.println("Comande COM PORT:
Signal GSM = 1
Rele ON = 2
Rele OFF = 3");
Serial.println(". ");
Serial.println("
. Conect Seting. ");
mySerial.begin(9600);
mySerial.println("AT+ENPWRSAVE=0");
delay(1000);
mySerial.println("AT+CLIP=1"); //включаем АОН
delay(1000);
mySerial.println("AT+CMGF=1"); //режим кодировки СМС – обычный (для англ.)
delay(1000);
mySerial.println("AT+CSCS="GSM""); //режим кодировки текста
delay(1000);

//Запишим данные в память ардуино
EEPROM[3] = 1; // записываем 3-ю ячейку состояние реле
delay(1000);
mySerial.println("AT+CPAS"); //Команда проверки статуса модуля если 0 готов к работе
while (!mySerial.find("+CPAS: 0"));
digitalWrite(12, false); //Включаем светодиод
Serial.println("Network authentication = OK.");
Serial.println(". ");
logText();
Serial.println("
. ");
Serial.println("System Start = Complect!");
Serial.println(". ");

switch ( Serial.read()) < // Обработка команд из ком порта
case 49: logText(); break; //Фунция лога
case 50: digitalWrite(rele, false); Serial.println("–Rele – ON"); EEPROM[3] = 2; break; //включить реле и запись в память состояние
case 51: digitalWrite(rele, true); Serial.println("–Rele – OFF"); EEPROM[3] = 1; break; //выключаем реле и запись в память состояние
>

while (mySerial.available()) < //сохраняем входную строку в переменную val
ch = mySerial.read();
val += char(ch);
delay(10);
>
if (val.indexOf("RING") > -1 && val.indexOf("7952ххххххх") > -1 ) < //если звонок обнаружен и номер наш. Укажите свой номер без "+"
Serial.println("-— MASTER RING DETECTED —-");
delay(1000);
mySerial.println("ATH0"); //разрываем связь
delay(1000);
//управление реле
switch (EEPROM[3]) <
case 1:
EEPROM[3] = 2;// записываем 3-ю ячейку памяти
delay(300);
digitalWrite(rele, false); //включаем реле
sms(String("Cotel – ON"), String("+7952ххххххх")); //отправляем СМС на номер Шамиль
break;
case 2:
EEPROM[3] = 1;// записываем 3-ю ячейку
delay(300);
digitalWrite(rele, true); //выключаем реле
sms(String("Cotel – OFF"), String("+7952ххххх)); //отправляем СМС на номер
break;
>
val = ""; //очищаем
>
else
mySerial.println("ATH0"); //Скидываем если не наш номер
> else
// Serial.println(val); //печатаем в монитор порта пришедшую строку
val = ""; //очищаем
>

void sms(String text, String phone) //процедура отправки СМС
<
Serial.println("SMS send started");
delay(500);
mySerial.println("AT+CMGS="" + phone + """);
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println("SMS send complete – Tel: " + phone + ", Text:" + text); //Выводим номер получателя и текст в терминал
delay(500);
mySerial.println("AT+CMGD=1,4"); //стираем память смс
delay(5000);
val = ""; //очищаем

Читайте также:  Звонилка с записью разговора для андроид

void logText() <
Serial.print("Signal: ");
mySerial.println("AT+CSQ"); //вывести в терминал уровень сигнала (если 99, то связи нет)
while (mySerial.available()) < //сохраняем входную строку в переменную val
ch = mySerial.read();
val += char(ch);
delay(10);
>
Serial.print(val);
val = "";

Алмаз Нуриев запись закреплена
Конструктор скетчей для Arduino запись закреплена
Наше [18+]
Конструктор скетчей для Arduino запись закреплена

Конструктор скетчей для Arduino запись закреплена

Конструктор скетчей для Arduino запись закреплена
Конструктор скетчей для Arduino запись закреплена

Конструктор скетчей для Arduino запись закреплена
Конструктор скетчей для Arduino запись закреплена
Конструктор скетчей для Arduino запись закреплена

Скетч на запуск электро котла отопления ВКЛ/ВЫКЛ через , GSM_M590E модуль + реле на 40 апмер или контактор! Принцип простой звоним включается отопление еще раз звоним отключается и присылает смс ON, OFF. Используется энергонезависимая память в данном случае для предотвращения запуска котла при скачках электроэнергии в сети.

#include
Показать полностью…
#include // подключаем библиотеку EEPROM память
SoftwareSerial mySerial(10, 11); // RX, TX
int ch = 0;
int rele = 3;//Реле
String val = "";

void setup() <
delay(1000); //время на инициализацию модуля
pinMode(rele, OUTPUT);
//digitalWrite(rele, HIGH);
Serial.begin(9600); //скорость порта
Serial.println("GSM Start. ");
mySerial.begin(9600);
mySerial.println("AT+CLIP=1"); //включаем АОН
delay(200);
mySerial.println("AT+CMGF=1"); //режим кодировки СМС – обычный (для англ.)
delay(200);
mySerial.println("AT+CSCS="GSM""); //режим кодировки текста
delay(200);
//mySerial.println("AT+CSQ"); //вывести в терминал уровень сигнала (если 99, то связи нет)

//Запишим данные в память ардуино
EEPROM[3] = 2; // записываем 3-ю ячейку состояние реле

if (val.indexOf("7952664ХХХХ") > -1) < //если номер звонящего наш. Укажите свой номер без "+"
Serial.println("-— MASTER RING DETECTED —-");
Serial.println("USER – 7952664ХХХХ");

//управление реле
switch (EEPROM[3]) <
case 1:
EEPROM[3] = 2;// записываем 3-ю ячейку
mySerial.println("ATH0"); //разрываем связь
digitalWrite(rele, HIGH); //включаем реле
delay(300);

sms(String("Atoplenie – ON"), String("+795266ХХХХ")); //отправляем СМС на номер +7952664ХХХХ
break;
case 2:
EEPROM[3] = 1;// записываем 3-ю ячейку
mySerial.println("ATH0"); //разрываем связь
delay(300);
digitalWrite(rele, LOW); //выключаем реле

sms(String("Atoplenie – OFF"), String("+7952664ХХХХ")); //отправляем СМС на номер +7952664ХХХХ
break;
>

else
mySerial.println("ATH0"); //Скидываем если не наш номер

> else
Serial.println(val); //печатаем в монитор порта пришедшую строку
// signalSet(); //вывести на дисплей уровень сигнала (если 99, то связи нет)
val = ""; //очищаем

void sms(String text, String phone) //процедура отправки СМС
<
Serial.println("SMS send started");
mySerial.println("AT+CMGS="" + phone + """);
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println("SMS send complete");
delay(2000);
>

//Вывод в терминал инфу
void signalSet() <
mySerial.println("AT+CSQ"); //вывести в терминал уровень сигнала (если 99, то связи нет)
mySerial.println("AT+COPS=?"); //ОПЕРАТОРЫ
while (mySerial.available()) < //сохраняем входную строку в переменную val
ch = mySerial.read();
val += char(ch);
delay(10);
>

Конструктор скетчей для Arduino запись закреплена

В том году обещал выложить скетч сигнализации в наборе MFRC522,GSM_M590E, Герконовый датчик. Работает в имитации многопоточности то есть обрабатывает несколько данных за раз. Скетч был готов давно но обстоятельства сложились и я забыл про него вспомнил только сейчас! Для удобства оставил с комментариями возможно будут не совпадение код переписывал несколько раз ориентируйтесь по коду легче будет разобраться если потребуется схема подключения пишите скину.
Показать полностью…

/*
Смысл сигналки при разрыве герконового датчика на двери отправляем смс на номер абонента
Автор: Зинатуллин Ренат Айратович страничка вк https://vk.com/zinatullin_renat
*/
// MFRC522
#include
#include

MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp; // переменные для получения UID
//
int ib;

#include
SoftwareSerial GSM_M590E(2, 3); // RX, TX GSM_M590E модуля

int DatchikOutput = 4; // Герконовый Датчик двери находится на пин 8-9
int DatchikInput = 5; // Герконовый Датчик двери находится на пин 8-9

int val = 0; // Переменная для хранения значения статуса датчика 0 замкнуто другое значение разомкнуто
int sms_status = true; //Если true включаем сигналку
int sig = false;
int ch = 0; //Для вывода инфы в com port
String consol = ""; //Для вывода инфы в com port

//Массив телефона и текста для функции sms отправки текста на номер
char* Phone[] = <"+79000000000">; //Массив с номерами
int PhoneCount = 1; //Укажем сколько номеров в массиве
String TextSms = "The door is open. "; //Текст сообщения sms
//

void setup()
<
// MFRC522
while (!Serial);
SPI.begin();
mfrc522.PCD_Init();
//
pinMode(DatchikInput, INPUT); // устанавливает режим работы – вход для датчик двери
pinMode(DatchikOutput, OUTPUT); // устанавливает режим работы – выхода для датчик двери
pinMode(8, OUTPUT); // устанавливает режим работы – вход для датчик двери
digitalWrite(8, false); // Подадим 0 датчик двери
//Подадим + и – на датчик двери иначе не работает от блока питания
digitalWrite(DatchikInput, false); // Подадим 0 датчик двери
digitalWrite(DatchikOutput, true); // Подадим питание на датчик двери

//Мелодия
tone(7, 1600); // вывод звука 440Гц на 6 пин
delay(110); // задержка 200 миллисекунд
tone(7, 1900); // вывод звука 494Гц на 6 пин
delay(150); // задержка 400 мсек
noTone(7); // выключение звука на 6 пине
//Мелодия

Serial.begin(9600); //скорость порта
Serial.println("GSM_M590E Start. ");//Вывод текста в порт консоль
delay(3000);
GSM_M590E.begin(9600); //скорость GSM_M590E модема
GSM_M590E.println("AT+CLIP=1"); //включаем АОН
delay(200);
GSM_M590E.println("AT+CMGF=1"); //режим кодировки СМС – обычный (для англ.)
delay(200);
GSM_M590E.println("AT+CSCS="GSM""); //режим кодировки текста
delay(200);
Consollog();//Вывод в порт консоль команды от GSM
//delay(120000); //Ожидаем 2 минуты и включаем сигнализацию
>

void loop()
<
//GSM_M590E.println("AT+CSQ"); //вывести в терминал уровень сигнала (если 99, то связи нет)
// delay(100);
val = digitalRead(DatchikInput); // считываем значение с входа датчика двери
//Serial.println(val); //печатаем в монитор порта пришедшую строку
//Если есть сигнал
// int Signal_M590E = GSM_M590E.parseInt(); //парсим строку с сигналом сети

// digitalWrite(8, true); // Подадим 0 датчик двери
// if (Signal_M590E 0 ) < //Если сигнал больше 0 и меньше 50 то отправим смс
//Signal_M590E = 0;

//Если пин равен нулю если статус открытия равен true то есть первый старт
if (val == 0 ) <
sig = true;
>

if (sig == true ) <
ib++; //Отправка смс абонентам
if (ib >= 5) <
delay(1000);
>
Serial.println(ib);
if (ib >33) <
ib =0;
>

if ( sms_status == true and ib >= 30 ) <
for (int i = 0; i // Выдача серийного номера метки.
for (byte i = 0; i u > >

Serial.println(uidDec); // Выводим UID метки в консоль.

if (u > <
if (sms_status == false) <
pinMode(8, OUTPUT); // Светодиод включим
sms_status = true; //включим сигналку
sig == false;

admin

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

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

0

База скетчей для ардуино

Содержание

Вот и закончился базовый курс уроков программирования Arduino. Мы с вами изучили самые базовые понятия, вспомнили (или изучили) часть школьной программы по информатике, изучили большую часть синтаксиса и инструментов языка C++, и вроде бы весь набор Ардуино-функций, который предлагает нам платформа. Подчеркну – мы изучили C++ и функции Ардуино, потому что никакого “языка Arduino” нет, это ложное понятие. Arduino программируется на C или ассемблере, а платформа предоставляет нам всего лишь несколько десятков удобных функций для работы с микроконтроллером, именно функций, а не язык. Теперь перед нами чистый лист блокнота Arduino IDE и желание творить и программировать, давайте попробуем!

Структура программы

Прежде, чем переходить к реальным задачам, нужно поговорить о некоторых фундаментальных вещах. Микроконтроллер, как мы обсуждали в самом начале пути, это комплексное устройство, состоящее из вычислительного ядра, постоянной и оперативной памяти и различных периферийных устройств (таймеры/счётчики, АЦП и проч.). Обработкой нашего с вами кода занимается именно ядро микроконтроллера, оно раздаёт команды остальным “железкам”, которые в дальнейшем могут работать самостоятельно. Ядро выполняет различные команды, подгоняемое тактовым генератором: на большинстве плат Arduino стоит генератор с частотой 16 МГц. Каждый толчок тактового генератора заставляет вычислительное ядро выполнить следующую команду, таким образом Ардуино выполняет 16 миллионов операций в секунду. Много ли это? Для большинства задач более чем достаточно, главное использовать эту скорость с умом.

Зачем я об этом рассказываю: микроконтроллер может выполнить только одну задачу в один момент времени, так как у него только одно вычислительное ядро, поэтому реальной “многозадачности” нет и быть не может, но за счёт большой скорости выполнения ядро может выполнять задачи по очереди, и для человека это будет казаться многозадачностью, ведь что для нас “раз Миссисипи“, для микроконтроллера – 16 миллионов действий!

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

Помимо цикла у нас есть прерывания, которые позволяют реализовать некую “поточность” выполнения задач, особенно в тех ситуациях, когда важна скорость работы. Прерывание позволяет остановить выполнение основного цикла в любом его месте, отвлечься на выполнение некоторого блока кода, и после успешного его завершения вернуться к основному циклу и продолжить работу. Некоторые задачи можно решить только на прерываниях, не написав ни одной строчки в цикл loop()! Мы с вами изучали аппаратные прерывания, позволяющие прерваться при замыкании контактов. Такие прерывания являются внешними, то есть их провоцируют внешние факторы (человек нажал на кнопку, сработал датчик, и т.д.). Также у микроконтроллера есть внутренние прерывания, которые вызываются периферией микроконтроллера, и этих прерываний может быть не один десяток!

Одним из таких прерываний является прерывание таймера: по умолчанию Arduino IDE настраивает один из таймеров на счёт реального времени, благодаря этому у нас работают такие функции как millis() и micros(). Именно эти функции являются готовым инструментом для тайм-менеджмента нашего кода.

Многозадачность?

Большинство примеров к различным модулям/датчикам используют задержку delay() в качестве “торможения” программы, например для вывода данных с датчика в последовательный порт. Именно такие примеры портят восприятие новичка, и он тоже начинает использовать задержки. А на задержках далеко не уедешь!

Давайте вспомним конструкцию таймера на millis() из урока о функциях времени: у нас есть переменная, которая хранит время прошлого “срабатывания” таймера. Мы вычитаем это время из текущего времени, эта разница постоянно увеличивается, и по условию мы можем поймать тот момент, когда пройдёт нужное нам время. Будем учиться избавляться от delay()! Начнём с простого: классический blink:

Программа полностью останавливается на команде delay(), ждёт указанное время, а затем продолжает выполнение. Чем это плохо? (А вы ещё спрашиваете?) Во время этой остановки мы ничего не можем делать в цикле loop, например не сможем опрашивать датчик 10 раз в секунду: задержка не позволит коду пойти дальше. Можно использовать прерывания (например – таймера), но о них мы поговорим в продвинутых уроках. Сейчас давайте избавимся от задержки в самом простом скетче.

Первым делом внесём такую оптимизацию: сократим код вдвое и избавимся от одной задержки, используя флаг:

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

Что здесь происходит: цикл loop() выполняется несколько сотен тысяч раз в секунду, как ему и положено, потому что мы убрали задержку. Каждую свою итерацию мы проверяем, не настало ли время переключить светодиод, не прошла ли секунда? При помощи этой конструкции и создаётся нужная многозадачность, которой хватит для 99% всех мыслимых проектов, ведь таких “таймеров” можно создать очень много!

Данный код всё ещё мигает светодиодом раз в секунду, но помимо этого он с разными промежутками времени отправляет сообщения в последовательный порт. Если открыть его, можно увидеть следующий текст:

Это означает, что у нас спокойно работают 4 таймера с разным периодом срабатывания, работают “параллельно”, обеспечивая нам многозадачность: мы можем выводить данные на дисплей раз в секунду, и заодно опрашивать датчик 10 раз в секунду и усреднять его показания. Хороший пример для первого проекта! Давайте соберём простенькие метео-часы.

Читайте также:  Домашний прибор для измерения давления

Как соединить несколько скетчей?

Сила Arduino как конструктора заключается в том, что абсолютно по любой железке вы сможете найти в Гугле подробное описание, библиотеку, схему подключения и пример работы: полностью готовый набор для интеграции в свой проект! Вернёмся к нашим метео-часам и попробуем “собрать” такой проект из скетчей-примеров, ведь именно для этого примеры и нужны! Нам понадобится:

  • Arduino NANO
  • Дисплей. Пусть будет LCD1602 с переходником на i2c
  • Модуль реального времени, возьмём DS3231
  • Термометр ds18b20

Начинаем гуглить информацию по подключению и примеру для каждой железки:

Из уроков из Гугла мы узнаём такую важную информацию, как схемы подключения: дисплей и часы подключаются к шине i2c, а датчик ds18b20 можно подключить в любой другой пин. Схема нашего проекта:

Качаем библиотеки для наших модулей и устанавливаем. Библиотеку дисплея нам дают прямо в статье: https://iarduino.ru/file/134.html, библиотеку для часов по своему опыту советую RTClib (та, что в статье – не очень удобная). В статье про датчик температуры нам рассказали про библиотеку DallasTemperature.h, ссылку – не дали. Ну чтож, поищем сами “DallasTemperature.h”, найдём по первой ссылке. Для неё нужна ещё библиотека OneWire, ссылку на неё дали в статье про термометр. Итого у нас должны быть установлены 4 библиотеки.

Сейчас наша цель – найти рабочие примеры для каждой железки, убедиться в их работоспособности и выделить для себя минимальный набор кода для управления модулем, это бывает непросто – в статьях бывают ошибки и просто нерабочий код: эти статьи чаще всего являются копипастой от людей, далёких от темы. Я взял пример работы с дисплеем из статьи, а вот часы и термометр пришлось смотреть в примерах библиотеки. Немного причешем примеры, оставим только нужные нам функции получения значений или вывода, я оставил всё что мне нужно в setup():

Вот и закончился базовый курс уроков программирования Arduino. Мы с вами изучили самые базовые понятия, вспомнили (или изучили) часть школьной программы по информатике, изучили большую часть синтаксиса и инструментов языка C++, и вроде бы весь набор Ардуино-функций, который предлагает нам платформа. Подчеркну – мы изучили C++ и функции Ардуино, потому что никакого “языка Arduino” нет, это ложное понятие. Arduino программируется на C или ассемблере, а платформа предоставляет нам всего лишь несколько десятков удобных функций для работы с микроконтроллером, именно функций, а не язык. Теперь перед нами чистый лист блокнота Arduino IDE и желание творить и программировать, давайте попробуем!

Структура программы

Прежде, чем переходить к реальным задачам, нужно поговорить о некоторых фундаментальных вещах. Микроконтроллер, как мы обсуждали в самом начале пути, это комплексное устройство, состоящее из вычислительного ядра, постоянной и оперативной памяти и различных периферийных устройств (таймеры/счётчики, АЦП и проч.). Обработкой нашего с вами кода занимается именно ядро микроконтроллера, оно раздаёт команды остальным “железкам”, которые в дальнейшем могут работать самостоятельно. Ядро выполняет различные команды, подгоняемое тактовым генератором: на большинстве плат Arduino стоит генератор с частотой 16 МГц. Каждый толчок тактового генератора заставляет вычислительное ядро выполнить следующую команду, таким образом Ардуино выполняет 16 миллионов операций в секунду. Много ли это? Для большинства задач более чем достаточно, главное использовать эту скорость с умом.

Зачем я об этом рассказываю: микроконтроллер может выполнить только одну задачу в один момент времени, так как у него только одно вычислительное ядро, поэтому реальной “многозадачности” нет и быть не может, но за счёт большой скорости выполнения ядро может выполнять задачи по очереди, и для человека это будет казаться многозадачностью, ведь что для нас “раз Миссисипи“, для микроконтроллера – 16 миллионов действий!

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

Помимо цикла у нас есть прерывания, которые позволяют реализовать некую “поточность” выполнения задач, особенно в тех ситуациях, когда важна скорость работы. Прерывание позволяет остановить выполнение основного цикла в любом его месте, отвлечься на выполнение некоторого блока кода, и после успешного его завершения вернуться к основному циклу и продолжить работу. Некоторые задачи можно решить только на прерываниях, не написав ни одной строчки в цикл loop()! Мы с вами изучали аппаратные прерывания, позволяющие прерваться при замыкании контактов. Такие прерывания являются внешними, то есть их провоцируют внешние факторы (человек нажал на кнопку, сработал датчик, и т.д.). Также у микроконтроллера есть внутренние прерывания, которые вызываются периферией микроконтроллера, и этих прерываний может быть не один десяток!

Одним из таких прерываний является прерывание таймера: по умолчанию Arduino IDE настраивает один из таймеров на счёт реального времени, благодаря этому у нас работают такие функции как millis() и micros(). Именно эти функции являются готовым инструментом для тайм-менеджмента нашего кода.

Многозадачность?

Большинство примеров к различным модулям/датчикам используют задержку delay() в качестве “торможения” программы, например для вывода данных с датчика в последовательный порт. Именно такие примеры портят восприятие новичка, и он тоже начинает использовать задержки. А на задержках далеко не уедешь!

Давайте вспомним конструкцию таймера на millis() из урока о функциях времени: у нас есть переменная, которая хранит время прошлого “срабатывания” таймера. Мы вычитаем это время из текущего времени, эта разница постоянно увеличивается, и по условию мы можем поймать тот момент, когда пройдёт нужное нам время. Будем учиться избавляться от delay()! Начнём с простого: классический blink:

Программа полностью останавливается на команде delay(), ждёт указанное время, а затем продолжает выполнение. Чем это плохо? (А вы ещё спрашиваете?) Во время этой остановки мы ничего не можем делать в цикле loop, например не сможем опрашивать датчик 10 раз в секунду: задержка не позволит коду пойти дальше. Можно использовать прерывания (например – таймера), но о них мы поговорим в продвинутых уроках. Сейчас давайте избавимся от задержки в самом простом скетче.

Первым делом внесём такую оптимизацию: сократим код вдвое и избавимся от одной задержки, используя флаг:

Читайте также:  Вакуумный пинцет для smd элементов своими руками

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

Что здесь происходит: цикл loop() выполняется несколько сотен тысяч раз в секунду, как ему и положено, потому что мы убрали задержку. Каждую свою итерацию мы проверяем, не настало ли время переключить светодиод, не прошла ли секунда? При помощи этой конструкции и создаётся нужная многозадачность, которой хватит для 99% всех мыслимых проектов, ведь таких “таймеров” можно создать очень много!

Данный код всё ещё мигает светодиодом раз в секунду, но помимо этого он с разными промежутками времени отправляет сообщения в последовательный порт. Если открыть его, можно увидеть следующий текст:

Это означает, что у нас спокойно работают 4 таймера с разным периодом срабатывания, работают “параллельно”, обеспечивая нам многозадачность: мы можем выводить данные на дисплей раз в секунду, и заодно опрашивать датчик 10 раз в секунду и усреднять его показания. Хороший пример для первого проекта! Давайте соберём простенькие метео-часы.

Как соединить несколько скетчей?

Сила Arduino как конструктора заключается в том, что абсолютно по любой железке вы сможете найти в Гугле подробное описание, библиотеку, схему подключения и пример работы: полностью готовый набор для интеграции в свой проект! Вернёмся к нашим метео-часам и попробуем “собрать” такой проект из скетчей-примеров, ведь именно для этого примеры и нужны! Нам понадобится:

  • Arduino NANO
  • Дисплей. Пусть будет LCD1602 с переходником на i2c
  • Модуль реального времени, возьмём DS3231
  • Термометр ds18b20

Начинаем гуглить информацию по подключению и примеру для каждой железки:

Из уроков из Гугла мы узнаём такую важную информацию, как схемы подключения: дисплей и часы подключаются к шине i2c, а датчик ds18b20 можно подключить в любой другой пин. Схема нашего проекта:

Качаем библиотеки для наших модулей и устанавливаем. Библиотеку дисплея нам дают прямо в статье: https://iarduino.ru/file/134.html, библиотеку для часов по своему опыту советую RTClib (та, что в статье – не очень удобная). В статье про датчик температуры нам рассказали про библиотеку DallasTemperature.h, ссылку – не дали. Ну чтож, поищем сами “DallasTemperature.h”, найдём по первой ссылке. Для неё нужна ещё библиотека OneWire, ссылку на неё дали в статье про термометр. Итого у нас должны быть установлены 4 библиотеки.

Сейчас наша цель – найти рабочие примеры для каждой железки, убедиться в их работоспособности и выделить для себя минимальный набор кода для управления модулем, это бывает непросто – в статьях бывают ошибки и просто нерабочий код: эти статьи чаще всего являются копипастой от людей, далёких от темы. Я взял пример работы с дисплеем из статьи, а вот часы и термометр пришлось смотреть в примерах библиотеки. Немного причешем примеры, оставим только нужные нам функции получения значений или вывода, я оставил всё что мне нужно в setup():

Конструктор скетчей для Arduino

Добро пожаловать в ArduinoBlock

ArduinoBlock основан на BlocklyDuino , веб – основе, графического редактора программирования. Обеспечение языковых блоков статического типа и генераторы кода для программирования Arduino.

С ArduinoBlock легко начать работать с микроконтроллером на основе экспериментов и обучения.

Конструктор скетчей для Arduino запись закреплена

Добро пожаловать в ArduinoBlock

ArduinoBlock основан на BlocklyDuino ,
веб – основе, графического редактора программирования.
Обеспечение языковых блоков статического типа
и генераторы кода для программирования Arduino.

С ArduinoBlock легко начать работать с микроконтроллером на основе экспериментов и обучения. Веб-сайт: http://arduino.vsemstroj.ru

  • Все записи
  • Записи сообщества
  • Поиск

Жубаныш Бурлибаев запись закреплена
Максим Рудый запись закреплена
Виталий Жихарев запись закреплена
Александра Фролова запись закреплена
Александр Иванов запись закреплена

Евгений Муратов запись закреплена
Ренат Зинатуллин запись закреплена

Нужна помощь в оптимизация кода (GSM модуль, Ардуино, Реле).
Все работает но хочется уменьшить код , писал код сам так что возможно у кого то получится оптимизировать и указать на мои ошибки)

#include
#include // подключаем библиотеку EEPROM память
Показать полностью…
SoftwareSerial mySerial(10, 11); // GSM МодульRX, TX
int ch = 0; //Инфа с GSM модуля
int rele = 3; //Пин Реле
String val = ""; //Инфа из ком порта

void setup() <
delay(2000); //время на инициализацию модуля
digitalWrite(rele, true); //выключим реле при старте
digitalWrite(12, true); //выключаем светодиод при старте
pinMode(rele, OUTPUT);
pinMode(12, OUTPUT);

Serial.begin(9600); //скорость порта
Serial.println("GSM Dian Automatic v1 Start. ");
Serial.println(". ");
Serial.println("Comande COM PORT:
Signal GSM = 1
Rele ON = 2
Rele OFF = 3");
Serial.println(". ");
Serial.println("
. Conect Seting. ");
mySerial.begin(9600);
mySerial.println("AT+ENPWRSAVE=0");
delay(1000);
mySerial.println("AT+CLIP=1"); //включаем АОН
delay(1000);
mySerial.println("AT+CMGF=1"); //режим кодировки СМС – обычный (для англ.)
delay(1000);
mySerial.println("AT+CSCS="GSM""); //режим кодировки текста
delay(1000);

//Запишим данные в память ардуино
EEPROM[3] = 1; // записываем 3-ю ячейку состояние реле
delay(1000);
mySerial.println("AT+CPAS"); //Команда проверки статуса модуля если 0 готов к работе
while (!mySerial.find("+CPAS: 0"));
digitalWrite(12, false); //Включаем светодиод
Serial.println("Network authentication = OK.");
Serial.println(". ");
logText();
Serial.println("
. ");
Serial.println("System Start = Complect!");
Serial.println(". ");

switch ( Serial.read()) < // Обработка команд из ком порта
case 49: logText(); break; //Фунция лога
case 50: digitalWrite(rele, false); Serial.println("–Rele – ON"); EEPROM[3] = 2; break; //включить реле и запись в память состояние
case 51: digitalWrite(rele, true); Serial.println("–Rele – OFF"); EEPROM[3] = 1; break; //выключаем реле и запись в память состояние
>

while (mySerial.available()) < //сохраняем входную строку в переменную val
ch = mySerial.read();
val += char(ch);
delay(10);
>
if (val.indexOf("RING") > -1 && val.indexOf("7952ххххххх") > -1 ) < //если звонок обнаружен и номер наш. Укажите свой номер без "+"
Serial.println("-— MASTER RING DETECTED —-");
delay(1000);
mySerial.println("ATH0"); //разрываем связь
delay(1000);
//управление реле
switch (EEPROM[3]) <
case 1:
EEPROM[3] = 2;// записываем 3-ю ячейку памяти
delay(300);
digitalWrite(rele, false); //включаем реле
sms(String("Cotel – ON"), String("+7952ххххххх")); //отправляем СМС на номер Шамиль
break;
case 2:
EEPROM[3] = 1;// записываем 3-ю ячейку
delay(300);
digitalWrite(rele, true); //выключаем реле
sms(String("Cotel – OFF"), String("+7952ххххх)); //отправляем СМС на номер
break;
>
val = ""; //очищаем
>
else
mySerial.println("ATH0"); //Скидываем если не наш номер
> else
// Serial.println(val); //печатаем в монитор порта пришедшую строку
val = ""; //очищаем
>

void sms(String text, String phone) //процедура отправки СМС
<
Serial.println("SMS send started");
delay(500);
mySerial.println("AT+CMGS="" + phone + """);
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println("SMS send complete – Tel: " + phone + ", Text:" + text); //Выводим номер получателя и текст в терминал
delay(500);
mySerial.println("AT+CMGD=1,4"); //стираем память смс
delay(5000);
val = ""; //очищаем

Читайте также:  Как быстро посчитать примеры

void logText() <
Serial.print("Signal: ");
mySerial.println("AT+CSQ"); //вывести в терминал уровень сигнала (если 99, то связи нет)
while (mySerial.available()) < //сохраняем входную строку в переменную val
ch = mySerial.read();
val += char(ch);
delay(10);
>
Serial.print(val);
val = "";

Алмаз Нуриев запись закреплена
Конструктор скетчей для Arduino запись закреплена
Наше [18+]
Конструктор скетчей для Arduino запись закреплена

Конструктор скетчей для Arduino запись закреплена

Конструктор скетчей для Arduino запись закреплена
Конструктор скетчей для Arduino запись закреплена

Конструктор скетчей для Arduino запись закреплена
Конструктор скетчей для Arduino запись закреплена
Конструктор скетчей для Arduino запись закреплена

Скетч на запуск электро котла отопления ВКЛ/ВЫКЛ через , GSM_M590E модуль + реле на 40 апмер или контактор! Принцип простой звоним включается отопление еще раз звоним отключается и присылает смс ON, OFF. Используется энергонезависимая память в данном случае для предотвращения запуска котла при скачках электроэнергии в сети.

#include
Показать полностью…
#include // подключаем библиотеку EEPROM память
SoftwareSerial mySerial(10, 11); // RX, TX
int ch = 0;
int rele = 3;//Реле
String val = "";

void setup() <
delay(1000); //время на инициализацию модуля
pinMode(rele, OUTPUT);
//digitalWrite(rele, HIGH);
Serial.begin(9600); //скорость порта
Serial.println("GSM Start. ");
mySerial.begin(9600);
mySerial.println("AT+CLIP=1"); //включаем АОН
delay(200);
mySerial.println("AT+CMGF=1"); //режим кодировки СМС – обычный (для англ.)
delay(200);
mySerial.println("AT+CSCS="GSM""); //режим кодировки текста
delay(200);
//mySerial.println("AT+CSQ"); //вывести в терминал уровень сигнала (если 99, то связи нет)

//Запишим данные в память ардуино
EEPROM[3] = 2; // записываем 3-ю ячейку состояние реле

if (val.indexOf("7952664ХХХХ") > -1) < //если номер звонящего наш. Укажите свой номер без "+"
Serial.println("-— MASTER RING DETECTED —-");
Serial.println("USER – 7952664ХХХХ");

//управление реле
switch (EEPROM[3]) <
case 1:
EEPROM[3] = 2;// записываем 3-ю ячейку
mySerial.println("ATH0"); //разрываем связь
digitalWrite(rele, HIGH); //включаем реле
delay(300);

sms(String("Atoplenie – ON"), String("+795266ХХХХ")); //отправляем СМС на номер +7952664ХХХХ
break;
case 2:
EEPROM[3] = 1;// записываем 3-ю ячейку
mySerial.println("ATH0"); //разрываем связь
delay(300);
digitalWrite(rele, LOW); //выключаем реле

sms(String("Atoplenie – OFF"), String("+7952664ХХХХ")); //отправляем СМС на номер +7952664ХХХХ
break;
>

else
mySerial.println("ATH0"); //Скидываем если не наш номер

> else
Serial.println(val); //печатаем в монитор порта пришедшую строку
// signalSet(); //вывести на дисплей уровень сигнала (если 99, то связи нет)
val = ""; //очищаем

void sms(String text, String phone) //процедура отправки СМС
<
Serial.println("SMS send started");
mySerial.println("AT+CMGS="" + phone + """);
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println("SMS send complete");
delay(2000);
>

//Вывод в терминал инфу
void signalSet() <
mySerial.println("AT+CSQ"); //вывести в терминал уровень сигнала (если 99, то связи нет)
mySerial.println("AT+COPS=?"); //ОПЕРАТОРЫ
while (mySerial.available()) < //сохраняем входную строку в переменную val
ch = mySerial.read();
val += char(ch);
delay(10);
>

Конструктор скетчей для Arduino запись закреплена

В том году обещал выложить скетч сигнализации в наборе MFRC522,GSM_M590E, Герконовый датчик. Работает в имитации многопоточности то есть обрабатывает несколько данных за раз. Скетч был готов давно но обстоятельства сложились и я забыл про него вспомнил только сейчас! Для удобства оставил с комментариями возможно будут не совпадение код переписывал несколько раз ориентируйтесь по коду легче будет разобраться если потребуется схема подключения пишите скину.
Показать полностью…

/*
Смысл сигналки при разрыве герконового датчика на двери отправляем смс на номер абонента
Автор: Зинатуллин Ренат Айратович страничка вк https://vk.com/zinatullin_renat
*/
// MFRC522
#include
#include

MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp; // переменные для получения UID
//
int ib;

#include
SoftwareSerial GSM_M590E(2, 3); // RX, TX GSM_M590E модуля

int DatchikOutput = 4; // Герконовый Датчик двери находится на пин 8-9
int DatchikInput = 5; // Герконовый Датчик двери находится на пин 8-9

int val = 0; // Переменная для хранения значения статуса датчика 0 замкнуто другое значение разомкнуто
int sms_status = true; //Если true включаем сигналку
int sig = false;
int ch = 0; //Для вывода инфы в com port
String consol = ""; //Для вывода инфы в com port

//Массив телефона и текста для функции sms отправки текста на номер
char* Phone[] = <"+79000000000">; //Массив с номерами
int PhoneCount = 1; //Укажем сколько номеров в массиве
String TextSms = "The door is open. "; //Текст сообщения sms
//

void setup()
<
// MFRC522
while (!Serial);
SPI.begin();
mfrc522.PCD_Init();
//
pinMode(DatchikInput, INPUT); // устанавливает режим работы – вход для датчик двери
pinMode(DatchikOutput, OUTPUT); // устанавливает режим работы – выхода для датчик двери
pinMode(8, OUTPUT); // устанавливает режим работы – вход для датчик двери
digitalWrite(8, false); // Подадим 0 датчик двери
//Подадим + и – на датчик двери иначе не работает от блока питания
digitalWrite(DatchikInput, false); // Подадим 0 датчик двери
digitalWrite(DatchikOutput, true); // Подадим питание на датчик двери

//Мелодия
tone(7, 1600); // вывод звука 440Гц на 6 пин
delay(110); // задержка 200 миллисекунд
tone(7, 1900); // вывод звука 494Гц на 6 пин
delay(150); // задержка 400 мсек
noTone(7); // выключение звука на 6 пине
//Мелодия

Serial.begin(9600); //скорость порта
Serial.println("GSM_M590E Start. ");//Вывод текста в порт консоль
delay(3000);
GSM_M590E.begin(9600); //скорость GSM_M590E модема
GSM_M590E.println("AT+CLIP=1"); //включаем АОН
delay(200);
GSM_M590E.println("AT+CMGF=1"); //режим кодировки СМС – обычный (для англ.)
delay(200);
GSM_M590E.println("AT+CSCS="GSM""); //режим кодировки текста
delay(200);
Consollog();//Вывод в порт консоль команды от GSM
//delay(120000); //Ожидаем 2 минуты и включаем сигнализацию
>

void loop()
<
//GSM_M590E.println("AT+CSQ"); //вывести в терминал уровень сигнала (если 99, то связи нет)
// delay(100);
val = digitalRead(DatchikInput); // считываем значение с входа датчика двери
//Serial.println(val); //печатаем в монитор порта пришедшую строку
//Если есть сигнал
// int Signal_M590E = GSM_M590E.parseInt(); //парсим строку с сигналом сети

// digitalWrite(8, true); // Подадим 0 датчик двери
// if (Signal_M590E 0 ) < //Если сигнал больше 0 и меньше 50 то отправим смс
//Signal_M590E = 0;

//Если пин равен нулю если статус открытия равен true то есть первый старт
if (val == 0 ) <
sig = true;
>

if (sig == true ) <
ib++; //Отправка смс абонентам
if (ib >= 5) <
delay(1000);
>
Serial.println(ib);
if (ib >33) <
ib =0;
>

if ( sms_status == true and ib >= 30 ) <
for (int i = 0; i // Выдача серийного номера метки.
for (byte i = 0; i u > >

Serial.println(uidDec); // Выводим UID метки в консоль.

if (u > <
if (sms_status == false) <
pinMode(8, OUTPUT); // Светодиод включим
sms_status = true; //включим сигналку
sig == false;

admin

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

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