Навскидку, можно попробовать прикрутить такого малыша, обмениваются с основным МК, скажем, 1 раз в минуту сообщениями. Если сообщение не пришло, малыш кратковременно щелкает релюшкой.
Блин.. устройство на устройстве и устройством погоняет.. А если малыш зависнет? Не.. не вариант. Мне кажется SIM900 должна такие вещи уметь..
Думаю, не прокатит. Предположим, SIM900 имеет такую команду. Но вот вопрос - кто будет извлекать эту команду из СМС? Кто будет проверять , что СМС пришло от нужного номера? Как SIM900 догадается, на какое время включать пин?
Это я все к тому. что кроме просто возможности включения пина, в модеме должен быть некий "язык программирования" со своими командами, почти как в ардуине. Не думаю, что он там есть. Но проверить-то просто - найдите подробный даташит по SIM900 и почитайте. Если такие команды есть - они будут в даташите.
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(7,8);int btnPin =12;
boolean prevBtn = LOW;void setup(){
gprsSerial.begin(19200);
delay(500);}void loop(){
boolean currBtn = digitalRead(btnPin);if(prevBtn != currBtn && currBtn == HIGH){//сразу после нажатия кнопки отправляем "тревожное" сообщение по заданному номеру
sendTextMessage();}
prevBtn = currBtn;}/*
* Функция отправки SMS-сообщения
*/void sendTextMessage(){// Устанавливает текстовый режим для SMS-сообщений
gprsSerial.print("AT+CMGF=1\r");
delay(100);// даём время на усваивание команды// Устанавливаем адресата: телефонный номер в международном формате
gprsSerial.println("AT + CMGS = \"+79031034423\"");
delay(100);// Пишем текст сообщения
gprsSerial.println("ALARM!");
delay(100);// Отправляем Ctrl+Z, обозначая, что сообщение готово
gprsSerial.println((char)26);}
А вот Управление светодиодами с помощью SMS
скетч
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(7,8);//для зелёного светодиода будем использовать второй цифровой вход,//а для жёлтого - третийint greenPin =2;int yellowPin =3;void setup(){
gprsSerial.begin(19200);
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, 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("Green on")){
digitalWrite(greenPin, HIGH);}elseif(!currStr.compareTo("Green off")){
digitalWrite(greenPin, LOW);}elseif(!currStr.compareTo("Yellow on")){
digitalWrite(yellowPin, HIGH);}elseif(!currStr.compareTo("Yellow off")){
digitalWrite(yellowPin, LOW);}
isStringMessage =false;}else{if(currStr.startsWith("+CMT")){//если текущая строка начинается с "+CMT",//то следующая строка является сообщением
isStringMessage =true;}}
currStr ="";}elseif('\n'!= currSymb){
currStr += String(currSymb);}}
нет питания на 2м и 3м пине при отправке смс с текстом "Green on" или "Yellow on"
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(7, 8);
//для зелёного светодиода будем использовать второй цифровой вход,
//а для жёлтого - третий
int greenPin = 2;
int yellowPin = 3;
void setup()
{
gprsSerial.begin(19200);
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, 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("Green on")) {
digitalWrite(greenPin, HIGH);
} else if (!currStr.compareTo("Green off")) {
digitalWrite(greenPin, LOW);
} else if (!currStr.compareTo("Yellow on")) {
digitalWrite(yellowPin, HIGH);
} else if (!currStr.compareTo("Yellow off")) {
digitalWrite(yellowPin, LOW);
}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}
Ребята я просто заливаю этот скетч и посылаю смс "Green on" или "Yellow on" а вот на 3м и 2м пине не получаю питания,не пойму что делаю не так. Замер произвожу мультиметром соответственно на GND и пинах 2 и 3
Помогите пожалуйста вот с этим скетчам,хочу чтобы по звонку включать и выключать реле. У меня уно.На какие мне пины содить реле?
Скорость порта поменяю на 19200,номер как то тут не так забит вроде?
//#include <SoftwareSerial.h> // если программный
//SoftwareSerial gsm(7, 8); // RX, TX
//#define gsm Serial // если аппаратный в UNO
#define gsm Serial1 // если аппаратный в леонардо
#define LED 13
#define TELMODE "70001112233" // !! номер с которого принимаем команду
#define relay A2 // !! выход на реле
#define pinBOOT 9 // нога BOOT или K на модеме M590, на SIM900 это 9
/////////////////////////
void setup() {
delay(1000); //// !! чтобы нечего не повисало при включении
gsm.begin(9600); /// незабываем указать скорость работы UART модема
//Serial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(pinBOOT, OUTPUT); /// нога BOOT на модеме
pinMode(relay, OUTPUT); /// нога для реле
delay(1000);
digitalWrite(LED, HIGH); // включаем лед
///// включаем модем,
gsm.println("AT"); // смотрим есть ли ответ от модема
delay(100);
if (!gsm.find("OK")){ // если нет, дергаем ногу включения
digitalWrite(pinBOOT, HIGH);
delay(1000);
digitalWrite(pinBOOT, LOW);
}
// нужно дождатся включения модема и соединения с сетью
delay(2000);
gsm.println("ATE0"); // выключаем эхо
while(1){ // ждем подключение модема к сети
gsm.println("AT+COPS?");
if (gsm.find("+COPS: 0")) break;
digitalWrite(LED, LOW); // блымаем светодиодом
delay(50);
digitalWrite(LED, HIGH);
delay(500);
}
//Serial.println("Modem OK");
digitalWrite(LED, LOW); // блымаем светодиодом
delay(1500);
digitalWrite(LED, HIGH);
delay(250);
digitalWrite(LED, LOW);
}
void loop() {
if(gsm.find("RING")){ // если нашли RING
while(1){ // в цикле
if (gsm.find(TELMODE)){ // ищим номер телефона, если нашли
digitalWrite(relay, !digitalRead(relay)); // переключаем реле
//Serial.print("relay:");
//Serial.println(digitalRead(relay));
break; // и выходим
}
else{ // иначе
gsm.println("AT+CPAS"); // спрашиваем состояние модема
delay(50);
if (gsm.find("+CPAS: 0")) break; // и если он в "готовности", выходим из цикла
// если звонок в процессе, возвращает +CPAS: 3
gsm.println("AT+CLCC"); // даем команду для АОН, нужно для SIM900
// и крутимся дальше
}
}
gsm.println("ATH0"); // сбрасываем вызов
digitalWrite(LED, LOW); // сигнализируем об этом
delay(500);
digitalWrite(LED, HIGH);
delay(250);
digitalWrite(LED, LOW);
}
}
Не могу прикрутить к этому скетчу что бы включить модуль программно! выдаёт ошибку
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(7, 8);
//для зелёного светодиода будем использовать второй цифровой вход,
//а для жёлтого - третий
int nasos1Pin = 2;
int nasos2Pin = 3;
void setup()
{
gprsSerial.begin(19200);
pinMode(nasos1Pin, OUTPUT);
pinMode(nasos2Pin, 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("Nasos1 on")) {
digitalWrite(nasos1Pin, HIGH);
} else if (!currStr.compareTo("Nasos1 off")) {
digitalWrite(nasos1Pin, LOW);
} else if (!currStr.compareTo("Nasos2 on")) {
digitalWrite(nasos2Pin, HIGH);
} else if (!currStr.compareTo("Nasos2 off")) {
digitalWrite(nasos2Pin, LOW);
}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}
Прикрутить надо вот это
void setup()
{
//Включаем GPRS Shield, эмулируя нажатие кнопки POWER
pinMode(9, OUTPUT);
digitalWrite(9, HIGH); // Подаем High на пин 9
delay(3000); // на 3 секунды
digitalWrite(9, LOW); // и отпускаем в Low.
delay(5000); // Ждём 5 секунд для старта шилда
}
void loop()
{
//Пока ничего больше не делаем
}
ОШИБКА ВОТ
C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino: In function 'void setup()':
sketch_cmc_works:65: error: redefinition of 'void setup()'
void setup()
^
C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino:10:6: note: 'void setup()' previously defined here
void setup()
^
C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino: In function 'void loop()':
sketch_cmc_works:74: error: redefinition of 'void loop()'
void loop()
^
C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino:32:6: note: 'void loop()' previously defined here
Не могу прикрутить к этому скетчу что бы включить модуль программно! выдаёт ошибку
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(7, 8);
//для зелёного светодиода будем использовать второй цифровой вход,
//а для жёлтого - третий
int nasos1Pin = 2;
int nasos2Pin = 3;
void setup()
{
gprsSerial.begin(19200);
pinMode(nasos1Pin, OUTPUT);
pinMode(nasos2Pin, 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("Nasos1 on")) {
digitalWrite(nasos1Pin, HIGH);
} else if (!currStr.compareTo("Nasos1 off")) {
digitalWrite(nasos1Pin, LOW);
} else if (!currStr.compareTo("Nasos2 on")) {
digitalWrite(nasos2Pin, HIGH);
} else if (!currStr.compareTo("Nasos2 off")) {
digitalWrite(nasos2Pin, LOW);
}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}
Прикрутить надо вот это
void setup()
{
//Включаем GPRS Shield, эмулируя нажатие кнопки POWER
pinMode(9, OUTPUT);
digitalWrite(9, HIGH); // Подаем High на пин 9
delay(3000); // на 3 секунды
digitalWrite(9, LOW); // и отпускаем в Low.
delay(5000); // Ждём 5 секунд для старта шилда
}
void loop()
{
//Пока ничего больше не делаем
}
ОШИБКА ВОТ
C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino: In function 'void setup()':
sketch_cmc_works:65: error: redefinition of 'void setup()'
void setup()
^
C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino:10:6: note: 'void setup()' previously defined here
void setup()
^
C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino: In function 'void loop()':
sketch_cmc_works:74: error: redefinition of 'void loop()'
void loop()
^
C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino:32:6: note: 'void loop()' previously defined here
Да бог с ним с этим пином. Реакция не меняется если я убираю совсем управление 9 пином и руками нажимаю кнопку. Сообщение все-равно не шлется. Мне кажется проблема в отправке команды или в самом шилде. На всех видео он после включения и нажатия на кнопку должен включать два светодиода Status и NetLight. Status должен оставаться светящимся. NetLight должен подмаргивать время от времени. У меня же во всех ситуациях оба светодиода гаснут спустя примерно 5 секунд. Из этого я делаю вывод что плата или не смогла прочитать симкарту или не смогла с ее помощью войти в сеть. Можно предположить что симка не читаемая. Я перепробовал новых симок штук 5 уже. У всех работников на конторе брал попробовать. Только на старой забытой симке с включенным пинкодом ситуация была иная. Но пина никто уже не помнит. На всех остальных симках с выключенным запросом оба светодиода гасли через 5 секунд.
Уменя такая фигня, буду менять его. Негорит STATUS и с резистором и без и с перемычкой. На комнды не отвечает, как тока не подключал.
Как и все купил этот GSM модуль, оч. долго ковырялся, советы были разные как включать поять..как у меня включилось раскажу:
этот скетч я не придумывал а взял из спицификации. У меня небыл запаян резистор рядом с "С6" мелко не вижу, кто то советовал что мал замкни отверткой пробовал не работало. Нашел дома рещистор на 5.6 кОм МЛТ 0,125 Вт просто его приставил, запустил скетч и он включился!
Схема соеденения такая:
ARDUINO GND -->GSM (желтый J14) ножка по счету 5 от J20 перемычки желтой. (ЭТО ОБЯЗАТЕЛЬНО!!!)
ARDUINO ~9 -->GSM 9 (красный разьем с обратной стороны написано).
void setup()
{
SIM900.begin(19200);
Serial.begin(19200);
powerUp();
}
// Следующий код включения питания подпрограмма для Arduino при
// использовании программного обеспечения Тригера:
void powerUp()
{
pinMode(9, OUTPUT);
digitalWrite(9,LOW);
delay(1000);
digitalWrite(9,HIGH);
delay(2000);
digitalWrite(9,LOW);
delay(3000);
}
void loop()
{
}
// библиотека для работы с GPRS устройством
#include <GPRSk_Shield_Arduino.h>
#include <SoftwareSerial.h>
// длина сообщения
#define MESSAGE_LENGTH 160
// создаём объект mySerial и передаём номера управляющих пинов RX и TX
SoftwareSerial mySerial(6, 7);
// номер сообщения в памяти сим-карты
int messageIndex = 0;
// текст сообщения
char message[MESSAGE_LENGTH];
// номер, с которого пришло сообщение
char phone[16];
// дата отправки сообщения
char datetime[24];
// создаём объект класса GPRS и передаём в него объект mySerial
GPRSk gprs(mySerial);
void setup()
{
// открываем последовательный порт для мониторинга действий в программе
Serial.begin(9600);
// открываем Serial-соединение с GPRS Shield
mySerial.begin(9600);
// ждём пока не откроется монитор последовательного порта
// для того, чтобы отследить все события в программе
while (!Serial) {
}
Serial.print("Serial init OK\r\n");
// включаем GPRS-шилд
gprs.powerOn();
// проверяем, есть ли связь с GPRS-устройством
while (!gprs.init()) {
// если связи нет, ждём 1 секунду
// и выводим сообщение об ошибке;
// процесс повторяется в цикле,
// пока не появится ответ от GPRS-устройства
delay(1000);
Serial.print("GPRS Init error\r\n");
}
// выводим сообщение об удачной инициализации GPRS Shield
Serial.println("GPRS init success");
Serial.println("Please send SMS message to me!");
}
void loop()
{
// если пришло новое сообщение
if (gprs.ifSMSNow()) {
// читаем его
gprs.readSMS(message, phone, datetime);
// выводим номер, с которого пришло смс
Serial.print("From number: ");
Serial.println(phone);
// выводим дату, когда пришло смс
Serial.print("Datetime: ");
Serial.println(datetime);
// выводим текст сообщения
Serial.print("Recieved Message: ");
Serial.println(message);
}
}
/**
Вывод в монитор:
Serial init OK
GPRS init success
Please send SMS message to me!
From number: +79007654321
Datetime: 17/05/07,21:38:00+12
Recieved Message: Hello
*/
/** read SMS, phone and date if getting a SMS message. It changes SMS status to READ
* @param messageIndex SIM position to read
* @param message buffer used to get SMS message
* @param length length of message buffer
* @param phone buffer used to get SMS's sender phone number
* @param datetime buffer used to get SMS's send datetime
* @returns
* true on success
* false on error
*/
void readSMS(char *message, char *phone, char *datetime);
/** read SMS if getting a SMS message
* @param buffer buffer that get from GPRSk module(when getting a SMS, GPRSk module will return a buffer array)
* @param message buffer used to get SMS message
* @param check whether to check phone number(we may only want to read SMS from specified phone number)
* @returns
* true on success
* false on error
*/
bool readSMS(int messageIndex, char *message, int length);
/** delete SMS message on SIM card
* @param index the index number which SMS message will be delete
* @returns
* true on success
* false on error
*/
void readSMS();
bool deleteSMS(int index);
/** call someone
* @param number the phone number which you want to call
* @returns
* true on success
* false on error
*/
Итак, есть еще мысли на эту тему? Может ли шилд управлять своими gpio посредством смс?
https://ru.aliexpress.com/item/Digispark-kickstarter-Micro-development-board-ATTINY85-module-for-Arduino-usb/32584975067.html
Навскидку, можно попробовать прикрутить такого малыша, обмениваются с основным МК, скажем, 1 раз в минуту сообщениями. Если сообщение не пришло, малыш кратковременно щелкает релюшкой.
Блин.. устройство на устройстве и устройством погоняет..
А если малыш зависнет? Не.. не вариант. Мне кажется SIM900 должна такие вещи уметь..
Думаю, не прокатит. Предположим, SIM900 имеет такую команду. Но вот вопрос - кто будет извлекать эту команду из СМС? Кто будет проверять , что СМС пришло от нужного номера? Как SIM900 догадается, на какое время включать пин?
Это я все к тому. что кроме просто возможности включения пина, в модеме должен быть некий "язык программирования" со своими командами, почти как в ардуине. Не думаю, что он там есть. Но проверить-то просто - найдите подробный даташит по SIM900 и почитайте. Если такие команды есть - они будут в даташите.
Я уж тоже подумал про даташит. Язык в модуле есть - АТ команды же он обрабатывает.
YaSerg
Скинь пожалуйста свой проект.
Что именно, сфоткать как подключено?
Да,да сфоткать и распиновку что бы видать да скетч нужен,буду благодарен очень тебе!
Подскажите что делаю не так?
Отправка SMS при нажатии кнопки всё робит
Скетч
А вот Управление светодиодами с помощью SMS
скетч
нет питания на 2м и 3м пине при отправке смс с текстом "Green on" или "Yellow on"
Подскажите что делаю не так?
в первую - очередь - неправильно выкладываете код на форуме
Ну это понятно ,а вот по делу помочь ты сможешь?
А Вы сначала "по делу" код разместите.
Как тут сослаться н строку с определенным номером?
#include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); //для зелёного светодиода будем использовать второй цифровой вход, //а для жёлтого - третий int greenPin = 2; int yellowPin = 3; void setup() { gprsSerial.begin(19200); pinMode(greenPin, OUTPUT); pinMode(yellowPin, 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("Green on")) { digitalWrite(greenPin, HIGH); } else if (!currStr.compareTo("Green off")) { digitalWrite(greenPin, LOW); } else if (!currStr.compareTo("Yellow on")) { digitalWrite(yellowPin, HIGH); } else if (!currStr.compareTo("Yellow off")) { digitalWrite(yellowPin, LOW); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } }Ребята я просто заливаю этот скетч и посылаю смс "Green on" или "Yellow on" а вот на 3м и 2м пине не получаю питания,не пойму что делаю не так. Замер произвожу мультиметром соответственно на GND и пинах 2 и 3
СМС без кавычек посылаешь?
Да и так и без них,головная боль. короче тупая голова ногам покоя не даёт
Поставьте контрольную печать, чтобы проверить, что реально приходит в gprsSerial, и приходит ли вообще.
andriano
Спасибо за совет!
Не знаю что было но факт что всё заработало!!!!
Помогите пожалуйста вот с этим скетчам,хочу чтобы по звонку включать и выключать реле. У меня уно.На какие мне пины содить реле?
Скорость порта поменяю на 19200,номер как то тут не так забит вроде?
//#include <SoftwareSerial.h> // если программный //SoftwareSerial gsm(7, 8); // RX, TX //#define gsm Serial // если аппаратный в UNO #define gsm Serial1 // если аппаратный в леонардо #define LED 13 #define TELMODE "70001112233" // !! номер с которого принимаем команду #define relay A2 // !! выход на реле #define pinBOOT 9 // нога BOOT или K на модеме M590, на SIM900 это 9 ///////////////////////// void setup() { delay(1000); //// !! чтобы нечего не повисало при включении gsm.begin(9600); /// незабываем указать скорость работы UART модема //Serial.begin(9600); pinMode(LED, OUTPUT); pinMode(pinBOOT, OUTPUT); /// нога BOOT на модеме pinMode(relay, OUTPUT); /// нога для реле delay(1000); digitalWrite(LED, HIGH); // включаем лед ///// включаем модем, gsm.println("AT"); // смотрим есть ли ответ от модема delay(100); if (!gsm.find("OK")){ // если нет, дергаем ногу включения digitalWrite(pinBOOT, HIGH); delay(1000); digitalWrite(pinBOOT, LOW); } // нужно дождатся включения модема и соединения с сетью delay(2000); gsm.println("ATE0"); // выключаем эхо while(1){ // ждем подключение модема к сети gsm.println("AT+COPS?"); if (gsm.find("+COPS: 0")) break; digitalWrite(LED, LOW); // блымаем светодиодом delay(50); digitalWrite(LED, HIGH); delay(500); } //Serial.println("Modem OK"); digitalWrite(LED, LOW); // блымаем светодиодом delay(1500); digitalWrite(LED, HIGH); delay(250); digitalWrite(LED, LOW); } void loop() { if(gsm.find("RING")){ // если нашли RING while(1){ // в цикле if (gsm.find(TELMODE)){ // ищим номер телефона, если нашли digitalWrite(relay, !digitalRead(relay)); // переключаем реле //Serial.print("relay:"); //Serial.println(digitalRead(relay)); break; // и выходим } else{ // иначе gsm.println("AT+CPAS"); // спрашиваем состояние модема delay(50); if (gsm.find("+CPAS: 0")) break; // и если он в "готовности", выходим из цикла // если звонок в процессе, возвращает +CPAS: 3 gsm.println("AT+CLCC"); // даем команду для АОН, нужно для SIM900 // и крутимся дальше } } gsm.println("ATH0"); // сбрасываем вызов digitalWrite(LED, LOW); // сигнализируем об этом delay(500); digitalWrite(LED, HIGH); delay(250); digitalWrite(LED, LOW); } }Не могу прикрутить к этому скетчу что бы включить модуль программно! выдаёт ошибку
#include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); //для зелёного светодиода будем использовать второй цифровой вход, //а для жёлтого - третий int nasos1Pin = 2; int nasos2Pin = 3; void setup() { gprsSerial.begin(19200); pinMode(nasos1Pin, OUTPUT); pinMode(nasos2Pin, 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("Nasos1 on")) { digitalWrite(nasos1Pin, HIGH); } else if (!currStr.compareTo("Nasos1 off")) { digitalWrite(nasos1Pin, LOW); } else if (!currStr.compareTo("Nasos2 on")) { digitalWrite(nasos2Pin, HIGH); } else if (!currStr.compareTo("Nasos2 off")) { digitalWrite(nasos2Pin, LOW); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } }Прикрутить надо вот это
void setup() { //Включаем GPRS Shield, эмулируя нажатие кнопки POWER pinMode(9, OUTPUT); digitalWrite(9, HIGH); // Подаем High на пин 9 delay(3000); // на 3 секунды digitalWrite(9, LOW); // и отпускаем в Low. delay(5000); // Ждём 5 секунд для старта шилда } void loop() { //Пока ничего больше не делаем }ОШИБКА ВОТ
Не могу прикрутить к этому скетчу что бы включить модуль программно! выдаёт ошибку
#include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); //для зелёного светодиода будем использовать второй цифровой вход, //а для жёлтого - третий int nasos1Pin = 2; int nasos2Pin = 3; void setup() { gprsSerial.begin(19200); pinMode(nasos1Pin, OUTPUT); pinMode(nasos2Pin, 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("Nasos1 on")) { digitalWrite(nasos1Pin, HIGH); } else if (!currStr.compareTo("Nasos1 off")) { digitalWrite(nasos1Pin, LOW); } else if (!currStr.compareTo("Nasos2 on")) { digitalWrite(nasos2Pin, HIGH); } else if (!currStr.compareTo("Nasos2 off")) { digitalWrite(nasos2Pin, LOW); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } }Прикрутить надо вот это
void setup() { //Включаем GPRS Shield, эмулируя нажатие кнопки POWER pinMode(9, OUTPUT); digitalWrite(9, HIGH); // Подаем High на пин 9 delay(3000); // на 3 секунды digitalWrite(9, LOW); // и отпускаем в Low. delay(5000); // Ждём 5 секунд для старта шилда } void loop() { //Пока ничего больше не делаем }ОШИБКА ВОТ
redefinition - переопределение
не нужно в скетч вставлять 2 раза void setup()
Чёт вроде этого получилось,на исправлял хрен знает что,может что то тут лишнее?
#include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); //для зелёного светодиода будем использовать второй цифровой вход, //а для жёлтого - третий int nasos1Pin = 2; int nasos2Pin = 3; int PWR_KEY = 9; //void Gsm_MakeCall(String phone); //void Gsm_MakeSMS(String phone,String content); void setup() { gprsSerial.begin(19200); digitalWrite(PWR_KEY, LOW); pinMode(PWR_KEY, OUTPUT); pinMode(nasos1Pin, OUTPUT); pinMode(nasos2Pin, OUTPUT); delay(1000); Gsm_Power_On(); delay(10000); //Gsm_Init() // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку 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("Nasos1 on")) { digitalWrite(nasos1Pin, HIGH); } else if (!currStr.compareTo("Nasos1 off")) { digitalWrite(nasos1Pin, LOW); } else if (!currStr.compareTo("Nasos2 on")) { digitalWrite(nasos2Pin, HIGH); } else if (!currStr.compareTo("Nasos2 off")) { digitalWrite(nasos2Pin, LOW); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } } void Gsm_Power_On() { digitalWrite(PWR_KEY, HIGH); // Du chan PWR_KEY len cao it nhat 1s delay(1500); // o day ta de 1,5s digitalWrite(PWR_KEY, LOW); // Du chan PWR_KEY xuong thap delay(100); // cac ban xem trong Hardware designed sim800C de hieu ro hon }НЕ РОБИТ
#include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); //для зелёного светодиода будем использовать второй цифровой вход, //а для жёлтого - третий int nasos1Pin = 2; int nasos2Pin = 3; int power = 9 ; void setup() { gprsSerial.begin(19200); pinMode(nasos1Pin, OUTPUT); pinMode(nasos2Pin, OUTPUT); pinMode(power, OUTPUT); digitalWrite(power,HIGH); //подали питание delay(3000); //на 3At сек digitalWrite(power,LOW); //сняли питание // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку 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("Nasos1 on")) { digitalWrite(nasos1Pin, HIGH); } else if (!currStr.compareTo("Nasos1 off")) { digitalWrite(nasos1Pin, LOW); } else if (!currStr.compareTo("Nasos2 on")) { digitalWrite(nasos2Pin, HIGH); } else if (!currStr.compareTo("Nasos2 off")) { digitalWrite(nasos2Pin, LOW); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } }Проверил,этот РОБИТ!!!
Временами надо отправлять аж по две смс на включение или выключение.
Кто знает в чём причина???
И как прописать в скетче чтобы приходило ответное смс типа "я включила"
И как прописать в скетче чтобы приходило ответное смс типа "я включила"
женится тебе барин надо (с)
Фобия у меня на алименты!
Есть готовый скетч с программным включением,надо дополнить его отчётам по смс вкл и выкл реле.Подскажите кто-нибудь!!!!! Что, куда дополнить.
#include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); int nasos1Pin = 2; int nasos2Pin = 3; int power = 9 ; void setup() { gprsSerial.begin(19200); pinMode(nasos1Pin, OUTPUT); pinMode(nasos2Pin, OUTPUT); pinMode(power, OUTPUT); digitalWrite(power,HIGH); //подали питание delay(3000); //на 3At сек digitalWrite(power,LOW); //сняли питание // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку 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("Nasos1 on")) { digitalWrite(nasos1Pin, HIGH); } else if (!currStr.compareTo("Nasos1 off")) { digitalWrite(nasos1Pin, LOW); } else if (!currStr.compareTo("Nasos2 on")) { digitalWrite(nasos2Pin, HIGH); } else if (!currStr.compareTo("Nasos2 off")) { digitalWrite(nasos2Pin, LOW); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } }ВООБЩЕМ ВОТ ОН!
#include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); int powerGSM = 9; // Пин включения GSM int unit1 = 5; // Пин включения реле №1 void setup() { digitalWrite(powerGSM, HIGH); // Включаю GSM модуль delay(1000); digitalWrite(powerGSM, LOW); delay(5000); gprsSerial.begin(19200); delay(300); pinMode(unit1, 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("On")) { digitalWrite(unit1, HIGH); gprsSerial.println("AT + CMGS = \"+7xxxxxxxx\""); delay(100); gprsSerial.println("Relay is On"); delay(100); gprsSerial.println((char)26); } else if (!currStr.compareTo("Off")) { digitalWrite(unit1, LOW); gprsSerial.println("AT + CMGS = \"+7xxxxxxxx\""); delay(100); gprsSerial.println("Relay is Off"); delay(100); gprsSerial.println((char)26); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } }Да бог с ним с этим пином. Реакция не меняется если я убираю совсем управление 9 пином и руками нажимаю кнопку. Сообщение все-равно не шлется. Мне кажется проблема в отправке команды или в самом шилде. На всех видео он после включения и нажатия на кнопку должен включать два светодиода Status и NetLight. Status должен оставаться светящимся. NetLight должен подмаргивать время от времени. У меня же во всех ситуациях оба светодиода гаснут спустя примерно 5 секунд. Из этого я делаю вывод что плата или не смогла прочитать симкарту или не смогла с ее помощью войти в сеть. Можно предположить что симка не читаемая. Я перепробовал новых симок штук 5 уже. У всех работников на конторе брал попробовать. Только на старой забытой симке с включенным пинкодом ситуация была иная. Но пина никто уже не помнит. На всех остальных симках с выключенным запросом оба светодиода гасли через 5 секунд.
Уменя такая фигня, буду менять его. Негорит STATUS и с резистором и без и с перемычкой. На комнды не отвечает, как тока не подключал.
Я вот такой кусочек нашёл.
Но, как я понимаю, без этого резистора netlight вообще бы не загорался.
Или я не верно читаю?
Без этого резистора NETLENGTH горит!. Авот СТАТУС не горит - причину не знаю пока.
спокойно можно питать от отдельного БП, только при подключении модуля все равно земля нужна вместе с TX и RX
Валер я так понял ты тут самый умный помоги соеденить GSM + UNO 4 дня с утра до вечера ковыряюсь.
Комута на заметку (програмное включение).
Как и все купил этот GSM модуль, оч. долго ковырялся, советы были разные как включать поять..как у меня включилось раскажу:
этот скетч я не придумывал а взял из спицификации. У меня небыл запаян резистор рядом с "С6" мелко не вижу, кто то советовал что мал замкни отверткой пробовал не работало. Нашел дома рещистор на 5.6 кОм МЛТ 0,125 Вт просто его приставил, запустил скетч и он включился!
Схема соеденения такая:
ARDUINO GND -->GSM (желтый J14) ножка по счету 5 от J20 перемычки желтой. (ЭТО ОБЯЗАТЕЛЬНО!!!)
ARDUINO ~9 -->GSM 9 (красный разьем с обратной стороны написано).
void setup() { SIM900.begin(19200); Serial.begin(19200); powerUp(); } // Следующий код включения питания подпрограмма для Arduino при // использовании программного обеспечения Тригера: void powerUp() { pinMode(9, OUTPUT); digitalWrite(9,LOW); delay(1000); digitalWrite(9,HIGH); delay(2000); digitalWrite(9,LOW); delay(3000); } void loop() { }Соединила 9 пин шилда с 9 пином ардуино нано.
R13 сделала перемычку
gprs.powerOn(); /* pinMode(9, OUTPUT); digitalWrite(9,LOW); delay(1000); digitalWrite(9,HIGH); delay(2000); digitalWrite(9,LOW); delay(3000);*/void powerOn(){ pinMode(9, OUTPUT); digitalWrite(9,LOW); delay(1000); digitalWrite(9,HIGH); delay(2000); digitalWrite(9,LOW); delay(3000); }Как Вы написали рабтает, это я пробовала. Смысл от gprs.powerOn() какой?
без понятия, надо видеть весь скетч,
или заглянуть в библиотеку которую вы используете
// библиотека для работы с GPRS устройством #include <GPRSk_Shield_Arduino.h> #include <SoftwareSerial.h> // длина сообщения #define MESSAGE_LENGTH 160 // создаём объект mySerial и передаём номера управляющих пинов RX и TX SoftwareSerial mySerial(6, 7); // номер сообщения в памяти сим-карты int messageIndex = 0; // текст сообщения char message[MESSAGE_LENGTH]; // номер, с которого пришло сообщение char phone[16]; // дата отправки сообщения char datetime[24]; // создаём объект класса GPRS и передаём в него объект mySerial GPRSk gprs(mySerial); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // открываем Serial-соединение с GPRS Shield mySerial.begin(9600); // ждём пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // включаем GPRS-шилд gprs.powerOn(); // проверяем, есть ли связь с GPRS-устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке; // процесс повторяется в цикле, // пока не появится ответ от GPRS-устройства delay(1000); Serial.print("GPRS Init error\r\n"); } // выводим сообщение об удачной инициализации GPRS Shield Serial.println("GPRS init success"); Serial.println("Please send SMS message to me!"); } void loop() { // если пришло новое сообщение if (gprs.ifSMSNow()) { // читаем его gprs.readSMS(message, phone, datetime); // выводим номер, с которого пришло смс Serial.print("From number: "); Serial.println(phone); // выводим дату, когда пришло смс Serial.print("Datetime: "); Serial.println(datetime); // выводим текст сообщения Serial.print("Recieved Message: "); Serial.println(message); } } /** Вывод в монитор: Serial init OK GPRS init success Please send SMS message to me! From number: +79007654321 Datetime: 17/05/07,21:38:00+12 Recieved Message: Hello */эта строка gprs.powerOn(); использует библиотеку, смотрите в библиотекy, я стараюсь избегать библиотеки :)
_pkPin = 9;//pin упарвления sim900 // power Up GPRSk Shield void GPRSk::powerOn() { //delay(1000); pinMode(_pkPin, OUTPUT); digitalWrite(_pkPin, HIGH); delay(3000); digitalWrite(_pkPin, LOW); delay(5000); } // power Off GPRSk Shield void GPRSk::powerOff() { pinMode(_pkPin, OUTPUT); digitalWrite(_pkPin, HIGH); delay(3000); digitalWrite(_pkPin, LOW); delay(5000); }Это из файла GPRSk_Shield_Arduino.cpp
слишком большие задержки, измените вместо 3000 -> 2000 и 5000 -> 3000
Спасибо. Включается
А нужно согласовывать уровни сигналов rx tx ардуино и модуля?
если подключаете к D7 и D8 gprs модуля то там уже есть согласование
#include <SoftwareSerial.h> SoftwareSerial mySerial(7,8); void setup() { Serial.begin(9600); //Serial.println(“Begin”); mySerial.begin(9600); } void loop() { if (mySerial.available()) Serial.write(mySerial.read()); if (Serial.available()) mySerial.write(Serial.read()); }При подключении к 0 и 1 пину модуля - а команды отвечает, а если к 7 и 8 - молчит
Забыла про перемычки
Подскажите как получить номер смс, чтобы сразу её удалить.
из библиотеки:
/** read SMS, phone and date if getting a SMS message. It changes SMS status to READ * @param messageIndex SIM position to read * @param message buffer used to get SMS message * @param length length of message buffer * @param phone buffer used to get SMS's sender phone number * @param datetime buffer used to get SMS's send datetime * @returns * true on success * false on error */ void readSMS(char *message, char *phone, char *datetime); /** read SMS if getting a SMS message * @param buffer buffer that get from GPRSk module(when getting a SMS, GPRSk module will return a buffer array) * @param message buffer used to get SMS message * @param check whether to check phone number(we may only want to read SMS from specified phone number) * @returns * true on success * false on error */ bool readSMS(int messageIndex, char *message, int length); /** delete SMS message on SIM card * @param index the index number which SMS message will be delete * @returns * true on success * false on error */ void readSMS(); bool deleteSMS(int index); /** call someone * @param number the phone number which you want to call * @returns * true on success * false on error */А есть рабочие в наших сетях модули, дешевле SIM900? Нужен только приём и отправка смс.
А есть рабочие в наших сетях модули, дешевле SIM900? Нужен только приём и отправка смс.
а сколько SIM900 стоит?
Neoway M590 - от 3х баксов (но большинство в продаже - БУ из каких-то старых железок в разобранном виде)
Athinker A6 - от 7 баксов (есть свои заморочки, в основном с ПО)
797,82 рублей стоит
del
А есть рабочие в наших сетях модули, дешевле SIM900? Нужен только приём и отправка смс.
Sim800L
Он работает от 4В поэтому нужен DC-DC преобразователь
антенна
итого не более 400 р.
Кстати, Sim800l V2.0 уже имеет на борту все согласующие элементы - и по питанию и по интерфейсу.
да, и антенна в комплекте , жаль только DTR не вывели для осущетсвления энергосбережения. А так норм, мне пришёл такой но ещё руки не дошли заценить.
sim800l v2
Может опробуете, отпишитесь?)