Преобразование Char в int

Тема в разделе "Arduino & Shields", создана пользователем Симилячник, 10 авг 2016.

  1. Заменил. Вылезает та же ошибка.[​IMG]
     

    Вложения:

    • Capture.PNG
      Capture.PNG
      Размер файла:
      15,8 КБ
      Просмотров:
      519
  2. ostrov

    ostrov Гуру

    Или найти другую библиотеку, менее кривую. Посмотрите какой чип на шилде за главного и поищите по его названию.
     
  3. ostrov

    ostrov Гуру

    А напрямую без библиотек АТ командами почему не попробовать?
     
  4. Это я оставлял напоследок, если не найду других вариантов. Видимо "напоследок" пришел. Спасибо! Попробую.
     
  5. ostrov

    ostrov Гуру

    С этого напоследка нужно было начинать. ))
     
  6. Проблема выскочила. Так как я использую UNO, то перенес RX и TX на 4 и 5 пины соответственно.
    Отсюда - нельзя отправить смс с помощью АТ команд, т.к. они посылаются через Serial, который на 0 и 1, а RX и TX на 4 и 5.
     
  7. DIYMan

    DIYMan Guest

    Неверный вывод. Можно, на любых пинах. Просто если в кривой библиотеке пины зашиты жёстко, или жёстко юзается HardwareSerial - тогда нельзя. Я через SoftwareSerial прекрасно общался с модемами на любых пинах, предварительно перешив их на мелкую скорость (типа 9600) в терминалке, поскольку SoftwareSerial не работает на высоких скоростях.

    Я бы авторам "библиотек" напомнил про класс Stream, при случае - чтобы знали, для чего он присутствует в поставке Arduino IDE - и тогда секса с разными *Serial не было бы.
     
  8. Пытался сделать на пине 4 и 5 с помощью софтвэр сериал. После загрузки на плату, светодиоды на плате не горят и не происходит никаких действий.

    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(4, 5);
    void setup()
    {
        gprsSerial.begin(9600);
        delay(500);
       
        // Устанавливает текстовый режим для SMS-сообщений
        gprsSerial.print("AT+CMGF=1\r");
        delay(100); // даём время на усваивание команды
        // Устанавливаем адресата: телефонный номер в международном формате
        gprsSerial.println("AT + CMGS = \"+7XXXXXXXXXX\"");
        delay(100);
        // Пишем текст сообщения
        gprsSerial.println("ALARM!");
        delay(100);
        // Отправляем Ctrl+Z, обозначая, что сообщение готово
        gprsSerial.println((char)26);
    }
    void loop()
    {
       
    }

     
     
  9. Еще пробовал. Пишет, что смс отправлено, но не отправляет
    Код (C++):

    #include <GPRS_Shield_Arduino.h>
    #include <SoftwareSerial.h>

    SoftwareSerial mySerial(4, 5); // RX, TX
    GPRS gprs(2, 3, 4, 5);

    String s_phone = "+7XXXXXXXXXX";
    String message = "Top of the morning to u ladies!";

    void setup()
    {
        Serial.begin(9600);
       while(!Serial)
        {
         
        }
      gprs.powerUpDown();
      while (!gprs.init())
       {
        delay(1000);
        Serial.println("Error");
       }
       Serial.println("Ready!");
     
      mySerial.begin(9600);  //Скорость порта для связи Arduino с GSM модулем
      mySerial.println("AT");
       if (mySerial.available())
        Serial.write(mySerial.read());
      if (Serial.available())
        mySerial.write(Serial.read());
      Serial.println("SMS send started");
      mySerial.println("AT+CMGS=\"" + s_phone + "\"");
      delay(1000);
      mySerial.print(message);
      delay(300);
      mySerial.print((char)26);
      delay(300);
      Serial.println("SMS send finish");
      delay(3000);
    }

    void loop() {
      // put your main code here, to run repeatedly:

    }


     
     
  10. Мда. Попробовал еще несколько скетчей - все без толку. Никто не поделится рабочим скетчем по отправке смс через AT?
     
  11. DIYMan

    DIYMan Guest

    У вас опять ошибка в скетче, посмотрите внимательно на AT+CMGF.
     
  12. Затык. Не пойму где накосячил. Полный код. Что не так с AT+CMGF тоже не понял.

    Код (C++):

    #include <SoftwareSerial.h>
    #include <GPRS_Shield_Arduino.h>

    SoftwareSerial gprsSerial(4, 5);
    GPRS gprs(2, 3, 4, 5);

    void setup()
    {
     
      Serial.begin(9600);  
      delay(500);
     
       gprs.powerUpDown();
     
      while (!gprs.init())
       {
        delay(1000);
        Serial.println("Error");
       }
       Serial.println("Ready!");


      Serial.println("Sending Text...");
      gprsSerial.println("AT+CMGF=1\r");
      delay(100);
      gprsSerial.println("AT+CMGS = \"+7XXXXXXXXXX\"");
      delay(100);
      gprsSerial.println("Hello!");
      delay(100);
      gprsSerial.print((char)26);
      delay(100);
      gprsSerial.println();
      Serial.println("Text Sent.");
    }
    void loop()
    {

    }
     
     
     
  13. DIYMan

    DIYMan Guest

    Вместо
    Код (C++):
    gprsSerial.println("AT+CMGF=1\r");
    как минимум
    Код (C++):
    gprsSerial.println("AT+CMGF=1");
    И вы никак не анализируете ответ модема, то, что у вас задержки стоят - не спасает. Модем может ответить ERROR, например.
     
  14. А как просмотреть ответ шилда?

    Заменил на
    Код (C++):
    gprsSerial.println("AT+CMGF=1");
    ничего не изменилось.
     
  15. DIYMan

    DIYMan Guest

    Читать из порта после каждой отправленной команды и анализировать ответ.
     
  16. Вот код. Ниже фото отчета из сериала. Сообщения не приходят.


    Код (C++):
    #include <SoftwareSerial.h>
    #include <GPRS_Shield_Arduino.h>
    SoftwareSerial gprsSerial(4, 5);

    char bufferPC_Serial[64];
    char bufferGPRS_Serial[64];

    int but  = 13;
    int but_value = 1;
    int i = 0;
    int j = 0;

    GPRS gprs(2, 3, 4, 5);

    void setup()
    {
      pinMode(13, INPUT_PULLUP);
      gprsSerial.begin(9600);
      Serial.begin(9600);  
      delay(500);

      while (!Serial) {
     
      }
     
       gprs_OnOff();

        gprsTest();


     
    }
    void loop()
    {
      but_value = digitalRead(but);
      serialPCread();
      serialGPRSread();
      if(but_value == 0)
      {
        sms();
      }

    }
    void serialPCread()
    {
      i = 0;
      // если появились данные с компьютера
      if (Serial.available() > 0) {
        while (Serial.available() > 0) {
          // пока идёт передача данных,
          // записываем каждый байт в символьный массив
          bufferPC_Serial[i++]=(Serial.read());
        }
        // добавляем символ конца строки
        bufferPC_Serial[i] = '\0';
        // записываем данные в GPRS Shield
        gprsSerial.println(bufferPC_Serial);
        Serial.println("");
        // очищаем буфер PC Serial
        clearBufferPC_Serial();
      }
    }
    void serialGPRSread()
    {
        j = 0;
        // если появились данные с GPRS Shield
        if (gprsSerial.available() > 0) {
          while (gprsSerial.available() > 0) {
            // пока идёт передача данных,
            // записываем каждый байт в символьный массив
            bufferGPRS_Serial[j++]=(gprsSerial.read());
        }
        // добавляем символ конца строки
        bufferGPRS_Serial[j] = '\0';
        // выводим полученные данные с GPRS Shield в Serial-порт
        Serial.write(bufferGPRS_Serial);
        // очищаем буфер GPRS Serial
        clearBufferGPRS_Serial();
      }
    }
    void clearBufferPC_Serial()
    {
      for (int t = 0; t < i; t++) {
        // очищаем буфер,
        // присваивая всем индексам массива значение 0
        bufferPC_Serial[t] = 0;
      }
    }
    void clearBufferGPRS_Serial()
    {
      for (int t = 0; t < j; t++) {
        // очищаем буфер,
        // присваивая всем индексам массива значение 0
        bufferGPRS_Serial[t] = 0;
      }
    }

    void sms()
    {
      Serial.println("Sending Text...");
      gprsSerial.println("AT+CMGF=1");
      delay(100);
      gprsSerial.println("AT+CMGS = \"+7XXXXXXXXXX\"");
      delay(100);
      gprsSerial.println("Hello!");
      delay(100);
      gprsSerial.print((char)26);
      delay(100);
      gprsSerial.println();
      Serial.println("Text Sent.");
    }

    void gprsTest()
    {
      // бесконечный цикл
      while (1) {
        // ждём 1 секунду
        delay(1000);
        j = 0;
        // посылаем в GPRS Shield АТ-команду "AT"
        gprsSerial.println("AT");
        // если появились данные с GPRS Shield
        if (gprsSerial.available() > 0) {
          while (gprsSerial.available() > 0) {
            // пока идёт передача данных,
            // записываем каждый байт в символьный массив
            bufferGPRS_Serial[j++] = gprsSerial.read();
          }
          // добавляем символ конца строки
          bufferGPRS_Serial[j] = '\0';
          // посылаем АТ-команду "AT"; если GPRS Shield исправен,
          // он должен вернуть команду "AT";
          // сравниваем всё что находиться в буфере GPRS Shield
          // со строкой "AT\r\n\r\nOK\r\n"
          if (strcmp(bufferGPRS_Serial, "AT\r\n\r\nOK\r\n") == 0) {
            // если всё верно выводим в Serial порт "State OK"
            // и выходим из бесконечного цикла
            Serial.println("State OK");
            break;
          } else {
            // если строки разные, значит произошла ошибка
            // выводим сообщение об ошибке и продолжаем цикл
            Serial.println("Init ERROR");
          }
        }
        // очищаем буфер GPRS Serial
        clearBufferGPRS_Serial();
      }
    }

    void gprs_OnOff()
    {
      // настраиваем пин №2 в режим выхода
      pinMode(2, OUTPUT);
      // проверяем состояние 3 пина
      if (digitalRead(3) != HIGH) {
        // если на нём «низкий уровень»
        // подаём на пин 2 «высокий уровень»
        digitalWrite(2, HIGH);
        // ждём 3 секунды
        delay(3000);
      }
      // подаём на пин 2 «низкий уровень»
      digitalWrite(2, LOW);
    }
    Capture.PNG
     
  17. DIYMan

    DIYMan Guest

    Анализируйте, почему не приходят.
     
  18. Как можно напрямую АТ связь организовать с GPRS шилдом?
     
  19. Загрузил я этот скетч.
    Код (C++):
    #include <SoftwareSerial.h>

    SoftwareSerial Serial1(4, 5);
    // буфер PC Serial
    char bufferPC_Serial[64];
    // буфер GPRS Serial
    char bufferGPRS_Serial[64];
    int i = 0;
    int j = 0;
    void setup()
    {
      // включаем GPRS-шилд
      gprs_OnOff();
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(9600);
      // открываем последовательный порт
      // для связи с GPRS-устройством со скоростью 9600 бод
      Serial1.begin(9600);
      while (!Serial) {
        // ждём, пока не откроется монитор последовательного порта
        // для того, чтобы отследить все события в программе
      }
      // пока не установится связь с GPRS-устройством, будем крутиться в теле функции
      gprsTest();
    }
    void loop()
    {
      // считываем данные с компьютера и записываем их в GPRS Shield
      serialPCread();
      // считываем данные с GPRS Shield и выводим их в Serial-порт
      serialGPRSread();
    }
    void serialPCread()
    {
      i = 0;
      // если появились данные с компьютера
      if (Serial.available() > 0) {
        while (Serial.available() > 0) {
          // пока идёт передача данных,
          // записываем каждый байт в символьный массив
          bufferPC_Serial[i++]=(Serial.read());
        }
        // добавляем символ конца строки
        bufferPC_Serial[i] = '\0';
        // записываем данные в GPRS Shield
        Serial1.println(bufferPC_Serial);
        Serial.println("");
        // очищаем буфер PC Serial
        clearBufferPC_Serial();
      }
    }
    void serialGPRSread()
    {
        j = 0;
        // если появились данные с GPRS Shield
        if (Serial1.available() > 0) {
          while (Serial1.available() > 0) {
            // пока идёт передача данных,
            // записываем каждый байт в символьный массив
            bufferGPRS_Serial[j++]=(Serial1.read());
        }
        // добавляем символ конца строки
        bufferGPRS_Serial[j] = '\0';
        // выводим полученные данные с GPRS Shield в Serial-порт
        Serial.write(bufferGPRS_Serial);
        // очищаем буфер GPRS Serial
        clearBufferGPRS_Serial();
      }
    }
    void clearBufferPC_Serial()
    {
      for (int t = 0; t < i; t++) {
        // очищаем буфер,
        // присваивая всем индексам массива значение 0
        bufferPC_Serial[t] = 0;
      }
    }
    void clearBufferGPRS_Serial()
    {
      for (int t = 0; t < j; t++) {
        // очищаем буфер,
        // присваивая всем индексам массива значение 0
        bufferGPRS_Serial[t] = 0;
      }
    }
    void gprsTest()
    {
      // бесконечный цикл
      while (1) {
        // ждём 1 секунду
        delay(1000);
        j = 0;
        // посылаем в GPRS Shield АТ-команду "AT"
        Serial1.println("AT");
        // если появились данные с GPRS Shield
        if (Serial1.available() > 0) {
          while (Serial1.available() > 0) {
            // пока идёт передача данных,
            // записываем каждый байт в символьный массив
            bufferGPRS_Serial[j++] = Serial1.read();
          }
          // добавляем символ конца строки
          bufferGPRS_Serial[j] = '\0';
          // посылаем АТ-команду "AT"; если GPRS Shield исправен,
          // он должен вернуть команду "AT";
          // сравниваем всё что находиться в буфере GPRS Shield
          // со строкой "AT\r\n\r\nOK\r\n"
          if (strcmp(bufferGPRS_Serial, "AT\r\n\r\nOK\r\n") == 0) {
            // если всё верно выводим в Serial порт "State OK"
            // и выходим из бесконечного цикла
            Serial.println("State OK");
            break;
          } else {
            // если строки разные, значит произошла ошибка
            // выводим сообщение об ошибке и продолжаем цикл
            Serial.println("Init ERROR");
          }
        }
        // очищаем буфер GPRS Serial
        clearBufferGPRS_Serial();
      }
    }
    void gprs_OnOff()
    {
      // настраиваем пин №2 в режим выхода
      pinMode(2, OUTPUT);
      // проверяем состояние 3 пина
      if (digitalRead(3) != HIGH) {
        // если на нём «низкий уровень»
        // подаём на пин 2 «высокий уровень»
        digitalWrite(2, HIGH);
        // ждём 3 секунды
        delay(3000);
      }
      // подаём на пин 2 «низкий уровень»
      digitalWrite(2, LOW);
    }

    Вот ссылка на видео. Почему так происходит?