Не так давно я узнал о замечательном микроконтроллере Arduino у которого просто впечатляющие возможности по управлению различными периферийными устройствами (сенсоры, датчики, сервоприводы, светодиоды, реле и т.д.). Человек который далек от электроники, может с легкостью сделать простые схемы. Среда разработки Arduino IDE с упрощенным языком C, позволяет даже новичку понять принципы программирования, превращает занудный и сложный код C в легкий и доступный. Спасибо огромное моему коллеги Алексею, за предоставление в постоянное пользование телефона Siemens S45, с помощью которого мы и будем посылать сообщения.
Для начала нужно приобрести или сделать самому Data-кабель. Я сделал кабель из зарядного устройства, которое шло в комплекте с телефоном. В разъеме у меня не хватало 5го и 6го контакта. Пришлось разобрать похожий разъем от другого сименса и добавить в свой. Операция заняла чуть больше 20 минут. Старые разъемы можно легко разбирать в отличии от современных из цельно-литого пластика.
Следующим этапом идет подключение телефона Siemens S45 непосредственно к микроконтроллеру Arduino по схеме приведенной ниже:
Как видно по схеме ничего сложного нет. В своем варианте я отдельно подключаю питание к телефону от оригинального блока питания, так как телефон отказывался заряжаться от Arduino.
Теперь осталось загрузить наш скетч и попробовать отправить тестовое смс.
[php]
#include <NewSoftSerial.h>
#include <string.h>
NewSoftSerial mySerial(2, 3);
#define num_to_char(number) ((number) < 10 ? \
(‘0’ + (number)) : \
((‘A’ — 10) + (number)) )
#define first_four(byte) (0x0F & (byte))
#define last_four(byte) ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte) num_to_char( last_four(byte))
#define hexdump_b(byte) num_to_char(first_four(byte))
char inData[100];
char unitID_in[10];
char telnumb_in[14];
char textsms_in[100];
void setup()
{
Serial.begin(9600);
Serial.println("Go SMS Send");
mySerial.begin(9600);
}
void loop()
{
int i=0;
char buffer[100];
//если есть данные — читаем
if(Serial.available()){
delay(100);
//загоняем прочитанное в буфер
while( Serial.available() && i< 99) {
buffer[i++] = Serial.read();
}
//закрываем массив
buffer[i++]=’\0’;
}
//если буфер наполнен отправляем смс
if(i>0){
//разбираем буфер на части отделенные запятой через сериал монитор отправляем — sms,19731429764F4,text sms
sscanf(buffer, "%[^’,’],%[^’,’],%[^’,’]", &unitID_in, &telnumb_in, &textsms_in);
if ((String)unitID_in == "sms"){ //определяем команду отправки смс
char *indata=textsms_in;
send_sms(indata);
unitID_in [0] = ‘\0’;
telnumb_in [0] = ‘\0’;
}
}
}
void send_sms(char *data)
{
size_t data_length, x;
char c, l;
long i;
long n;
data_length = strlen(data);
i = data_length * 7;
if (i & 0x07) i = (i & ~0x07) + 0x08;
i = i / 8;
mySerial.println("AT+CMGF=0");
delay(50);
mySerial.print("AT+CMGS=");
delay(50);
mySerial.println(i + 14);
delay(50);
mySerial.print("0011000B9");
delay(5);
mySerial.print(telnumb_in);
delay(5);
mySerial.print("0000AA");
hexdump_byte(data_length & 0xFF);
l = 0;
n = 0;
for (x = 0; x < data_length; x++)
{
if (data[x] == ‘$’) data[x] = 0x02;
n |= (data[x] & 0x7F) << l;
l += 7;
if ( l >= 8 )
{
hexdump_byte(n & 0xFF);
l -= 8;
n >>= 8;
}
}
if (l != 0)
{
hexdump_byte(n & 0xFF);
}
mySerial.write(26);
}
void hexdump_byte(unsigned char byte)
{
mySerial.print(hexdump_a(byte), BYTE);
mySerial.print(hexdump_b(byte), BYTE);
}
[/php]
[stextbox id=»custom» caption=»Скачать скетч»]
[/stextbox]
Отправка смс сообщения осуществляется через Serial Monitor. Задаем номер телефона и текст сообщения одной строкой.
На скриншоте ниже:
1) Служебная метка sms.
2) Номер мобильника в формате pdu (скачать программу для конвертации телефона и текста в pdu формат).
3) Текст сообщения.
Синтаксис с запятыми обязательно соблюдать.
Данную связку — телефона и микроконтроллера Arduino можно применить в различных проектах. Например сигнализации, оповещении обонента при срабатывании различных датчиков.
Оооо, у меня как раз есть используемый Sony Ericsson, правда без дисплея. Есть ли возможность,помимо отправки сделать приём и удаление смс? Т.к. на телефоне ограничение в 100 смс
Также думаю над этим вариантом, но пока не знаю как это реализовать. Нужно изучать AT-команды. Возможно это поможет.
«обонента»->»Абонента» 🙂
А я решил уйти от корпуса телефона… разобрал свой старенький c25 но времени на сборку проекта пока нет 🙁 так и лежит куча деталей 🙁
Может поможет, кусок кода который удаляет СМС
…
##### Удаляем обработанную смс #####
$string =»AT+CMGD=$j\r»;
$Port->write($string);
$temp=»»;
while ($temp ne «K»)
{
$temp=$Port->read(1);
}
…
j — это номер удаляемой смс
Кавычки заменились, если что
не картинок!
Исправил. Что то hostingkartinok.com глючит.
Заливать лучше на offby.com сам им пользуюсь, кстати жду сейчас с ebay ардуину, рпиедет как раз попробую, есть одна идейка у меня правда sl42 но там думаю команды те же. Или не те же?
Да, команды те же.
Здравствуйте, полезный пост. Сейчас занят таким же устройством.
Проясните, пожалуйста, как опытный, следующую ситуацию:
Согласно документации http://freeduino.ru/arduino/spec.html:
«… Если вы хотите подключить внешние устройства к выводам 1 или 2, то вы должны помнить, что эти выводы совмещены с цепями, работающими в режиме обмена по USB/COM каналу. Поэтому в момент записи программы и при других операциях обмена данными с компьютером внешние цепи нужно будет отключать. …»
Таким образом, у Вас все таки есть управление по serial порту (usb порт ардуины) , в ответ на которое ардуина отправляет ат-команды на мобильник?
Вообще, мой проект в следующем:
-управление ардуиной по Ethernet shield — у
-ардуина отправляет at-команды на мобильник
таким образом, возможен мой вариант? а то приведенная мной цитата, меня немного насторожила:)
Заранее спасибо за ответ:)
При заливке скетча на ардуину через usb надо будет отключить мобильник от неё… (1,2 цифровые пины должны быть свободны)
про скетч я понял.
Вы когда по сериалу отправляете с ПК номер телефона, у Вас мобильник подключен ?
то есть переферия ПК->arduino->мобильник работает без отключений и вы можете на лету задавать на какой номер слать смс с ПК?
Заранее спасибо за ответ:)
Да именно так :bomb:
Разве выхтду ардуино на телефон должны быть с этих пинов?рх и тх у ардуино 0 и 1 пины. а у вас 2 и 3
Библиотека — NewSoftSerial.h создает serail-интерфейс из любых цифровых пинов Arduino. У меня все верно. :bomb:
А чем не устроили стандартные пины?
погуглил. судя по первому абзацу тут http://arduino.ru/Reference/Serial, можно предположить, что тогда бы нужно было мучиться с отсоединением телефона от ардуино во время работы компа с ардуино.
Да именно так. Хардварный UART используется для работы с Serial монитором. А Софтварный (Software Serial) для соединения с телефоном.
у меня не хочет данная система соединяться. может ли быть причина в слишком большом сопротивлении r2? и можно ли вообще обойтись без сопротивлений?если нет, то для чего они конкретно тут — для подстраховки?
заранее спасибо.
Попробуйте без сопротивлений. У меня без них телефон отказывался ловить сеть.
сименс ведь принимает по этим каналам максимум 3.3 вольт? а ардуино передает сколько? 5? сопротивление только для этого? что бы не сжечь телефон. да?
Я уже ответил выше. Телефон подключенный напрямую без сопротивлений у меня просто напросто переходил в режим поиска сети.
У симнса логические уровни 3.3в, а у ардуины 5в, по уму лучше использовать микросхему преобразователь уровней сигнала, у меня такой нет, а в варианте с резисторами не получилось, толи что-то неправильно делаю, толи сопротивления не те, толи вобще контакты телефона не те, у меня Siemens C62, может подскажет кто? Зато Siemens mc35i через мс max232cpe у меня норм подключился и пашет, вот только с PDE не до конца понятно. 🙁
с сименсом с62 у вас схема не заработает никогда, т.к. С62 — это эрикссон ОДМ. Ищите другой телефон.
Доброго времени суток!
У меня версия ИДЕ 1.0.1, при компиляции проэкта происходит ругань на
mySerial.print(hexdump_a(byte), BYTE);
mySerial.print(hexdump_b(byte), BYTE);
:
As of Arduino 1.0, the ‘BYTE’ keyword is no longer supported.
Please use Serial.write() instead.
Подскажите как правильно исправить?!
Убери «, BYTE » из этих строк и все заработает.
Мне еще пришлось сменить название библиотеки NewSoftwareSerial
Иван, у меня такая же проблема,пробовал убирать слова BYTE, не помогло!
Вопрос: Вы предложили сделать кабель передачи данных на телефон из зарядного устройства. А как вы решили проблему необходимости периодической зарядки телефона? Или телефон нормально заряжается при подключении к контроллеру через «бывший» кабель питания?
Мой С60 отказался заряжаться от контроллера так же как и у автора. причина скорее всего в том, что зарядка выдает 7,2 вольта, а ардуино 5. попробовал подключить от кроны, телефон начал заряжаться.
З.Ы. обращайте внимание на распиновку телефона. у меня она оказалась отличной от приведенной здесь