Код:
#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.если у вас есть какие идеи, может и для своей работы,давайте помозгуем над этим