Добрый день уважаемые форумчане, помогите пожалуйста найти ошибку. Задача поставил такую: приходит сигнал, аналоговый 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.
пока в тестовом режиме решил через кнопку, сделал 5 нажатий, получил смс. Не подскажите как такого добиться? на кнопку подаю 5V,на вторую ножку GND, с обратной стороны соединяю кнопку с 6 выходом. Может что не так делаю.
Кнопкой делаете короткое замыкание. Так делать нельзя. Одну ножку кнопки подключите к GND. Вторую ножку кнопки подключите к входному пину Ардуино и сделайте внутреннюю подтяжку вывода к питанию digitalWrite (pin, HIGH). Теперь при нажатии кнопки на входе будет низкий уровень, а когда кнопка отпущена - высокий.
Спасибо за совет по поводу кнопки. Вот только с кнопкой никак не получается( не суммирует... не подскажете как сделать счетчик входящих сигналов?
Эти условия никогда не выполнятся. Я так понимаю нужно читать состояние пина '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.
Попробовал, все помогло, только не могу понять, смс приходят такого типа 333112 1013600 1494523 4615579 5005090 не подскажите почему? хотя в идеале должно было быть 5 10 15 20 25 Проблема не может быть в системе счисления?
Попробуйте отправлять данные командой: Код (C++): mySerial.print(sum_cycle, 10); Таким образом явно укажете в какой системе счсления хотите видеть результат.
Если 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, что и означенная отправка.
Здесь можно найти ответ: http://yandex.ru/search/?text=c++ число в строку Если Яндекс не нравится, то в Google нужно отправить аналогичный запрос.