UNO+GPRS shield не работает

Тема в разделе "Arduino & Shields", создана пользователем sharp, 23 мар 2015.

  1. sharp

    sharp Нерд

    Друзья не ругайтесь, не нашел точно такой же описанной проблемы:
    http://www.elecfreaks.com/wiki/index.php?title=EFCom_GPRS/GSM_Shield
    UNO+EFcom/GPRS shield соединил бутербродом, там сложно напутать (невозможно). Подал внешнее питание на UNO. На shield горит только светодиод наличия питания, остальные два светодиода никак не хотят, нажимал по очереди на все кнопки шилда, тупо все молчит... Пробовал соединять проводами, результат тот же. Что может быть, не хочется верить что он горелый.
    Также пробовал соединять с мегой, результат тот-же.
    Может есть какие то особенности включения??
    Всем заранее спасибо.
     
  2. ИгорьК

    ИгорьК Гуру

    Начните с другого: "Я хорошо понимаю, как должны взаимодействовать Ардуино и Шилд. Я знаю что такое АТ-команды и как они передаются на шилд... Я пробовал таким-то способом передать на шилд такую-то команду...". Возможно, что-то и получится.
     
  3. sharp

    sharp Нерд

    Это типа самоуспокоения что-ли, все что вы перечислили мне знакомо. Это третий шилд из поднебесной, отсюда и вопрос, может кто сталкивался с этим.
    Речь не о том как передаются команды, а о том, почему при подаче питания он не оживает, ведь регистрироваться он в сети должен. А тут получается, что горит только светик питание "power" на шилде.
     
  4. ИгорьК

    ИгорьК Гуру

    Это, типа, Вы не совсем понятно объяснили в чем проблема. И, типа, не совсем понятен Ваш уровень подготовки.
    Ну и совсем, типа, в другом, не в этом шилде, но аналогичном, на одну ногу надо подать сигнал, чтобы началась регистрация в сети.
    Но если мой пост Вас самоуспокоил, то тоже неплохо.
     
  5. sharp

    sharp Нерд

    А я думал, название "нерд", это объясняет. Естественно новичок, отсюда и вопросы наверно глупые по вашему уровню, и не к чему сразу дуться. Я думаю форум не только для подготовленных юзеров.
    Если честно с этими шилдами просто беда какая то. Один сеть ловит команды не принимает не передает, второй четко включается всеми светиками мигает, но регистрироваться не хочет. Думал с этим пойдет, и здесь припон какой то. Все разных производителей, но все от наших китайских товарищей, больно дорого покупать италию.
     
  6. ИгорьК

    ИгорьК Гуру

    Дык... Как раз потому что с этими модулями беда, ответить на вопросы в Вашей постановке практически не возможно. Там на сайте длинная пошаговая инструкция о том, как запускать в работу этот модуль. Только Вам придется ее изучить и понять, в каком месте затык.
    Первое что приходит на ум - есть шилды, которые после включения начинают регистрацию в сети, а есть, которые требуют получения сигнала для этого. Ваш какой? Кто должен найти ответ на этот вопрос?
    Поэтому хороший тон - объяснить все шаги которые Вы уже предприняли для решения проблемы.
    А, "включил - не работает" - это ничто.
    11. Press and hold the power button a short while(Over 3 seconds) on the GPRS Shield to turn it on. - Делали? Именно более 3 секунд, а не просто нажимал на все подряд?
    А на некоторых шилдах это делается программно.
     
  7. sharp

    sharp Нерд

    Про тон учел, буду стараться. Теперь по шагам:
    Загружал скетчи, в уно все грузится на ура. Думал, может неисправность в колодках, соединял проводами. Повторил целиком проект "Управление отоплением в загородном доме (GSM)". Использовал схемотехнику участников повторивших, смотрел видео как у них работает, именно на таком шилде.
    Пробовал стандартные скетчи амперки, и с других форумов также.
    Я так понимаю не взирая на скетчи и пр. подав питание, а оно приходит, нажав кнопку s_pwr он обязан начать регистрацию.
     
  8. ИгорьК

    ИгорьК Гуру

    ... и удерживал кнопку более трех секунд?
     
  9. sharp

    sharp Нерд

    Прочитав соседний форум держал более 20сек, но почему то это мне кажется это сомнительным. Но когда не получается чего только не опробуешь.
     
  10. ИгорьК

    ИгорьК Гуру

    Ну, более 20 секунд, скорее, это перебор.
    Но, давайте рассуждать, чтобы включить Вашу плату нужно:
    1. Вставить СИМку.
    2. Подать питание.
    3. Подать (Ноль или единицу - вопрос) более трех секунд на какую-то ногу.
    Это минимум.
    Дополнительная информация - это же иногда может делаться программным путем.
    Еще информация - китайские товарищи могут менять устройство платы и забывать об этом оповещать.
    Так вот - Вы обязаны убедиться, что все три действия совершаются. Пункты 1 и 2 явно работают. А вот третий - вопрос.
    Вооружаетесь тестером и убеждаетесь (без подачи питания, а исключительно прозвоном), что нажатие кнопки ведет к соединению чего-то с чем-то.
    Очень часто там стоит перемычка, которая связывает ногу модуля не с кнопкой, а с какой-то ного Ардуино.
    Если Вы убедились, что единица или ноль - что там должно, точно подаются на ногу модуля... то велика вероятность что от него пора избавляться.
     
  11. sharp

    sharp Нерд

    Пункт 3 навел на размышление, попробую.
    Спасибо за отзывчивость.
     
  12. sharp

    sharp Нерд

    Одна сторона кнопки s_pwr звонится с выводом gnd, а вот со второй стороной кнопки непонятно куда уходит дорожка чтобы ее прозвонить.
    В даташит на плату написано что s_pwr может также управлять D5. А у меня на этом пине 0,5В, или это и есть напряжение управления??
     
    Последнее редактирование: 25 мар 2015
  13. Jonson

    Jonson Нерд

    Дружище !! не ломай голову - это шилд Г***О )))) у меня такая же песня была , то работает то нет , столько времени убил просто ужас !!!! взял шилд Tinyshine и забыл про все проблемы !!! только учти у него 8 пин на включение GSM, а 9 на ресет GSM.
     
  14. Jonson

    Jonson Нерд

  15. sharp

    sharp Нерд

    Как я писал выше это третий шилд, мне про те два тоже говорили, разное.....
     
  16. Jonson

    Jonson Нерд

    Ардуину пробовал другую поставить ?
     
  17. sharp

    sharp Нерд

    У меня их три, пробовал на меге и уно, нано занята на другом проекте.... есть мысли по этому поводу
     
  18. ИгорьК

    ИгорьК Гуру

    Если одна сторона кнопки звонится на ноль, то значит этот ноль должен быть на три секунды подан на какой-то вывод модуля. Задача - найти этот вывод и понять путь от него к кнопке.
    Этот вывод модуля может "раздваиваться" путем установки перемычки, которая связывает его не с кнопкой, а по умолчанию с ногой D5. Эта нога при включении Ардуино все время находится в положении "ноль", соответственно, вы, "условно, нажали" эту кнопку и не отпускаете. И шилд, в целом, не запускается.
    В общем, сначала найдите путь от модуля к кнопке, уберите из него ногу D5, убедитесь, что вы руками обнуляете модуль на три секунды и тогда делаете вывод о его работоспособности.
     
  19. Unixon

    Unixon Оракул Модератор

    Там SIM900, вторая нога кнопки идет на POWER_KEY, для включения или выключения модуля его нужно на время от 1 до 3 секунд замыкать на землю.

    См. схему: http://elecfreaks.com/store/download/datasheet/wireless/EFcom_v1.2.pdf

    После включения D5 должна быть в режиме входа и внутри SIM900 притянута к его питанию. Откуда там 0.5V возьмутся?

    sharp, а где код скетча?
     
  20. sharp

    sharp Нерд

    Вот код:
    Код (Text):
    #include <SoftwareSerial.h>
    #include "DHT.h"
    #define DHTPIN 7    // pin на котором висит датчик температуры
    #define DHTTYPE DHT11  // DHT 22 тип датчика
    //Отсылается смс в формате: влажность;температура;устройство1;устройство2;устройство3;устройство4;Контроль периметра;Состояние периметра;Контроль автотемпературы;Установленная температура;STEWARD;
    int greenLed = 13; //Зеленый светодиод на PIN13
    int powerGSM = 6; //Пин включения GSM
    int unit1 = 8; //Управляемое устройство 1
    int unit2 = 9; //Управляемое устройство 2
    int unit3 = 10;//Управляемое устройство 3
    int unit4 = 11;//Управляемое устройство 4
    int perimetr = 12;// Датчик периметра
    String statusHome;
    int t=0;
    unsigned long currentTime;
    unsigned long loopTime;
    boolean unit1status = false; //Управляемое устройство 1
    boolean unit2status = false; //Управляемое устройство 2
    boolean unit3status = false;//Управляемое устройство 3
    boolean unit4status = false;//Управляемое устройство 4
    boolean isPerimetr = false; //Контроль периметра
    boolean sendSMS = false; //Для проверки что смс отсылаем только один раз
    boolean isAuto = false; //Автоматическое управление температурой
    int autoTemp = 0;
    int delta=2;
    DHT dht(DHTPIN, DHTTYPE);
    SoftwareSerial gprsSerial(2, 3);
    boolean prevBtn = LOW;
    String currStr = "";
    // Переменная принимает значение True, если текущая строка является сообщением
    boolean isStringMessage = false;
    void setup()
    {
        pinMode(unit1, OUTPUT);
        pinMode(unit2, OUTPUT);
        pinMode(unit3, OUTPUT);
        pinMode(unit4, OUTPUT);
        pinMode(powerGSM, OUTPUT);
        pinMode(perimetr, INPUT);
        pinMode(greenLed, OUTPUT);
        digitalWrite(unit1, LOW);
        digitalWrite(unit2, LOW);
        digitalWrite(unit3, LOW);
        digitalWrite(unit4, LOW);
        digitalWrite(powerGSM, LOW);
        digitalWrite(greenLed, LOW);
        //Включаю GSM Модуль
        digitalWrite(powerGSM, HIGH);
        delay(1000);
        digitalWrite(powerGSM, LOW);
        delay(5000);
        gprsSerial.begin(19200);
        delay(300);
        // Настраиваем приём сообщений с других устройств
        // Между командами даём время на их обработку
        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);
        //Инициализация температурного датчика
        Serial.begin(9600);
        Serial.println(dht.readTemperature());
        dht.begin();
        delay(3000);
    // ParseSMS("1;20;0;1;1;1;1");
      currentTime = millis();
      loopTime = currentTime;
    }
    void GetDatchik() {
      // Пол
      // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
      float h = dht.readHumidity();
      float t = dht.readTemperature();
      // check if returns are valid, if they are NaN (not a number) then something went wrong!
      if (isnan(t) || isnan(h)) {
        Serial.println("Failed to read from DHT");
      } else {
        statusHome = int(h)+String(";")+int(t)+String(";")+int(unit1status)+String(";")+int(unit2status)+String(";")+int(unit3status)+String(";")+int(unit4status)+String(";")+int(isPerimetr)+String(";")+digitalRead(perimetr)+String(";")+int(isAuto)+String(";")+int(autoTemp)+String(";STEWARD");
        sendTextMessage(statusHome);
    //  Serial.print("H"); //Влажность
    //  Serial.print(h);
    //  Serial.print(";");
    //  Serial.print("T"); //Температура
    //  Serial.print(t);
    //  Serial.println(";");
    //  Serial.println(statusHome);
      }
    }
    void loop()
    {
    // delay(5000);
    // GetDatchik();
    int sostPerimetr; //Состояние периметра
      if (gprsSerial.available()){
      char currSymb = gprsSerial.read();
    Serial.print(currSymb);// для просмотра через монитор
          //  return;
      //  char currSymb = gprsSerial.read();
      //  Serial.println(currSymb);
        if ('\r' == currSymb) {
            if (isStringMessage) {
                //если текущая строка - SMS-сообщение,
                //отреагируем на него соответствующим образом
                if (!currStr.compareTo("STATUS"))
                {
                  GetDatchik();
                }
                else if (currStr.startsWith("0#todo#")||currStr.startsWith("1#todo#")) {
                  ParseSMS(currStr);
                }
           
                isStringMessage = false;
            } else {
                if (currStr.startsWith("+CMT")) {
                    //если текущая строка начинается с "+CMT",
                    //то следующая строка является сообщением
                    isStringMessage = true;
                }
            }
            currStr = "";
        } else if ('\n' != currSymb) {
            currStr += String(currSymb);
        }
      }
    //  Контроль периметра!!!
      if (isPerimetr) { //Проверка Включен ли контроль периметра
          digitalWrite(greenLed, HIGH);
          sostPerimetr = digitalRead(perimetr);
            if (sostPerimetr==LOW) { //Проверка на разомкнутый периметр
              digitalWrite(greenLed, LOW);
              delay(200);
              digitalWrite(greenLed, HIGH);
              delay(200);
              //и отсылаем СМС
              if (sendSMS==false){
                sendTextMessage("WARNING! The perimeter of the broken!");
                sendSMS=true;
              }
          }
      } else {
        digitalWrite(greenLed, LOW);
      }
    //  Контроль температуры!!!
      if (isAuto==true) { //Проверка Включен автоуправление батареями
      //Замер температуры можно проводить не чаще раз в 5 минут
          currentTime = millis();
      if(currentTime >= (loopTime + 60000)){
      t = int(dht.readTemperature());
      loopTime = currentTime;
      }
    //
    //  Serial.print("t=");
    //  Serial.println(t);
    //  Serial.print("autoTemp+delta=");
    //  Serial.println(autoTemp+delta);
        if (t > autoTemp+delta) {
            if ( unit1status==true){
            digitalWrite(unit1, LOW);
            unit1status=false;
            }
            if ( unit2status==true){
            digitalWrite(unit2, LOW);
            unit2status=false;
            }
            if ( unit3status==true){
            digitalWrite(unit3, LOW);
            unit3status=false;
            }
            if ( unit4status==true){
            digitalWrite(unit4, LOW);
            unit4status=false;
            }
            } else if (t < autoTemp-delta) {
            if ( unit1status==false){
            digitalWrite(unit1, HIGH);
            unit1status=true;
            }
            if ( unit2status==false){
            digitalWrite(unit2, HIGH);
            unit2status=true;
            }
            if ( unit3status==false){
            digitalWrite(unit3, HIGH);
            unit3status=true;
            }
            if ( unit4status==false){
            digitalWrite(unit4, HIGH);
            unit4status=true;
            }
            }
      }
    }
    void ParseSMS(String currStr) {
      int firstSemicolon;
      //Распарсиваем SMS
      firstSemicolon = 1;//находим первую ;
      //Получаем значение Автоматического режима контроля температуры
      // if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){
        if (currStr.substring(0,1) == "0"){
        isAuto=false;
      }
        else{
          isAuto=true;
        }
      //  Serial.println(currStr.substring(0,1));
    //  Serial.print("isAuto=");
    //  Serial.println(isAuto);
      firstSemicolon = currStr.indexOf(';');
      //Получаем значение Автоматического уровня температуры
      autoTemp = stringToNumber(currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )));
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
    // Serial.println(autoTemp);
      //Получаем значение Контроля периметра
      if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){
        isPerimetr=false;
      } else {
          isPerimetr=true;
        }
    //  Serial.println(isPerimetr);
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
      //Получаем значение Устройства 1
    if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
        unit1status=false;
        digitalWrite(unit1, LOW);
    //  Serial.println("Устройство 1 ВЫКЛ");
      } else{
          unit1status=true;
          digitalWrite(unit1, HIGH);
      //    Serial.println("Устройство 1 ВКЛ");
        }
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
      //Получаем значение Устройства 2
    if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
        unit2status=false;
        digitalWrite(unit2, LOW);
      } else {
          unit2status=true;
          digitalWrite(unit2, HIGH);
        }
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
      //Получаем значение Устройства 3
    if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
        unit3status=false;
        digitalWrite(unit3, LOW);
      } else {
          unit3status=true;
          digitalWrite(unit3, HIGH);
        }
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
      //Получаем значение Устройства 4
    if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
        unit4status=false;
        digitalWrite(unit4, LOW);
      } else {
          unit4status=true;
          digitalWrite(unit4, HIGH);
        }
      }
    /*
    * Функция отправки SMS-сообщения
    */
    void sendTextMessage(String text) {
        // Устанавливает текстовый режим для SMS-сообщений
        gprsSerial.print("AT+CMGF=1\r");
        delay(100); // даём время на усваивание команды
        // Устанавливаем адресата: телефонный номер в международном формате
        gprsSerial.println("AT + CMGS = \"+79135049157\""); //Телефон нужно указать свой
        delay(100);
        // Пишем текст сообщения
        gprsSerial.println(text);
        delay(100);
        // Отправляем Ctrl+Z, обозначая, что сообщение готово
        gprsSerial.println((char)26);
    }
    //Функция преобразовангия STRING в INT
    int stringToNumber(String thisString) {
      int i, value = 0, length;
      length = thisString.length();
      for(i=0; i<length; i++) {
        value = (10*value) + thisString.charAt(i)-(int) '0';;
      }
      return value;
    }