Нужна помощь

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

  1. Sashagusarov

    Sashagusarov Нуб

    Добрый день уважаемые форумчане, помогите пожалуйста найти ошибку.
    Задача поставил такую:
    приходит сигнал, аналоговый 24В, хочу чтобы его видела ARDUINO UNO, насчитала к примеру 5 сигналов и потом отправила мне смс с суммой кол-вом сигналов.

    вот так исходник

    // библиотека для эмуляции Serial порта
    // она нужна для работы библиотеки GPRS_Shield_Arduino
    #include <SoftwareSerial.h>

    // Подключаем порты
    SoftwareSerial mySerial(10, 11);

    // библиотека для работы с GPRS устройством
    #include <GPRS_Shield_Arduino.h>

    // Выбор порта для входящих сигналов
    #define ITEM_PIN 6

    // Обьявляем переменную которая будет суммировать пины
    long pin_sum = 0;

    // Обьявляем переменную которая будет общей суммой пинов
    long sum_cycle = 0;

    void setup() {
    // включаем GPRS-шилд
    gprs.powerUpDown();

    // открываем последовательный порт для мониторинга действий в программе
    mySerial.begin(19200);
    mySerial.print("ok\r");
    delay(1000);

    mySerial.print("AT+CMGF=1\r");
    delay(1000);
    }

    void loop() {

    // проверяем условие, если пришел сигнал будем суммировать
    if (ITEM_PIN == HIGH){
    pin_sum++;
    }
    else {
    // Чтобы смс постоянно не отправлялось пока не работает, будем обнулять сумматор
    if (ITEM_PIN == LOW) {
    pin_sum = 0;
    }
    }
    // Считаем кол-во циклов
    sum_cycle = pin_sum + sum_cycle;

    if (sum_cycle == 5){
    // отправляем сообщение по указанному номеру с заданным текстом
    mySerial.print("AT+CMGS=\"+79296674989\"\r");
    delay(1000);

    mySerial.print(sum_cycle);
    delay(1000);
    }

    }

    проблема щас заключается в том что не могу принять сигнал на ARDUINO UNO. Принимаю через
    GPRS Shiel, соединил бутербродом с ARDUINO UNO.
     
  2. Sashagusarov

    Sashagusarov Нуб

    пока в тестовом режиме решил через кнопку, сделал 5 нажатий, получил смс. Не подскажите как такого добиться? на кнопку подаю 5V,на вторую ножку GND, с обратной стороны соединяю кнопку с 6 выходом. Может что не так делаю.
     
  3. Radius

    Radius Гик

    Кнопкой делаете короткое замыкание. Так делать нельзя. Одну ножку кнопки подключите к GND. Вторую ножку кнопки подключите к входному пину Ардуино и сделайте внутреннюю подтяжку вывода к питанию digitalWrite (pin, HIGH). Теперь при нажатии кнопки на входе будет низкий уровень, а когда кнопка отпущена - высокий.
     
    Sashagusarov нравится это.
  4. Sashagusarov

    Sashagusarov Нуб

    Спасибо за совет по поводу кнопки.
    Вот только с кнопкой никак не получается( не суммирует...
    не подскажете как сделать счетчик входящих сигналов?
     
  5. Megakoteyka

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

    Возьмите библиотеку debounce, она уберет дребезг и правильно обработает сигнал.
     
    Sashagusarov нравится это.
  6. AlexU

    AlexU Гуру

    Эти условия никогда не выполнятся. Я так понимаю нужно читать состояние пина 'ITEM_PIN':
    Код (C++):

    if (digitalRead(ITEM_PIN)) {  // или можно if (digitalRead(ITEM_PIN) == HIGH) -- что тоже самое
      pin_sum++;
    } else {
      pin_sum = 0;
    }
    Только при таком подходе переменная 'pin_sum', будет инкрементироваться при отжатой кнопке со скоростью вызова функции loop(), а после нажатия кнопки значение будет сбрасываться в '0'. При условии, что нажатие кнопки замыкает пин 'ITEM_PIN' на землю.
    Если хотите считать количество нажатий, то:
    Код (C++):

    int pinState = 1;  // предыдущее состояние кнопки -- "контакты не замкнуты"
    if (digitalRead(ITEM_PIN)) { // если кнопка не замкнута
      pinState = 1;  // сохраняем состояние
    } else if (pinState) {  // условие сработает, если кнопка нажата и предыдущее состояние "контакты не замкнуты"
      pin_sum++;  // увеличиваем количество нажатий
      pinState = 0;  // сохраняем состояние -- "контакты замкнуты"
      delay(100); // что бы дребезг не влиял, если воспользуетесь советом Megakoteyka, то не нужно
    }
    Сброс 'pin_sum = 0;' нужно делать после отправки сообщения.

    А вот это:
    скорее всего надо заменить на:
    Код (C++):
    if (pin_sum == 5) {
    Еще могу посоветовать во время отладки AT-команды передавать в последовательный порт на комп и отслеживать каким-нибуть монитором последовательного порта. А потом когда убедитесь, что все работает как надо, перевести поток команд на GPRS Shield.
     
    Sashagusarov нравится это.
  7. Sashagusarov

    Sashagusarov Нуб


    Спасибо большое, попробую)
     
  8. Sashagusarov

    Sashagusarov Нуб

    Попробовал, все помогло, только не могу понять, смс приходят такого типа
    333112
    1013600
    1494523
    4615579
    5005090
    не подскажите почему? хотя в идеале должно было быть
    5
    10
    15
    20
    25

    Проблема не может быть в системе счисления?
     
    Последнее редактирование: 20 сен 2015
  9. AlexU

    AlexU Гуру

    Попробуйте отправлять данные командой:
    Код (C++):
    mySerial.print(sum_cycle, 10);
    Таким образом явно укажете в какой системе счсления хотите видеть результат.
     
    Sashagusarov нравится это.
  10. Sashagusarov

    Sashagusarov Нуб

    не помогло(
    могут быть еще какие то варианты?
    порт использую аналоговый
     
    Последнее редактирование: 20 сен 2015
  11. AlexU

    AlexU Гуру

    Могу предложить следующий вариант -- преобразовывать число в строку перед отправкой в порт.
     
    Sashagusarov нравится это.
  12. Sashagusarov

    Sashagusarov Нуб

    а не подскажите как это сделать?
     
  13. geher

    geher Гуру

    Если
    sum_cycle = pin_sum + sum_cycle;
    осталось как и было, выполняться на каждой итерации loop, то
    5
    10
    15
    20
    25
    не будет никогда.
    Если я правильно представляю себе итоговый код после всех предложенных исправлений, то
    при нажатии кнопки pin_sum будет увеличиваться на 1.
    Но между нажатиями кнопок sum_cycle будет каждый раз увеличиваться на текущее значение pin_sum (1, 2, 3, 4, на 5 pin_sum сбросится в 0 и увеличение должно прекратиться до нового нажатия на кнопку). Причем увеличиваться очень быстро, поскольку задержек в loop нет (все они только при отправке SMS).
    Логичным представляется предположить, что если представляется правильной выводимая последовательность с шагом 5, то нужно переместить увеличение sum_cycle в место непосредственно перед отправкой СМС, внутри того же if, что и означенная отправка.
     
    Sashagusarov нравится это.
  14. AlexU

    AlexU Гуру

    Здесь можно найти ответ: http://yandex.ru/search/?text=c++ число в строку
    Если Яндекс не нравится, то в Google нужно отправить аналогичный запрос.
     
    Sashagusarov нравится это.
  15. Sashagusarov

    Sashagusarov Нуб

    Помогло!

    Огромное спасибо всем тем кто откликнулся, и помог нубу)
    тема закрыта