GPRS-Shield не звонит при нажатии на кнопку
- Войдите на сайт для отправки комментариев
Чт, 29/10/2015 - 09:17
Привет! Помогите, пожалуйста! Имею Arduino UNO и GPRS-Shield (оба на алиэкспрессе купил). Уже какой день мучаюсь и не могу понять почему беда такая происходит: при однократном нажатии на кнопку не звонит шилд, при многократном, т.е. если я буду сидеть и тыкать в неё, в какой-то момент он всё же совершает звонок. Как сократить эти нажатия до 1го? Что бы я включил ардуину и шилд, шилд зарегистрировался в сети оператора и после этого я жму кнопку и он звонит.. Вроде просто всё, но не выходит. Код скетча:
#include <SoftwareSerial.h> SoftwareSerial GPRS(7, 8); String currStr = ""; String phoneNumber = ""; int updateTime = 0; int btnPin = 2; bool calling = false; bool iPh = false; bool setOpt = false; void setup() { GPRS.begin(19200); Serial.begin(19200); Serial.println("I'm loaded!"); } void loop() { touch(); if (!GPRS.available()) return; if ( !setOpt ) { setOpt = true; delay(200); GPRS.println("AT+CLCC"); delay(100); GPRS.println("AT+CLIP=1"); delay(100); } char currSymb = GPRS.read(); if ( digitalRead(btnPin) == HIGH ) { if ( !calling ) { Serial.println("Start calling to +7961xxxxxxx"); GPRS.println("ATD+7961xxxxxxx;"); calling = true; } } if ('\r' == currSymb) { if (!currStr.compareTo("RING")) { if ( iPh ) { Serial.println("Ring from " + phoneNumber); } } else if ( !currStr.compareTo("AT") || !currStr.compareTo("OK") ) { return; } else if ( currStr.compareTo("+CLIP:") && !iPh ) { if ( currStr.indexOf("+CLIP:") == 0 ) { currStr = currStr.substring(currStr.indexOf("\""), currStr.length()); currStr = currStr.substring(1, currStr.indexOf(",") - 1); iPh = true; phoneNumber = currStr; // set phone number } } else { Serial.println(currStr); } currStr = ""; } else if (currSymb != '\n') { currStr += String(currSymb); } } void touch() { if (millis() >= updateTime) { GPRS.println("AT"); updateTime += 3600; } }
строка 40 попробуйте использовать switch вместо if как в примере
http://www.seeedstudio.com/wiki/GPRS_Shield_V1.0
Я попробую конечно, спасибо, но вот что я сделал: закоментировал 25 и 26 строки, где стоит проверка доступности шилда, поставил задержку 3сек при загрузке ардуины, что бы дать шилду прогрузиться, теперь всё работает как хотелось. Но вопрос остался, почему он выдает Not available при простое? Чудо прям... =(
Теперь другая беда)) Чтение с GPRS шилда перестало реагировать.. Но тут я уже попробую переписать цикл.
Или вот наиболее понятно даже http://wiki.amperka.ru/%D0%B1%D0%B5%D1%81%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4%D0%BD%D0%B0%D1%8F-%D1%81%D0%B2%D1%8F%D0%B7%D1%8C:gprs-shield
Андрей, я изначально оттуда и брал пример, я же говорю из-за вот этого кусочка:
Нажатие не срабатывает когда мне нужно, теперь стало срабатывать, вот сейчас переписываю чтение с шилда данных, а то я не номер не могу определить и вообще понять что там у них происходит))
Андрей, я изначально оттуда и брал пример, я же говорю из-за вот этого кусочка:
Нажатие не срабатывает когда мне нужно, теперь стало срабатывать, вот сейчас переписываю чтение с шилда данных, а то я не номер не могу определить и вообще понять что там у них происходит))
Вам бы знаете как поступить если планируете дальше ковыряться с шилдом... По своему опыту чисто советую... Необходимо изучить либо посимвольный разбор строк, либо методом substring() к примеру... Я для себя выбрал второй ибо он проще поначалу оказался. Я лично произвожу чтение с шилда через while и заношу все в строку, которую затем просто разбираю... Функция touch по мне так вообще лишняя оказалась и я ее выкинул.
Андрей, я изначально оттуда и брал пример, я же говорю из-за вот этого кусочка:
Нажатие не срабатывает когда мне нужно, теперь стало срабатывать, вот сейчас переписываю чтение с шилда данных, а то я не номер не могу определить и вообще понять что там у них происходит))
Вам бы знаете как поступить если планируете дальше ковыряться с шилдом... По своему опыту чисто советую... Необходимо изучить либо посимвольный разбор строк, либо методом substring() к примеру... Я для себя выбрал второй ибо он проще поначалу оказался. Я лично произвожу чтение с шилда через while и заношу все в строку, которую затем просто разбираю... Функция touch по мне так вообще лишняя оказалась и я ее выкинул.
А я по этому поводу и спорить не собираюсь и даже благодарю за совет, я просто никак не могу понять этот чудо язык)) Я знаю C++ и C# немного, но вот тут половина из языков не работает, поэтому для меня это прям велосипед какой-то)) Я touch тоже убрал - он работает не корректно, его задача опрашивать каждые n-секунд, но он проходит 7-8 итераций и больше не работает.
Ну я вообще никакие языки не знаю кроме этого... Да и этот то далеко не 100%... Вот всех функций в разделе "Программирование" вполне хватает на все.
Последний вопрос: парсю я значит побуквенно дату с шилда и всё классно, но вот иногда при звонке проскакивает в консоли буквы "я" русские, которых там и быть то не должно. Это чего за данные такие? Кто-то в курсе?
Был у меня косяк но немного другой...'я' это отсутствие данных... Только почему вместо "ничего" приходит "я" скажут опытные программеры
такая же бяка, переодически проскакивают "я"
Забил я пока на эти "я". Опять вопрос.. Как различать что идет гудок либо что шилду говорят что я "абонент не абонент" либо что бы когда трубку снимает голосовая почта, что это не я, а голосовая почта? Никак походу? Последнее пока опустим, основной вопрос: "Как определить гудок?")
При звонке на модуль он будет отправлять в сериал слово RING
Что то я нифига нормально не понял)))) "абанент не абонент" это всмысле недоступен сам шилд при звонке?)
Слово RING это понятно, я вообще АТ'шкой включил AT+MORING=1 и отслеживаю "MO RING", "MO CONNECTED" и ещё там какая-то, ещё я отлавливаю BISY и т.д. Но вот у меня оператор Теле2 и подключена голосовая почта, если ардуина мне звонит и я вне зоны действия сети, т.е. "абонент не абонент", автоматом поднимает трубку голосовая почта и ардуина думает что трубку снял я и вот собственно в этом проблема. В голосовой почте через 4 секунды проносится тоновый высокий сигнал, мол записывайте сообщение, так вот можно ли как-то этот сигнал ардуиной определить?
А че просто паузой его не сдвинуть? Ловишь момент когда взяли трубку и через 4 секунды шлешь че надо, а точнее с запасом небольшим - 5секунд к примеру
Теперь я не понял)) Мне нужно что бы ардуина точно знала что она не попала на голосовую почту, что бы бабки впустую не тратила на симке. Т.е. если она мне не дозвонилась, она попробует это ещё раз сделать. Но вот голосовая почта снимает трубку и ардуина думает что она дозвонилась и вот связь у них вот так и висит, пока голосовая почта вызов не отобьет) Так понятнее?