SMS розетка (аналог SenseIt GS1\ МегаФон розетка) своими руками на Arduino
- Войдите на сайт для отправки комментариев
Здраствуйте!
Возниклла мысль создать аналог смс розетки от мегафона. Подробнее об оригинале по ссылкам:
Видеообзор - https://www.youtube.com/watch?v=2Ezpt0GLU7o
Просто обзоры:
http://yamobi.ru/posts/testiruem_SMS-rozetku_nanotehnologii_otdyihayut.html
https://hi-tech.mail.ru/review/senseit_gs_1.html
или целая россыпь обзоров и отзывов:
Так как в первую очередь ставится цель "минимум расхлодов", проект бюджетный. То сразу отказываемся от дорого GSM\GPRS Shild, а будем использовать более дешёвый модуль http://ru.aliexpress.com/item/GSM-GPRS-900-1800-MHz-Short-Message-Service-SMS-module-for-project-for-Arduino-remote-sensing/32285058497.html
Так как в нём используется модуль не SIM900 то сразу отказываемся от библиотеки SIM900, будем использовать SoftwareSerial (програмный серийный порт). После продолжительных поисков на этом форуме и просмотра его веток, я не нашёл похожей темы и\или устройства. Глобальный поиск привёл меня к страничке с описанием точно такого устройства как мне нужно, на радастях был переделан скетч (изменены номера портов) и залит... Увы устройство "с коробки" не заработало и мне пришлось брать учебник и садится по строчно разбирать код, вот тут то и возникли проблемы, я не понял всю логику работы этого скетча
Вот ссылка на страницу http://podrugomu.com/node/1456 И вот код с страницы:
//5.03.2013 12.48
#include <softwareserial.h>
#include <string.h>
SoftwareSerial mySerial(2, 3); // RX, TX
int count=0; // counter for buffer array
long timer = 0;
String currStr = "";
String rep = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
int power1 = 8;
int power2 = 9;
int power3 = 10;
int power4 = 11;
int power5 = 12;
void setup() {
pinMode(power1, OUTPUT);
pinMode(power2, OUTPUT);
pinMode(power3, OUTPUT);
pinMode(power4, OUTPUT);
pinMode(power5, OUTPUT);
digitalWrite(power1, HIGH);
digitalWrite(power2, HIGH);
digitalWrite(power3, HIGH);
digitalWrite(power4, HIGH);
digitalWrite(power5, HIGH);
powerUp();
Serial.begin(19200);
mySerial.begin(19200);
//mySerial.println("AT+IPR=19200");
//delay(500);
Serial.println("Arduino START OK");
mySerial.println("ATZ");
delay(500);
mySerial_read();
mySerial.println("AT+CMGDA=\"DEL ALL\"");
delay(500);
mySerial_read();
mySerial.println("AT+CMGF=1"); // устанавливаем текстовый режим SMS
delay(500);
mySerial_read();
mySerial.println("AT+IFC=0,0"); //настройка SIM900 Serial bufer
delay(500);
mySerial_read();
mySerial.println("AT+CPBS=\"SM\"");
delay(500);
mySerial_read();
//mySerial.print("AT+CNMI=1,2,2,1,0");
mySerial.println("AT+CNMI=1,2,0,0,0");
delay(500);
mySerial_read();
mySerial.print("AT+CMGL=");
mySerial.print((char)34);
mySerial.print("ALL");
mySerial.print((char)34);
mySerial.print((char)13);
delay(300);
mySerial_read();
}
void loop()
{
if (timer < millis())
{
timer = millis()+600000;
delay(2000);
pinMode(13, OUTPUT);
digitalWrite(13,HIGH);
delay(500);
digitalWrite(13,LOW);
mySerial.println("AT");
delay(200);
rep = (String)mySerial.read();
//Serial.println(rep);
if (rep == "65"){
Serial.println("GPRS module is OK");
}
else
{
powerUp();
}
}
mySerial_read();
Serial_read();
if (Serial.available())
Serial.println(mySerial.read());
if (mySerial.available())
return;
char currSymb = mySerial.read();
if ('\r' == currSymb) {
if (isStringMessage) {
//если текущая строка - SMS-сообщение,
//отреагируем на него соответствующим образом
if (!currStr.compareTo("1 on")) {
digitalWrite(power1, HIGH);
Serial.println("power 1 is ON");
} else if (!currStr.compareTo("1 off")) {
digitalWrite(power1, LOW);
} else if (!currStr.compareTo("2 on")) {
digitalWrite(power2, HIGH);
} else if (!currStr.compareTo("2 off")) {
digitalWrite(power2, LOW);
} else if (!currStr.compareTo("3 on")) {
digitalWrite(power3, HIGH);
} else if (!currStr.compareTo("3 off")) {
digitalWrite(power3, LOW);
} else if (!currStr.compareTo("4 on")) {
digitalWrite(power4, HIGH);
} else if (!currStr.compareTo("4 off")) {
digitalWrite(power4, LOW);
} else if (!currStr.compareTo("5 on")) {
digitalWrite(power5, HIGH);
} else if (!currStr.compareTo("5 off")) {
digitalWrite(power5, LOW);
}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}
void send_sms(String sms_number,String sms_text){
delay(1500);
mySerial.print("AT+CMGS=");
mySerial.print((char)34);
mySerial.print((String)sms_number);
mySerial.print((char)13);
delay(1500);
mySerial.println((String)sms_text);
delay(500);
mySerial.print((char)26);
mySerial.print((char)13);
delay(1000);
}
void dial(String number){
delay(1000);
mySerial.print("ATD");
mySerial.println((String)number);
delay(500);
}
void powerUp()
{
pinMode(6, OUTPUT);
digitalWrite(6,LOW);
delay(1000);
digitalWrite(6,HIGH);
delay(2000);
digitalWrite(6,LOW);
delay(3000);
}
void powerDown()
{
pinMode(6, OUTPUT);
digitalWrite(6,LOW);
delay(1000);
digitalWrite(6,HIGH);
delay(2000);
digitalWrite(6,LOW);
delay(3000);
}
void mySerial_read()
{
int i=0;
char buffer[200];
if(mySerial.available()){
delay(100);
while( mySerial.available() && i< 199) {
buffer[i++] = mySerial.read();
}
buffer[i++]='\0';
}
if(i>0){
Serial.println(buffer);
}
}
void Serial_read()
{
int a=0;
char buffer2[200];
if(Serial.available()){
delay(100);
while( Serial.available() && a< 199) {
buffer2[a++] = Serial.read();
}
buffer2[a++]='\0';
}
//if buffer full
if(a>0){
mySerial.println(buffer2);
}
}
void(* resetFunc) (void) = 0; // Reset MC function - resetFunc(); //вызов
</string.h></softwareserial.h>
Далее по коду вопросы:
1. Почему начинается и заканчивается строками "//5.03.2013 12.48" и "</string.h></softwareserial.h>"
2. Зачем нужны функции "powerUp" "powerDown",
3. Какие есть в этом скетче ошибки, почему он всё таки не работает, к сожалению по тексту скетча очень мало коментариев и не совсем понятна логика работы этого скетча, поэтому прошу знающих людей помочь мне разобраться, что-бы в итоге я смог дописать коментарии и исправить ошибки, что-бы желающие могли использовать готовый скетч как основу для разработки своей смс розетки. Например я бы ещё хотел добавить возможность занесение в EEPROM память номера для управления, например добавив кнопку "reset" при нажатии которой сбрасывается номер для управления в EEPROM, а потом с первой же смской этот номер заносится в EEPROM память и в дальнейшем отрабатываются команды только с номера который был занесён в память. Плюс логично добавить какой нибуть ответ при получении смски и отработки команды на включение\выключение в виде ответного звонка и\или ответной смски. А в идеале и возможность с помощью звонка на устройство определить его состояние, включено или отключено.
Заранее спасибо всем кто откликнится!
Примеры двух похожих устройств:
http://elgato.com.ua/ru/news/18-production/smart-home-office/125-gsm-rozetka-3-kanala-power-switch-sms
http://alitrack.ru/review/3726.html
Также нечто похожее по вункциональности выпускает и МастерКИТ .
Но проблема всех этих устройств цена, самое дешёвое что я находил это:
http://olx.ua/list/q-sms-%D1%80%D0%BE%D0%B7%D0%B5%D1%82%D0%BA%D0%B0/
Особенно впечатлил вариан http://kiev.ko.olx.ua/obyavlenie/prodam-gsm-sms-rozetku-dlya-vklyucheniya-konditsionera-ID75eUX.html#03701e522f это как раз то устройство, что я создаю, по конструкции абсолютно видно что оно не заводского изготовления , вдумайтесь за 110 $ И это при том что ардуинку+GPRS Shild+ рыле можно купить за приблезительно 10 баксов.
... И это при том что ардуинку+GPRS Shild+ рыле можно купить за приблезительно 10 баксов.
Дайте две!
Так как в первую очередь ставится цель "минимум расхлодов", проект бюджетный. То сразу отказываемся от дорого GSM\GPRS Shild, а будем использовать более дешёвый модуль http://ru.aliexpress.com/item/GSM-GPRS-900-1800-MHz-Short-Message-Service-SMS-module-for-project-for-Arduino-remote-sensing/32285058497.html
Я не встречал отзывов, явно указывающих, что этот модуль в наших условиях можно заставить работать. И поэтому не стал бы вам его советовать.
Вот из самого дешевого, что доступно в Китае:
http://www.ebay.com/itm/Smallest-SIM800L-GPRS-GSM-Module-Micro-Card-Boar...
Это по сути улучшенный SIM900, только маленький. Если хочется общаться через библиотеку - она подходит от SIM900.
GSM GPRS модуль на основе NEOWAY M590 (Совместим по командам с SIM900).
http://jewelfox.ru/lot.php?id=4591
врут полюбому. есть у меня модули тоже совместимые (только для другого) и нифига
GSM GPRS модуль на основе NEOWAY M590 (Совместим по командам с SIM900).
http://jewelfox.ru/lot.php?id=4591
врут полюбому. есть у меня модули тоже совместимые (только для другого) и нифига
Хм...
Вот и подтвердились мои подозрения - он не дружит с 5-вольтовой логикой...
А по командам он может быть и совместим. Они все, с большего, hayes-совместимые.
я не исключаю того что питание модуля ТС не сделал соответствующим его потреблению изза чего он не может работать в режиме прием/передача
рекомендуемый по даташиту стабилизатор MIC29302 на 3А!!!! даже не стоит пытаться подключать к 3.3В ардуины
NEOWAY M590 Даташит на китайском языке: http://123.125.114.20/view/a09ed51c10a6f524ccbf857c.html?re=view
Вот человеку купившему модуль, китайцы прислали схему включения и скрины с ответами модема http://arduino.ru/forum/proekty/kontrolnye-vesy-dlya-paseki-s-otpravkoi-dannykh-v-sms#comment-105549 , мануал от подобного модуля http://wless.ru/files/GSM/Neoway/Neoway_M660_Module_Hardware_User_Guide_V3_4.pdf Схема включения:
вот конкретно как человек состыковал:
http://m.geektimes.ru/post/243033/
я думаю что есть даже микросхемка какая, типа max232 которая при минимальной развязке сможет транслировать эти уровни...
Меня интересует не аппаратная стыковка, суть вопроса не в этом.
Я прежде всего жажду помощи по прагромирования, а точнее по скетчу, который выложил в шапке этой темы.
Сутя по отсуствию в ней процедуры вызова функции
powerDownа также потому что в конце коментарий обрывается на полу слове, я сделал вывод что автор или намеренно не дал полный скетч или кто-то скопировал это откудато, но по неосмотрительности не точно.Прошу тех кто хорошо разбирается в программировании ардуино, дать свои коментарии.
..
Сутя по отсуствию в ней процедуры вызова функции
powerDownа также потому что в конце коментарий обрывается на полу слове, я сделал вывод что автор или намеренно не дал полный скетч или кто-то скопировал это откудато, но по неосмотрительности не точно.Прошу тех кто хорошо разбирается в программировании ардуино, дать свои коментарии.
Поясните свой вопрос.
Вышеназванная функция в вашем коде есть и есть место, откуда она вызывается.
Вот это Вы имеете ввиду:
void powerDown() { pinMode(6, OUTPUT); digitalWrite(6,LOW); delay(1000); digitalWrite(6,HIGH); delay(2000); digitalWrite(6,LOW); delay(3000); }Так она полность повторяет:
void powerUp() { pinMode(6, OUTPUT); digitalWrite(6,LOW); delay(1000); digitalWrite(6,HIGH); delay(2000); digitalWrite(6,LOW); delay(3000); }только последняя вызывается от сюда:void loop() { if (timer < millis()) { timer = millis()+600000; delay(2000); pinMode(13, OUTPUT); digitalWrite(13,HIGH); delay(500); digitalWrite(13,LOW); mySerial.println("AT"); delay(200); rep = (String)mySerial.read(); //Serial.println(rep); if (rep == "65"){ Serial.println("GPRS module is OK"); } else { powerUp(); } }последняя строка, а функция "powerDown" не откуда не вызывается. Выход она работает один раз при включении?
И самое главное: Почему это всё не работает?
Какую функцию выполняет светодиод на 13 порту, зачем и почему он мигает?
Что это и зачем:
Собраное устройство, пишет всё в сериал порт, последнее "ОК". Если отправить смс через инет, то оно обрезано и ключевое "
1 on" в строке принятой смс нет. Если отправить с телефона, ардуина принимает и текст пересылает в ком порт, только реле не срабатывает...Добавил в код свои коментарии, не судите строго, я только учусь:
// СМС розетка , вариант 1 автор "podrugomu.com/node/1456" #include <softwareserial.h> // Дириктива подключения внешней библиотеки "SoftwareSerial" #include <string.h> // Дириктива подключения внешней библиотеки "String" SoftwareSerial mySerial(2, 3); // RX, TX Порты програмного интерфейса, соответственно int count=0; // counter for buffer array - счетчик для буфера массива, переменная "count" тип "int" (2 байта) long timer = 0; // Тип данных "long" (4 байта), переменная "timer", начальное значение "0" String currStr = ""; // Класс String, объявляем строчную переменную "currStr" с пустым начальным значением String rep = ""; // то же , строчная переменная "rep" начальное значение то же пустое boolean isStringMessage = false; // Логического типа переменная (из двух значений "True" и "False") // принимает значение True, если текущая строка является сообщением int power1 = 8; // Переменная "power1" тип "int" (2 байта), объявляем значение номером выбраного порта. int power2 = 9; //то же int power3 = 10; // то же int power4 = 11; // то же int power5 = 12; // то же void setup() // Одна из двух обязательных функции, запускается один раз при включении или перезагрузки { // Начало функции "setup" pinMode(power1, OUTPUT); // Устанавливаем режим выбраного порта, номером которого является значение переменной "power1", pinMode(power2, OUTPUT); // в данном случае режим выбран как "выход". pinMode(power3, OUTPUT); // то же pinMode(power4, OUTPUT); // то же pinMode(power5, OUTPUT); // то же digitalWrite(power1, HIGH); // Устанавливаем уровень "HIGH" (5 вольт), на порте согласно переменной "power1" digitalWrite(power2, HIGH); // то же digitalWrite(power3, HIGH); // то же digitalWrite(power4, HIGH); // то же digitalWrite(power5, HIGH); // то же powerUp(); // Выполнить функцию "powerUp", код которой находится ниже. Serial.begin(19200); // Скорость апаратного порта установить "19200" mySerial.begin(19200); // Скорость програмного порта установить "19200" //mySerial.println("AT+IPR=19200"); ------ ЗАКОМЕНТИРОВАНАЯ СТРОКА АВТОРА----- //delay(500); ------ ЗАКОМЕНТИРОВАНАЯ СТРОКА АВТОРА----- Serial.println("Arduino START OK"); // Вывести в апаратный порт "Arduino START OK" mySerial.println("ATZ"); // АТ команда модему "ATZ" (програмный сброс) delay(500); // Пауза 0,5 секунды mySerial_read(); // Читаем ответ модема mySerial.println("AT+CMGDA=\"DEL ALL\""); // АТ команда модему , удалить все сообщения с sim карты delay(500); // Пауза 0,5 секунды mySerial_read(); // Читаем ответ модема mySerial.println("AT+CMGF=1"); // устанавливаем текстовый режим SMS (1 - включить, 0 - отключить) delay(500); // Пауза 0,5 секунды mySerial_read(); // Читаем ответ модема mySerial.println("AT+IFC=0,0"); //настройка SIM900 Serial bufer --- Контроль передачи данных, при "0", оключен обеими delay(500); // Пауза 0,5 секунды mySerial_read(); // Читаем ответ модема mySerial.println("AT+CPBS=\"SM\""); // Получить доступ к телефонной книге расположеной на SIM-карте ??????? ЗАЧЕМ????? delay(500); // Пауза 0,5 секунды mySerial_read(); // Читаем ответ модема //mySerial.print("AT+CNMI=1,2,2,1,0"); ------ ЗАКОМЕНТИРОВАНАЯ СТРОКА АВТОРА----- mySerial.println("AT+CNMI=1,2,0,0,0"); // Включить перехват SMS, перед этой командой должно быть "AT+CMGF=0" - Переход в PDU mode delay(500); // Пауза 0,5 секунды mySerial_read(); // Читаем ответ модема mySerial.print("AT+CMGL="); // Чтение групп SMS mySerial.print((char)34); // передать символ (") mySerial.print("ALL"); // Передать строку -ALL- mySerial.print((char)34); // передать символ (") mySerial.print((char)13); // передать семвол переноса строки delay(300); // Пауза 0,3 секунды mySerial_read(); // Читаем ответ модема /* Вопросы: 1. Зачем получать доступ к телефонной книге? 2. Почему нет команды "AT+CMGF=0" , для перехода в режим PDU (Для передачи русских символов необходимо использовать формат PDU) 3. Почему в последнем абзаце нельзя использовать mySerial.println "AT+CMGL=\"ALL\"" , вместо такой сложной конструкции. */ } // Конец функции "setup" void loop() // Вторая обязательная функция, работает по циклу непрерывно с момента подачи питания { // Начало функции "loop" if (timer < millis()) // Если переменная "timer" меньше чем время работы программы, тогда: { // Начало первого условия timer = millis()+600000; // Присвоить переменной "timer" значение , время работы программы плюс 600 тысяч. delay(2000); // Пауза 2 секунды pinMode(13, OUTPUT); // Установить 13 пин как выход digitalWrite(13,HIGH); // установить на нём высокий уровень (5 вольт) delay(500); // Пауза 0,5 секунды digitalWrite(13,LOW); // Установить на 13 пине низкий уровень (0 вольт) mySerial.println("AT"); // Передать в програмный серийный порт команду "АТ" (Иницилизация модема) delay(200); // Пауза 0,2 секунды rep = (String)mySerial.read(); // Создать переменную "rep", присвоив ей значение, типа "строка", // считаное из програмного серийного порта //Serial.println(rep); ------ ЗАКОМЕНТИРОВАНАЯ СТРОКА АВТОРА----- if (rep == "65") // Если переменная "rep" равна 65 (В таблице ASCII это символ "А") { // начало второго условия Serial.println("GPRS module is OK"); //то передать в серийный порт "GPRS module is OK" } else // Иначе (второго условия) { powerUp(); // Выполнить функцию "powerUp" (Код которой находится ниже) } // конец второго условия } // Конец первого условия , отсуствует иначе, значит продолжаем дальше по коду. mySerial_read(); // Считать один байт из програмного серийного порта Serial_read(); // Считать один байт с апаратного серийного порта if (Serial.available()) // Если в буфере апаратного серийного порта не пустой, то Serial.println(mySerial.read()); //Передать в апаратный серийный порт вместе с спецсимволами, // переноса и новой строки, значение с програмного серийного порта. Иначе, дальше по коду. if (mySerial.available()) // Если в буфере програмного серийного порта не пустой, то return; // Прервать выполнение функции и вернуться ??? char currSymb = mySerial.read(); // Создать переменную "currSymb" размером в 1 байт и записать её значение как // значение считаное из програмного серийного порта. if ('\r' == currSymb) // Если переменная "currSymb" имеет значение "\r", то: { // начало Условия 1 if (isStringMessage) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом -- // ---- КОМЕНТАРИЙ АВТОРА----- { // Начало второго условия if (!currStr.compareTo("1 on")) { // Не нашёл описания команды "currStr.compareTo" :( digitalWrite(power1, HIGH); Serial.println("power 1 is ON"); } else if (!currStr.compareTo("1 off")) { digitalWrite(power1, LOW); } else if (!currStr.compareTo("2 on")) { digitalWrite(power2, HIGH); } else if (!currStr.compareTo("2 off")) { digitalWrite(power2, LOW); } else if (!currStr.compareTo("3 on")) { digitalWrite(power3, HIGH); } else if (!currStr.compareTo("3 off")) { digitalWrite(power3, LOW); } else if (!currStr.compareTo("4 on")) { digitalWrite(power4, HIGH); } else if (!currStr.compareTo("4 off")) { digitalWrite(power4, LOW); } else if (!currStr.compareTo("5 on")) { digitalWrite(power5, HIGH); } else if (!currStr.compareTo("5 off")) { digitalWrite(power5, LOW); } isStringMessage = false; } else { // Иначе if (currStr.startsWith("+CMT")) //если текущая строка начинается с "+CMT", //то следующая строка является сообщением { isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } } void send_sms(String sms_number,String sms_text) // Функция "send_sms" Где она используется я так и не нашёл. { delay(1500); mySerial.print("AT+CMGS="); mySerial.print((char)34); mySerial.print((String)sms_number); mySerial.print((char)13); delay(1500); mySerial.println((String)sms_text); delay(500); mySerial.print((char)26); mySerial.print((char)13); delay(1000); } void dial(String number) // Функция "dial" Где она используется я так и не нашёл. { delay(1000); mySerial.print("ATD"); mySerial.println((String)number); delay(500); } void powerUp() // Функция "powerUp" { pinMode(6, OUTPUT); digitalWrite(6,LOW); delay(1000); digitalWrite(6,HIGH); delay(2000); digitalWrite(6,LOW); delay(3000); } void powerDown() // Функция "powerDown" Где она используется я так и не нашёл. { pinMode(6, OUTPUT); digitalWrite(6,LOW); delay(1000); digitalWrite(6,HIGH); delay(2000); digitalWrite(6,LOW); delay(3000); } void mySerial_read() // Функция "mySerial_read" для считывания буфера програмного серийного порта. { int i=0; // Начальное значение переменной "i" утанавливаем как ноль. char buffer[200]; // Создать переменную "buffer", символьного типа размером 200 байт if(mySerial.available()){ // Первое условие: Если в буфере програмного серийного порта есть данные, то: delay(100); // Пауза 0,1 секунды while( mySerial.available() && i< 199) // Начало цикла с продалжением пока "i" меньше или равно 199 { buffer[i++] = mySerial.read(); //Считать в переменную "buffer[i++]" очередной байт с програмного серийного порта // и увеличить значение "i" на одну единицу. } // Конец цыкла buffer[i++]='\0' ; // Присвоить переменной "buffer[i++]" значение '\0' --- ? Что это? } // Конец первого условия. if(i>0) // Условие, если "i" больше нуля, то: { Serial.println(buffer); // Передать в апаратный серийный порт значение переменной "buffer" // с конечным символом перевода корретки. } // Конец условия } // Конец функции void Serial_read() // Функция "Serial_read" для считывания буфера апаратного серийного порта. { int a=0; // Начальное значение переменной "а" утанавливаем как ноль. char buffer2[200]; // Создать переменную "buffer2", символьного типа размером 200 байт if(Serial.available()) // Первое условие: Если в буфере програмного серийного порта есть данные, то: { delay(100); // Пауза 0,1 секунды while( Serial.available() && a< 199) // Начало цикла с продалжением пока "а" меньше или равно 199 { buffer2[a++] = Serial.read(); //Считать в переменную "buffer[i++]" очередной байт с програмного серийного порта // и увеличить значение "i" на одну единицу. } // Конец цыкла buffer2[a++]='\0'; // Присвоить переменной "buffer2[а++]" значение '\0' --- ? Что это? } // Конец первого условия. if(a>0) //if buffer full ---- коментарий автора--- мой комент -- Условие, если "а" больше нуля, то: { mySerial.println(buffer2); // Передать в програмный серийный порт значение переменной "buffer2" // с конечным символом перевода корретки. } } void(* resetFunc) (void) = 0; // Reset MC function - resetFunc(); //вызов --- Вообще не понял что это? // Дальше мне кажется не хватает остального кода..Прошу прокоментировать мои ошибки.
Уже сейчас видно что в коде есть функции, которые не используются.
Попробую теперь описать алгоритм работы этого скетча. Далее будет..
Скажите, а если с модулем гсм который на 3.7-4в напряжения рассчитан, использовать ардуино про мини на 3.3В, но питать от общего источника 4В - ,такой варант прокатит, какие подводные камни могут быть?
Вы не написали, мощность "общего источника" , GSM модулю часто в пике нужен ток от 0,8 до 2 Ампер, посмотрите спецификацию своего модуля, что касается Ардуино Про Мини, то в моей книги В.Петин "Проекты с использованием контролера Arduino" указано:
Входное напряжение - 3,35-12 В (модель 3,3 В) или 5-12 (модель 5 В).
Так что 4 вольта вполне, главное что-бы просадки по питанию ниже 3,35 не было в моменты пикового потребления GSM модуля.
мощность - батарея литийионная, ее напряжение 3,7-4,2В. современные модули гсм до 4,5В держат.
я имел ввиду - выбросить родной стабилизатор 3,3в в ардуино мини, и питать все от 4В от аккума.
1. У батареи есть тоже граничный ток, который она может отдать...
2. Современные это в каком диапозоне времени? На данный момент наверное есть сотни модулей впущенных скажем за год на текущий момент, которые так или иначе можно подключить к ардуинке, а если взять те что раньше, то вообще... Повторяю ещё раз нужно смотреть спецификацию, а для этого нужно писать конкретнее что за модуль, да и вообще хоть фото, если не знаете.
3. Не самый лучший вариант выбросить стабилизатор, он хоть и понапрасно расходует электропитание, но он и защищает ибо в ардуине стоит микроконтролер ATmega168 и судя по даташиту, там уже не такой широкий диапозон допустимых напряжений. Поэтому если цель оптимизация питания, лучше присмотреться к другим вариантам. Я встречал модули где вопрос подключения литиевого акб уже решён, обеспечивая полноценную зарядку и правильную разрядку таких батарей.
выбросить стабилизатор - думаю самый лучший вариант выровнять напряжение.
сим-800 если не ошибаюсь - до 4,5в.
рабочее напр. л.ион. акк. - 4В.
Подскажите пожалуйста на GSM Shield EFcomвозможно запустить данный скетч? Нужна СМС розетка, управляемая реле, примеров найти немогу...
Подскажите пожалуйста на GSM Shield EFcomвозможно запустить данный скетч?
Возможно.
Есть только один нюанс - обычно, чтобы запустить более-менее сложный скетч, нужно понимать, что делаешь...
Нужна СМС розетка, управляемая реле ...
точно не наоборот?
Ищите мою тему на этом форуме про шилд на sim900.
Нужна СМС розетка, управляемая реле ...
точно не наоборот?
Прошу прощения, наоборот )))
Нашел пример, управления светодиодами по sms, переделал под реле, вроде работает.
Добавил еще програмное включение шилда EFcom.
Позже напишу пример.
Простой пример управления 2-мя реле (розеткой):
#include <SoftwareSerial.h> SoftwareSerial gprsSerial(2, 3); int powerGSM = 6; // Пин включения GSM int unit1 = 8; // Пин включения реле №1 int unit2 = 9; // Пин включения реле №2 void setup() { digitalWrite(powerGSM, HIGH); // Включаю GSM модуль delay(1000); digitalWrite(powerGSM, LOW); delay(5000); gprsSerial.begin(19200); delay(300); pinMode(unit1, OUTPUT); pinMode(unit2, OUTPUT); // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку gprsSerial.print("AT+CMGF=1\r"); delay(300); gprsSerial.print("AT+IFC=1, 1\r"); delay(300); gprsSerial.print("AT+CPBS=\"SM\"\r"); delay(300); gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); delay(500); } String currStr = ""; // Переменная принимает значение True, если текущая строка является сообщением boolean isStringMessage = false; void loop() { if (!gprsSerial.available()) return; char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("unit1 on")) { digitalWrite(unit1, HIGH); } else if (!currStr.compareTo("unit1 off")) { digitalWrite(unit1, LOW); } else if (!currStr.compareTo("unit2 on")) { digitalWrite(unit2, HIGH); } else if (!currStr.compareTo("unit2 off")) { digitalWrite(unit2, LOW); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } }Подскажите как организовать ответы на команды, допустим отправил команду unit1 on, в ответ получил СМС "Розетка №1 - On"? Или Status - "Розетка №1 - On, Розетка №2 - Off", Balance - ответ "100 руб."
Скетч приведенный в примере (в моём с моими коментариями) не рабочий!!!
Скетч постом выше не проверял, но как помне в нем например:
1. Нет блока с проверкой состояния GPRS shild и автоперезагрузкой в случае отсуствия ответа...
2. Отсуствует реакция на звонок...
3. Нельзя определить удалённо его состояние...
4. Нет програмной инициализации, при включении, а значит, при кратковременном сбое питания, GPRS модуль не заведётся и будет ждать нажатия на кнопку...
Да и вообще, помоему он взят из стандартного примера, которые есть в штатной среде разработки Arduino..
4. Нет програмной инициализации, при включении, а значит, при кратковременном сбое питания, GPRS модуль не заведётся и будет ждать нажатия на кнопку...
int powerGSM = 6; // Пин включения GSM ...... digitalWrite(powerGSM, HIGH); // Включаю GSM модуль delay(1000); digitalWrite(powerGSM, LOW); delay(5000); gprsSerial.begin(19200); delay(300);При сбое питания GPRS модуль включится програмно.
Что касается остального, я бы и сам хотел это узнать, как добавить это в код.
Не поделитесь идеями на тему, нафига такая розетка может понадобиться?
[quote=fiftelement]
Простой пример управления 2-мя реле (розеткой):
#include <SoftwareSerial.h> SoftwareSerial gprsSerial(2, 3); int powerGSM = 6; // Пин включения GSM int unit1 = 8; // Пин включения реле №1 int unit2 = 9; // Пин включения реле №2 void setup() { digitalWrite(powerGSM, HIGH); // Включаю GSM модуль delay(1000); digitalWrite(powerGSM, LOW); delay(5000); gprsSerial.begin(19200); delay(300); pinMode(unit1, OUTPUT); pinMode(unit2, OUTPUT); // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку gprsSerial.print("AT+CMGF=1\r"); delay(300); gprsSerial.print("AT+IFC=1, 1\r"); delay(300); gprsSerial.print("AT+CPBS=\"SM\"\r"); delay(300); gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); delay(500); } String currStr = ""; // Переменная принимает значение True, если текущая строка является сообщением boolean isStringMessage = false; void loop() { if (!gprsSerial.available()) return; char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("unit1 on")) { digitalWrite(unit1, HIGH); } else if (!currStr.compareTo("unit1 off")) { digitalWrite(unit1, LOW); } else if (!currStr.compareTo("unit2 on")) { digitalWrite(unit2, HIGH); } else if (!currStr.compareTo("unit2 off")) { digitalWrite(unit2, LOW); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } }Подскажите как организовать ответы на команды, допустим отправил команду unit1 on, в ответ получил СМС "Розетка №1 - On"? Или Status - "Розетка №1 - On, Розетка №2 - Off", Balance - ответ "100 руб."
[/quote ]
Не искали по форуму.. (( http://arduino.ru/forumprogrammirovanie/pomogite-novichku-dopisat-kod#co...
Вот есть пример http://wiki.amperka.ru/projects:smart-power
Как переделать скетч под управление АТ-командами, вместо библиотеки GPRS_Shield_Arduino.h
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // библиотека для эмуляции Serial порта // она нужна для работы библиотеки GPRS_Shield_Arduino #include <SoftwareSerial.h> // длина сообщения #define MESSAGE_LENGTH 160 // текст сообщения о включении розетки #define MESSAGE_ON "Power is On" // текст сообщения о выключении розетки #define MESSAGE_OFF "Power is Off" // текст сообщения об ошибке распознавания команды #define MESSAGE_ERROR "Error...unknown command!" // пин, к которому подключено реле #define RELAY 5 // номер сообщения в памяти сим-карты int messageIndex = 0; // текст сообщения char message[MESSAGE_LENGTH]; // номер, с которого пришло сообщение char phone[16]; // дата отправки сообщения char datetime[24]; bool stateRelay = false; // создаём объект класса GPRS и передаём ему скорость 9600 бод; // с помощью него будем давать команды GPRS шилду GPRS gprs(9600); void setup() { // настраиваем пин реле в режим выхода, pinMode(RELAY, OUTPUT); // подаём на пин реле «низкий уровень» (размыкаем реле) digitalWrite(RELAY, LOW); // включаем GPRS-шилд gprs.powerUpDown(); // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); while (!Serial) { // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе } // проверяем, есть ли связь с GPRS-устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке; // процесс повторяется в цикле, // пока не появится ответ от GPRS устройства delay(1000); Serial.print("Init error\r\n"); } // вывод об удачной инициализации GPRS Shield Serial.println("GPRS init success"); } void loop() { // проверяем наличие непрочитанных сообщений // и находим их номер в памяти сим-карты messageIndex = gprs.isSMSunread(); if (messageIndex > 0) { // если есть хотя бы одно непрочитанное сообщение, // читаем его gprs.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime); // Удаляем прочитанное сообщение из памяти Сим-карты gprs.deleteSMS(messageIndex); // выводим номер, с которого пришло смс Serial.print("From number: "); Serial.println(phone); // выводим дату, когда пришло смс Serial.print("Datetime: "); Serial.println(datetime); // выводим текст сообщения Serial.print("Recieved Message: "); Serial.println(message); // вызываем функцию изменения состояния реле // в зависимости от текста сообщения setRelay(phone, message); } } void setRelay(char f_phone[], char f_message[]) { if (strcmp(f_message, "On") == 0) { // если сообщение — с текстом «On», // выводим сообщение в Serial // и подаём на замыкаем реле Serial.println("OK! Power On"); digitalWrite(RELAY, HIGH); stateRelay = true; // на номер, с которого пришёл запрос, // отправляем смс с текстом о включении питания gprs.sendSMS(f_phone, MESSAGE_ON); } else if (strcmp(f_message, "Off") == 0) { // если пришло сообщение с текстом «Off», // выводим сообщение в Serial // и размыкаем реле Serial.println("OK! Power Off"); digitalWrite(RELAY, LOW); stateRelay = false; // на номер, с которого пришёл запрос // отправляем смс с текстом о выключении питания gprs.sendSMS(f_phone, MESSAGE_OFF); } else if (strcmp(f_message, "State") == 0) { // если пришло сообщение с текстом «State», // отправляем сообщение с состоянием реле if (stateRelay) { Serial.println("State: Power On"); gprs.sendSMS(f_phone, MESSAGE_ON); } else { Serial.println("State: Power Off"); gprs.sendSMS(f_phone, MESSAGE_OFF); } } else { // если сообщение содержит неизвестный текст, // отправляем сообщение с текстом об ошибке Serial.println("Error... unknown command!"); gprs.sendSMS(f_phone, MESSAGE_ERROR); } }Не поделитесь идеями на тему, нафига такая розетка может понадобиться?
Нужно удаленное управление питанием WiMAX станции, чтобы была возможность отключить оборудование во время грозы, статики боится. )))
Нужно удаленное управление питанием WiMAX станции, чтобы была возможность отключить оборудование во время грозы, статики боится. )))
сейчас сделали смешно... после покупки WiMax станции не осталось денег на готовые решения?.. обязательно нужно колхозить? как в анекдоте
Бизнес по-московски:
- Андрей, тебе нужно завтра в 8 утра быть на объекте, послезавтра сдача проекта.
- Завтра воскресенье. Я болею, у меня температура.
- Там многомиллиардный проект, на открытие приедут первые лица государства!!! При неисполнении контракта мы попадаем на многомиллионный штраф!!!
- Хорошо. Я возьму такси и приеду. Приблизительно тысяча рублей понадобится.
- А общественным транспортом никак не сможешь добраться? Я не могу согласовать расход на такую сумму.
Нужно удаленное управление питанием WiMAX станции, чтобы была возможность отключить оборудование во время грозы, статики боится. )))
сейчас сделали смешно... после покупки WiMax станции не осталось денег на готовые решения?.. обязательно нужно колхозить? как в анекдоте
Бизнес по-московски:
- Андрей, тебе нужно завтра в 8 утра быть на объекте, послезавтра сдача проекта.
- Завтра воскресенье. Я болею, у меня температура.
- Там многомиллиардный проект, на открытие приедут первые лица государства!!! При неисполнении контракта мы попадаем на многомиллионный штраф!!!
- Хорошо. Я возьму такси и приеду. Приблизительно тысяча рублей понадобится.
- А общественным транспортом никак не сможешь добраться? Я не могу согласовать расход на такую сумму.
Для личных целей, это не бизнес. Просто Интернет передаю по радиоканалу из точки А в точку Б.
Еле наскреб на оборудование...
хммм. а чем обычный WIFI не устраивал? с направлеными антенами в прямой видимости километров 10 уверено работает...
Обсуждение WiFi и WiMax в другую ветку, не засоряйте мою тему! Тем более анекдотами.
Обсуждение WiFi и WiMax в другую ветку, не засоряйте мою тему! Тем более анекдотами.
О.о вы тут ничего не попутали? За четкими ответами идите в гугл, пусть он вам и помогает!
Не поделитесь идеями на тему, нафига такая розетка может понадобиться?
Нужно удаленное управление питанием WiMAX станции, чтобы была возможность отключить оборудование во время грозы, статики боится. )))
заблуждение, во время грозы нужно вынимать шнур из 220в и отключать самое главное - антенну..
бывает конечно висяк нужно перезагрузить - это другое дело.
заблуждение, во время грозы нужно вынимать шнур из 220в и отключать самое главное - антенну..
бывает конечно висяк нужно перезагрузить - это другое дело.
вот у меня тоже было такое подозрение что реле отрубающее фазу по питанию, тут как бы не поможет нифига..
cheniya-konditsionera-ID75eUX.html#03701e522f это как раз то устройство, что я создаю, по конструкции абсолютно видно что оно не заводского изготовления , вдумайтесь за 110 $ И это при том что ардуинку+GPRS Shild+ рыле можно купить за приблезительно 10 баксов.
я тоже особо впечатляюсь когда вижу что мерс стоит наамного дороже волги..
волга - китайская розетка, мерс - то что вы видите качественно сделанным на 2 розетки, и там внутри наверняка полноценный модуль сим900 или телтоника, и т.д. насколько сталкивался - работает в разы надежнее "волги".
но вы можете сделать "велосипед" с торчащими во все стороны проводками и прочим.. но будет стоить дешевле, это факт, ваше время наверное бесплатно.
я тоже особо впечатляюсь когда вижу что мерс стоит наамного дороже волги..
волга - китайская розетка, мерс - то что вы видите качественно сделанным на 2 розетки, и там внутри наверняка полноценный модуль сим900 или телтоника, и т.д. насколько сталкивался - работает в разы надежнее "волги".
но вы можете сделать "велосипед" с торчащими во все стороны проводками и прочим.. но будет стоить дешевле, это факт, ваше время наверное бесплатно.
да пофигу на цены.. в чем смысл реального применения подобного убожества?
перезагрузка роутеров, банкоматов, платежных автоматов и прочего-прочего-прочего..
ездить дороже и проблемнее(пока даедешь..), чем удаленно перезагрузить прибор который приносит хорошую прибыль, окупается.
перезагрузка роутеров, банкоматов, платежных автоматов и прочего-прочего-прочего..
ездить дороже и проблемнее(пока даедешь..), чем удаленно перезагрузить прибор который приносит хорошую прибыль, окупается.
дык предполагается что там есть интернет.. нафига городить СМС и прочее?
интернет который завис? ну-ну..
интернет который завис? ну-ну..
странно все это. года 4 стоит раутер на входе в дом ( ну как 4 года назад оптику приволокли)... не приходилось ниразу его перезагружать за это время... а до этого DSL стоял тот за 10 лет перезагружался может раза 2...
ну и хорошо, дешевіе банкоматі и прочее - виснут ого как..
ну и хорошо, дешевіе банкоматі и прочее - виснут ого как..
сначало экономим, а потом сооружаем костылики и тратим деньги на их поддержку... кто то реально не умеет считать деньги...
Тема называется "
SMS розетка (аналог SenseIt GS1\ МегаФон розетка) своими руками на Arduino
"
Обсуждение WiFi и WiMax в другую ветку !!!!!!!!!!!!!
Тема называется "
SMS розетка (аналог SenseIt GS1\ МегаФон розетка) своими руками на Arduino
"
Обсуждение WiFi и WiMax в другую ветку !!!!!!!!!!!!!
Истерики закатывай маме в магазине.
Тема называется "
SMS розетка (аналог SenseIt GS1\ МегаФон розетка) своими руками на Arduino
"
Обсуждение WiFi и WiMax в другую ветку !!!!!!!!!!!!!
Ты вроде нормальный человек? Тебя вежливо попросили писать по теме или создать свою, а ты вместо этого разводишь здесь флуд и позволяешь себе тыкать и переходить на личности. Тебе что заняться нечем?
Мы нормально обсуждаем практическое применение подобных девайсов.. Влетает нечто нервное и в истеричной форме заявляет что это его личное пространство и не сметь тут даже думать.. интересно оно нломальное? Или может к доктору его?
Это не "личное пространство", это тема для обсуждения конкретного устройства, в котором вайфаем и не пахнет, Вы же устроили с неё базар, приэтом когда Вам делают замечание, Вы опускаетесь ниже плинтуса, но похоже что Вы просто дебил и вступать с Вами в дискусию нет смысла. Ищите себе подобных дебиловатых, безпардонных моральных уродов и сними дескутируйте, а у меня на Вас нет ни желания, ни времени.
Это не "личное пространство", это тема для обсуждения конкретного устройства, в котором вайфаем и не пахнет, Вы же устроили с неё базар, приэтом когда Вам делают замечание, Вы опускаетесь ниже плинтуса, но похоже что Вы просто дебил и вступать с Вами в дискусию нет смысла. Ищите себе подобных дебиловатых, безпардонных моральных уродов и сними дескутируйте, а у меня на Вас нет ни желания, ни времени.
Простите,(за флуд не в тему) не сдержался, впервые, но я +++++++++++++++++++++++++ этот комент.
Фигасе вы тут нафлудили... Я и забыл уже что канткулы у детей начались. И как трепетно дети относятся к своим темам.
хотите написать какой я негодяй, заведите отдельную тему. И там меня обсуждайте. Хотя вроде-бы где то была такая уже.
заместо коротенького обсуждения га тему использования родобных модулей. Устроили тут моё аутодафе.
так что с розеткой и приемом смс для управлению релюхой?
есть рабочий код не под библиотеку?