Re: Управление внешними устройствами с Arduino при помощи СМС
перечитал все помогите разобратся со следующей ситуацией,проверяются датчики 1-wire,в мониторе все пишется как надо,нужно что бы по определенному(в данном случае "#") символу во входящей смс,отреагировал ответным смс с температурами.в моем случае,запускается,ждем 20сек,начинают циклировать данные в мониторе,и через 5 сек после этого мне приходит смс "-127.00"
Код:
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress domC = { 0x28, 0xF7, 0x72, 0x46, 0x05, 0x00, 0x00, 0xDB };
DeviceAddress ulicaC = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };
DeviceAddress kotelC = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F };
char inchar;
float tempC;
void setup(void)
{
Serial.begin(9600);
Serial1.begin(9600);
Serial1.print("AT+CMGF=1\r");
delay(1000);
Serial1.println("AT+CNMI=3,0,0,0\r");
delay(1000);
sensors.begin();
sensors.setResolution(domC, 10);
sensors.setResolution(ulicaC, 10);
sensors.setResolution(kotelC, 10);
}
void printTemperature(DeviceAddress deviceAddress)
{
tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
Serial.print("Error getting temperature");
} else {
Serial.print("C: ");
Serial.print(tempC);
Serial.print(" F: ");
Serial.print(DallasTemperature::toFahrenheit(tempC));
}
}
void loop(void)
{
delay(20000);
Serial.print("Getting temperatures...\n\r");
sensors.requestTemperatures();
Serial.print("Doma: ");
printTemperature(domC);
Serial.print("\n\r");
Serial.print("Ha ylice: ");
printTemperature(ulicaC);
Serial.print("\n\r");
Serial.print("Kotel: ");
printTemperature(kotelC);
Serial.print("\n\r\n\r");
if(Serial1.available() >0) // насколько я понял считывает смс,возможно в этом проблема
{
inchar=Serial1.read();
if (inchar=='#')
{
sendSMS();
}
}
}
void sendSMS()
{
Serial1.println("AT+CMGS=\"+380660830000\"\r");
delay(1000);
Serial1.println(tempC);
delay(1000);
Serial1.println((char)26);
delay(1000);
Serial1.println("AT+CMGD=1,4\r");
Serial1.flush();
}
и как считывать\разбирать пришедшее смс,как лучше?
Re: Управление внешними устройствами с Arduino при помощи СМС
Какое GSM устройство используете?
Re: Управление внешними устройствами с Arduino при помощи СМС
прошу прощения что задержался с ответом и не указал этого в сообщении.использую arduino mega+gsm shield sim900+ds18b20.подскажите как до ума довести этот скетч.хотелось как проще,но не работает и я попробовал чуть модифицировать код.уже с разбором входящего сообщения.но тоже неработает.вот собственно код,вроде расписал как попонятнее
Код:
#include <OneWire.h>
#include <DallasTemperature.h>
// ***************Настройка Serial**********************
#define GPRS_TO_DBG // закоментируйте эту строчку если нужно использовать настоящий gprs
#ifdef GPRS_TO_DBG
#define GPRS Serial // gprs руками в Serial мониторе эмулируем
#else
#define GPRS Serial1 // используем настоящий шилд
#endif
// *************** /Настройка Serial**********************
#define ONE_WIRE_BUS 3 // датчики на 3 пин
#define INPUT_BUF_SIZE 30 // размер входного буфера
char input_buff[INPUT_BUF_SIZE+1]; // место под хранение входящих из GPRS данных
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress domC = { 0x28, 0xF7, 0x72, 0x46, 0x05, 0x00, 0x00, 0xDB };
DeviceAddress ulicaC = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };
DeviceAddress kotelC = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F };
//******** ДАННЫЕ *************
#define LIMIT_SMS 4 //лимит сообщений
byte countSMS=0; //счетчик сообщений
long interval = 25000; //интервал обнуления счетчика смс
char NUM_TEL[]="+380660830003";
float tempC;
char sms;
//******** ДАННЫЕ *************
//************* Константы для принятых SMS команд ************************
char* cmd_prefix="+cmt";
char* cmd_numTel="+380660830003"; //Номер телефона на который реагируем
char* cmd_control="cont";
//************* /Константы для принятых SMS команд ***********************
void setup()
{
initGPRS();
sensors.begin();
sensors.setResolution(domC, 10);
sensors.setResolution(ulicaC, 10);
sensors.setResolution(kotelC, 10);
}
void loop(){
tempSerial();
waitAndExecuteCommand();
trySendSMS(tempC);
timeLimitSMS();
}
void initGPRS(){ // функция инициализации GPRS
//shield_ON();
GPRS.begin(9600);
gprsCmdAndWaitln("AT+IFC=1, 1");//data flow controll(1, Программный режим (XON/XOFF)).
gprsCmdAndWaitln("AT+CPBS=\"SM\"");//выбрать как основную память сим-карту.
gprsCmdAndWaitln("AT+CNMI=1,2,2,1,0"); //формат информирование о новом смс
gprsCmdAndWaitln("AT+CMGF=1"); //выбор режима sms: 1-текстовый,0-цифровой)
}
void shield_ON(){
digitalWrite(8, HIGH);
delay(1200);
digitalWrite(8, LOW);
delay(10000);
}
void printTemperature(DeviceAddress deviceAddress){
tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
GPRS.print("error");
} else {
GPRS.print("C: ");
GPRS.print(tempC);
GPRS.print("F: ");
GPRS.print(DallasTemperature::toFahrenheit(tempC));
}
}
void waitAndExecuteCommand(){
static bool nextLineWillCommand = false;
if(isLineReady()){
strlwr(input_buff); //Когда есть готовая строка, переводим символы в нижний регистр.
if(!nextLineWillCommand && startsWith(input_buff,cmd_prefix) && strstr(input_buff,cmd_numTel)){ //добавил strstr(input_buff,cmd_numTel) для проверки номера.
nextLineWillCommand = true;
return; // сразу выходим
}
if(nextLineWillCommand){
executeCommand(input_buff);
deleteAllSms();
nextLineWillCommand = false;
}
}
}
bool isLineReady(){ //забираем строку из сериал буфера
static byte inputBuffIndex=0;
if (GPRS.available()){
byte t = GPRS.read();
switch(t){
case '\n':
input_buff[inputBuffIndex] = 0;
inputBuffIndex=0;
return true;
break;
case '\r':
break;
default:
if (inputBuffIndex < INPUT_BUF_SIZE){
input_buff[inputBuffIndex] = t;
inputBuffIndex++;
}
}
}
return false;
}
bool startsWith (char* inputString, char* prefix) {
return (strstr(inputString, prefix) - inputString) == 0;
}
void executeCommand(char* command){
if(strstr(command, cmd_control)){
actionSendSMS();
}
}
void actionSendSMS(char* sms){ // Функция отправки SMS
GPRS.print("AT+CMGS=\"");
GPRS.print(NUM_TEL);
gprsCmdAndWaitln("\"");
GPRS.print(sms);
gprsCmdAndWaitln("\x1A");
}
void trySendSMS(char* sms){ //проверяем на лимит и добавляем +1
if (countSMS < LIMIT_SMS){
actionSendSMS(sms);
countSMS++;
}
}
void deleteAllSms(){
GPRS.println("AT+CMGD=1,4"); //Удаление всех входящих сообщений.
}
void tempSerial(){ // температура на монитор
GPRS.print("Getting temperatures...\n\r");
sensors.requestTemperatures();
GPRS.print("Doma: ");
printTemperature(domC);
GPRS.print("\n\r");
GPRS.print("Ha ylice: ");
printTemperature(ulicaC);
GPRS.print("\n\r");
GPRS.print("Kotel: ");
printTemperature(kotelC);
GPRS.print("\n\r\n\r");
delay(5000);
}
void gprsCmdAndWaitln(char* commandText){ //отправка в serial с переводом строки
GPRS.println(commandText);
delay(1000);
}
void timeLimitSMS(){
unsigned long currentMillis;
long previousMillis = 0;
currentMillis = millis();
if (currentMillis - previousMillis > interval)
{
countSMS = 0;
previousMillis = currentMillis;
}
}
в таком виде он не компилится,загвоздка в районе "actionSendSMS"и"trySendSMS".вобщем,пришла смс-обработали-увидел кодовое слово-выполнил действие(ответное смс с данными).сейчас хотябы чтобы ответил одной температурой,но в идеале - domC:20.00;ulicaC:15.00;kotelC:50.00; но вообще в идеале думаю былобы вообще шикарно сделать все это на управлении DTMF.если у вас есть какие идеи, может и для своей работы,давайте помозгуем над этим
Re: Управление внешними устройствами с Arduino при помощи СМС
Код, который при получении сообщения ВКЛЮЧАЕТ или ВЫКЛЮЧАЕТ или ОТПРАВЛЯЕТ СТАТУС пина. Отправка на модуль сообщения в виде - #a - и т.д. Немного корявенький, но 100% рабочий (именно для SIM900):
PHP код:
#define led1 30
#define led2 31
#define led3 32
#define led4 33
#define led5 34
#define led6 35
#define led7 36
#define led8 37
int stat1 = 0;
int stat2 = 0;
int stat3 = 0;
int stat4 = 0;
int stat5 = 0;
int stat6 = 0;
int stat7 = 0;
int stat8 = 0;
char device,on_off;
void setup()
{
Serial.begin(9600);
for(byte i=30; i<38; i++) pinMode(i, OUTPUT);
Serial1.begin(9600);
delay(30000);
Serial1.println("AT+CMGF=1\r");
delay(200);
Serial1.println("AT+CNMI=3,0,0,0\r");
delay(200);
}
void loop()
{
sms_read();
}
void sms_read()
{
if(Serial1.available()>2)
{
if(Serial1.read()=='#')
{
device=Serial1.read();
on_off=Serial1.read();
switch (device)
{
case 'a': digitalWrite(led1, on_off-48);
break;
case 'b': digitalWrite(led2, on_off-48);
break;
case 'c': digitalWrite(led3, on_off-48);
break;
case 'd': digitalWrite(led4, on_off-48);
break;
case 'e': digitalWrite(led5, on_off-48);
break;
case 'f': digitalWrite(led6, on_off-48);
break;
case 'j': digitalWrite(led7, on_off-48);
break;
case 'h': digitalWrite(led8, on_off-48);
break;
case 's':
stat1 = digitalRead(led1);
stat2 = digitalRead(led2);
stat3 = digitalRead(led3);
stat4 = digitalRead(led4);
stat5 = digitalRead(led5);
stat6 = digitalRead(led6);
stat7 = digitalRead(led7);
stat8 = digitalRead(led8);
Serial1.println("AT+CMGF=1\r");
delay(1000);
Serial1.println("AT+CMGS=\"+380675678366\"\r");
delay(1000);
//**************************************************************
Serial1.println("Device 1 is: ");
{
if (stat1 == 1)
{
Serial1.println("ON");
}
else
if (stat1 == 0)
{
Serial1.println("OFF");
}
}
//**************************************************************
Serial1.println("Device 2 is: ");
{
if (stat2 == 1)
{
Serial1.println("ON");
}
else
if (stat2 == 0)
{
Serial1.println("OFF");
}
}
//**************************************************************
Serial1.println("Device 3 is: ");
{
if (stat3 == 1)
{
Serial1.println("ON");
}
else
if (stat3 == 0)
{
Serial1.println("OFF");
}
}
//**************************************************************
Serial1.println("Device 4 is: ");
{
if (stat4 == 1)
{
Serial1.println("ON");
}
else
if (stat4 == 0)
{
Serial1.println("OFF");
}
}
//**************************************************************
delay(1000);
Serial1.println(26,BYTE);
delay(3000);
break;
}
Serial1.println("AT+CMGD=1,4\r");
Serial1.flush();
}
}
}
А вообще,с учетом того, что SIM900 отлично дружит с TCP и GPRS, то имея довольно маленькие тарифы на мобильный интернет, лучше наверное уйти в сторону от СМС.
Re: Управление внешними устройствами с Arduino при помощи СМС
код несомненно полезный, вот если бы к нему добавить отправку температур с датчиков 1-wire ,вычисление которых уже есть в моем коде (tempC)...
Re: Управление внешними устройствами с Arduino при помощи СМС
Так а в чем проблема? Считывайте показания, и например вместо статуса пинов, отправляйте значения показаний датчиков - Serial1.println(tempC);. У меня к сожалению сейчас шилда нет. В гараже стоит. Так бы попробовал Вам помочь более "наглядно". :)
Re: Управление внешними устройствами с Arduino при помощи СМС
все получилось, благодарю! есть еще идея осуществить управление посредством DTMF.как можно это осуществить? при DTMF в терминал информация приходит следующим образом
RING
+CLIP:"0669837458"...
RING
после второго ринга происходит автоподнятие и модуль ждет нажатия клавиши 1-9,*,#. и при нажатии 1 терминал выглядит так
RING
+CLIP:"0994543857"...
RING
+DTMF:1
КАК можно написать код чтобы он читал команду после второго ринга,а до этого сравнил номер с разрешенным ?
Re: Управление внешними устройствами с Arduino при помощи СМС
Не подскажу.С DTMF я не работал.
Re: Управление внешними устройствами с Arduino при помощи СМС
все равно спасибо большое! буду разбиратся
Re: Управление внешними устройствами с Arduino при помощи СМС
разобрался.спасибо за оказанное внимание