SIM900 и Arduino
- Войдите на сайт для отправки комментариев
Чт, 20/05/2021 - 13:20
#include <Keypad.h> // Подключаем библиотеку
#include <LiquidCrystal.h> // Подключаем библиотеку
#include <SoftwareSerial.h>
// Создать объект программного последовательного порта для связи с SIM900
// Tx и Rx SIM900 подключены к выводам 7 и 8 Arduino
SoftwareSerial SIMModule(7, 8);
LiquidCrystal lcd(12, 11, 10, 6, 5, 4);
byte zamokcl[8]={0,14,17,17,31,27,27,31};
byte zamokop[8]={ 14,17,17,1,31,27,27,31};
const byte ROWS = 4; // 4 строки
const byte COLS = 4; // 4 столбца
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
String number="+7";
byte rowPins[ROWS] = {A5,A4,A3,A2}; // пины строк
byte colPins[COLS] = {A0,A1,2,3}; // пины столбцов
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
char a, cmp_com, bit_ok;
void setup()
{
lcd.begin(16, 2); // Инициализирует LCD 16x2
lcd.print("Init SIM");
pinMode(9,OUTPUT);
digitalWrite(9,HIGH);
delay(1000);
digitalWrite(9,LOW);
lcd.createChar(4, zamokcl);
lcd.createChar(5, zamokop);
Serial.begin(9600); // скорость обмена с терминалом
SIMModule.begin(9600); // Начать последовательную связь Arduino и SIM900
lcd.setCursor(0,0); // поставить курсор LCD на первую строку и первый символ
SIMModule.println("AT");
updateSerial();
lcd.print("Press * to start");
}
void loop()
{
updateSerial();
char key = keypad.getKey(); //получить символ с нажатой клавиши
if (key && number.length()<12){PrepareNumber(key);}
else if (number.length()==12)
{
if (key=='D'){PrepareNumber(key);}
if (key == 'A'){StartCall();}
}
}
void StartCall()
{
SIMModule.println("AT+CPAS\r\n");
int8_t s = SIMModule.read();
Serial.println(s);
if(SIMModule.read()==2)
{
SIMModule.println("ATA\r\n");
}
String call = "ATD"+number+";\r\n";
Serial.println(call);
SIMModule.println(call);
lcd.clear();
lcd.print("Calling");
lcd.setCursor(0,1);
lcd.print(number);
}
/****
DEBUG
****/
void updateSerial()
{
delay(50);
while (Serial.available())
{
// Пересылка того, что было получено с аппаратного последовательного порта,
// на программный последовательный порт
SIMModule.write(Serial.read());
}
while(SIMModule.available())
{
// Пересылка того, что было получено с программного последовательного порта,
// на аппаратный последовательный порт
Serial.write(SIMModule.read());
}
}
void PrepareNumber(char key)
{
byte oz = 100;
switch (key)
{
case '*':
number="+7";
delay(oz);
break;
case '1':
number+="1";
delay(oz);
break;
case '2':
number+="2";
delay(oz);
break;
case '3':
number+="3";
delay(oz);
break;
case '4':
number+="4";
delay(oz);
break;
case '5':
number+="5";
delay(oz);
break;
case '6':
number+="6";
delay(oz);
break;
case '7':
number+="7";
delay(oz);
break;
case '8':
number+="8";
delay(oz);
break;
case '9':
number+="9";
delay(oz);
break;
case '0':
number+="0";
delay(oz);
break;
case 'D':
delay(oz);
if (number.length()==2) return;
String subnam ="";
for(int i=0;i<number.length()-1;i++)
{
subnam+=number[i];
}
number=subnam;
break;
}
UpdateDisplay();
}
void UpdateDisplay()
{
lcd.clear();
lcd.print("Ha6op HoMepa:");
lcd.setCursor(0,1);
lcd.print(number);
}
Доброго времени суток, подскажите, как организовать правильное считывание ответа от SIM900 по типу команды "AT+CPAS" , в ответ получаем "+CPAS: 0 OK"(ок на второй строке) по сути необходима лишь цифра , которая находится в конце первой строки ( в некоторых случаях две цифры через запятую). Вчера весь вечер листал интернет , но так и не понял как это сделать (необходимо периодически узнавать есть ли входящий звонок или разговаривают ли в данный момент через него)
sscanf
Если возникают такие вопросы, то почему не взять готовую библиотеку для SIM900? Благо, их девать некуда хороших и разных. Вот только первые три результата поиска
1. https://github.com/amperka/gprs-shield
2. https://github.com/MarcoMartines/GSM-GPRS-GPS-Shield
3. https://iarduino.ru/file/112.html
Разбирать строку руками и чтобы при этом ещё и не остановить намертво всё остальное - не так-то просто. Если Вы хотите этому научиться, то, конечно, но будьте готовы - эта задача займёт от месяца и больше (хотя, само по себе, полезно).
Я был бы не против в этом освоиться получше, но , к сожалению , до защиты диплома меньше месяца. а про готовую библиотеку я не подумал, благодарю, пойду разбираться в них и писать код дальше.
А можно ли к
заменить на
А потом проверять ее методами класса String?
А можно ли к
заменить на
А потом проверять ее методами класса String?
Можно всё, но не так.
Судя по вопросам, которые ТС задаёт (и не только в этой теме), он не понимает в этом НИ ХРЕНА, а потому, меньше чем за несколько месяцев ему этого не сделать. Никак.
Viktor5252,
вариантов у Вас два - найти готовое или заказать за деньги. Других вариантов нет.
Хотя, есть ещё один вариант - отказаться пока от защиты диплома, продолжить обучение и таки чему-нибудь научиться, а тогда уж всё сделать и защитить диплом, но Вы же не считаете это вариантом, правда?
ЕвгенийП, это уже другой человек.
Лето, дача, шашлыки - понимаю... ))
Виноват :-(((
Сейчас поправлю пост
Лето, дача, шашлыки - понимаю... ))
У меня нет дачи. Шашлыки я жарю во дворе своего дома возле беседки - вот в этом сезоне купил большой стационарный мангал с крышей и всеми делами.
А крышу мне сегодня снесли два письма, которые по е-мэйлу пришли. Одно от Илона Маска, а второе от Исуса Христа. В обоих предлагается срочно ознакомиться с предложением, которое изменит мою жизнь к лучшему и ответить на него. Само предложение приложено и имеет иконку Adobe Reader и название VIPOnlyUniqueProposal.PDF.exe Предлагается просто кликнуть на него, оно откроется, изучить и срочно, до конца дня, ответить.
Я вот всё думаю, в детстве мне даже сраный Дед Мороз на письма не отвечал, а тут такое счастье сразу привалило - и Христос, и Маск по своей инициативе мне написали. Чем заслужил? Откуда такая карма?
Спрашиваю для себя на будущее. На текущий момент моего разумения я использовал бы такое решение или просто парсил массив s[], что тут не так?
String s1=String(SIMModule.read());
ну, и и какой в этом смысл? Получили байт, запихали в String, получите новый - этот затрётся, дальше-то что?
Спасибо
Лучше уж тогда так:
String data = ""; while (SIM900.available()) { data += String(SIM900.read()); } // parsing