Страница 43 из 44 ПерваяПервая ... 333738394041424344 ПоследняяПоследняя
Показано с 421 по 430 из 435
  1. #421
    Новичок
    Регистрация
    08.01.2014
    Сообщений
    6
    Вес репутации
    129

    По умолчанию 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();
    }
    и как считывать\разбирать пришедшее смс,как лучше?
    Последний раз редактировалось revolt; 08.01.2014 в 20:27.

  2. #422
    Продвинутый
    Регистрация
    20.05.2011
    Сообщений
    325
    Вес репутации
    225

    По умолчанию Re: Управление внешними устройствами с Arduino при помощи СМС

    Какое GSM устройство используете?
    Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.

  3. #423
    Новичок
    Регистрация
    08.01.2014
    Сообщений
    6
    Вес репутации
    129

    По умолчанию 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.если у вас есть какие идеи, может и для своей работы,давайте помозгуем над этим
    Последний раз редактировалось revolt; 10.01.2014 в 14:44.

  4. #424
    Продвинутый
    Регистрация
    20.05.2011
    Сообщений
    325
    Вес репутации
    225

    По умолчанию 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=30i<38i++) pinMode(iOUTPUT);             
        
    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(led1on_off-48); 
                break; 
              case 
    'b'digitalWrite(led2on_off-48);  
                break; 
              case 
    'c'digitalWrite(led3on_off-48);  
                break; 
              case 
    'd'digitalWrite(led4on_off-48);  
                break;  
              case 
    'e'digitalWrite(led5on_off-48);  
                break;  
              case 
    'f'digitalWrite(led6on_off-48);  
                break;
              case 
    'j'digitalWrite(led7on_off-48);  
                break;  
              case 
    'h'digitalWrite(led8on_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, то имея довольно маленькие тарифы на мобильный интернет, лучше наверное уйти в сторону от СМС.
    Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.

  5. #425
    Новичок
    Регистрация
    08.01.2014
    Сообщений
    6
    Вес репутации
    129

    По умолчанию Re: Управление внешними устройствами с Arduino при помощи СМС

    код несомненно полезный, вот если бы к нему добавить отправку температур с датчиков 1-wire ,вычисление которых уже есть в моем коде (tempC)...

  6. #426
    Продвинутый
    Регистрация
    20.05.2011
    Сообщений
    325
    Вес репутации
    225

    По умолчанию Re: Управление внешними устройствами с Arduino при помощи СМС

    Так а в чем проблема? Считывайте показания, и например вместо статуса пинов, отправляйте значения показаний датчиков - Serial1.println(tempC);. У меня к сожалению сейчас шилда нет. В гараже стоит. Так бы попробовал Вам помочь более "наглядно".
    Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.

  7. #427
    Новичок
    Регистрация
    08.01.2014
    Сообщений
    6
    Вес репутации
    129

    По умолчанию Re: Управление внешними устройствами с Arduino при помощи СМС

    все получилось, благодарю! есть еще идея осуществить управление посредством DTMF.как можно это осуществить? при DTMF в терминал информация приходит следующим образом

    RING
    +CLIP:"0669837458"...
    RING

    после второго ринга происходит автоподнятие и модуль ждет нажатия клавиши 1-9,*,#. и при нажатии 1 терминал выглядит так

    RING
    +CLIP:"0994543857"...
    RING
    +DTMF:1
    КАК можно написать код чтобы он читал команду после второго ринга,а до этого сравнил номер с разрешенным ?

  8. #428
    Продвинутый
    Регистрация
    20.05.2011
    Сообщений
    325
    Вес репутации
    225

    По умолчанию Re: Управление внешними устройствами с Arduino при помощи СМС

    Не подскажу.С DTMF я не работал.
    Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.

  9. #429
    Новичок
    Регистрация
    08.01.2014
    Сообщений
    6
    Вес репутации
    129

    По умолчанию Re: Управление внешними устройствами с Arduino при помощи СМС

    все равно спасибо большое! буду разбиратся

  10. #430
    Новичок
    Регистрация
    08.01.2014
    Сообщений
    6
    Вес репутации
    129

    По умолчанию Re: Управление внешними устройствами с Arduino при помощи СМС

    разобрался.спасибо за оказанное внимание

Страница 43 из 44 ПерваяПервая ... 333738394041424344 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •