Отправка смс сообщений с помощью Arduino и Siemens S45

Не так давно я узнал о замечательном микроконтроллере 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=»Скачать скетч»]

[download id=»54″]

[/stextbox]
Отправка смс сообщения осуществляется через Serial Monitor. Задаем номер телефона и текст сообщения одной строкой.
На скриншоте ниже:
1) Служебная метка sms.
2) Номер мобильника в формате pdu (скачать программу для конвертации телефона и текста в pdu формат).
3) Текст сообщения.
Синтаксис с запятыми обязательно соблюдать.

Данную связку — телефона и микроконтроллера Arduino можно применить в различных проектах. Например сигнализации, оповещении обонента при срабатывании различных датчиков.

37 комментариев к “Отправка смс сообщений с помощью Arduino и Siemens S45”

  1. Оооо, у меня как раз есть используемый Sony Ericsson, правда без дисплея. Есть ли возможность,помимо отправки сделать приём и удаление смс? Т.к. на телефоне ограничение в 100 смс

  2. «обонента»->»Абонента» 🙂
    А я решил уйти от корпуса телефона… разобрал свой старенький c25 но времени на сборку проекта пока нет 🙁 так и лежит куча деталей 🙁

  3. Может поможет, кусок кода который удаляет СМС

    ##### Удаляем обработанную смс #####
    $string =»AT+CMGD=$j\r»;
    $Port->write($string);
    $temp=»»;
    while ($temp ne «K»)
    {
    $temp=$Port->read(1);
    }

    j — это номер удаляемой смс

  4. Здравствуйте, полезный пост. Сейчас занят таким же устройством.

    Проясните, пожалуйста, как опытный, следующую ситуацию:
    Согласно документации http://freeduino.ru/arduino/spec.html:
    «… Если вы хотите подключить внешние устройства к выводам 1 или 2, то вы должны помнить, что эти выводы совмещены с цепями, работающими в режиме обмена по USB/COM каналу. Поэтому в момент записи программы и при других операциях обмена данными с компьютером внешние цепи нужно будет отключать. …»

    Таким образом, у Вас все таки есть управление по serial порту (usb порт ардуины) , в ответ на которое ардуина отправляет ат-команды на мобильник?

    Вообще, мой проект в следующем:
    -управление ардуиной по Ethernet shield — у
    -ардуина отправляет at-команды на мобильник

    таким образом, возможен мой вариант? а то приведенная мной цитата, меня немного насторожила:)
    Заранее спасибо за ответ:)

    • При заливке скетча на ардуину через usb надо будет отключить мобильник от неё… (1,2 цифровые пины должны быть свободны)

      • про скетч я понял.
        Вы когда по сериалу отправляете с ПК номер телефона, у Вас мобильник подключен ?

        то есть переферия ПК->arduino->мобильник работает без отключений и вы можете на лету задавать на какой номер слать смс с ПК?

        Заранее спасибо за ответ:)

  5. Разве выхтду ардуино на телефон должны быть с этих пинов?рх и тх у ардуино 0 и 1 пины. а у вас 2 и 3

    • Библиотека — NewSoftSerial.h создает serail-интерфейс из любых цифровых пинов Arduino. У меня все верно. :bomb:

        • погуглил. судя по первому абзацу тут http://arduino.ru/Reference/Serial, можно предположить, что тогда бы нужно было мучиться с отсоединением телефона от ардуино во время работы компа с ардуино.

          • Да именно так. Хардварный UART используется для работы с Serial монитором. А Софтварный (Software Serial) для соединения с телефоном.

  6. у меня не хочет данная система соединяться. может ли быть причина в слишком большом сопротивлении r2? и можно ли вообще обойтись без сопротивлений?если нет, то для чего они конкретно тут — для подстраховки?
    заранее спасибо.

      • сименс ведь принимает по этим каналам максимум 3.3 вольт? а ардуино передает сколько? 5? сопротивление только для этого? что бы не сжечь телефон. да?

        • Я уже ответил выше. Телефон подключенный напрямую без сопротивлений у меня просто напросто переходил в режим поиска сети.

  7. У симнса логические уровни 3.3в, а у ардуины 5в, по уму лучше использовать микросхему преобразователь уровней сигнала, у меня такой нет, а в варианте с резисторами не получилось, толи что-то неправильно делаю, толи сопротивления не те, толи вобще контакты телефона не те, у меня Siemens C62, может подскажет кто? Зато Siemens mc35i через мс max232cpe у меня норм подключился и пашет, вот только с PDE не до конца понятно. 🙁

    • с сименсом с62 у вас схема не заработает никогда, т.к. С62 — это эрикссон ОДМ. Ищите другой телефон.

  8. Доброго времени суток!

    У меня версия ИДЕ 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, не помогло!

  9. Вопрос: Вы предложили сделать кабель передачи данных на телефон из зарядного устройства. А как вы решили проблему необходимости периодической зарядки телефона? Или телефон нормально заряжается при подключении к контроллеру через «бывший» кабель питания?

    • Мой С60 отказался заряжаться от контроллера так же как и у автора. причина скорее всего в том, что зарядка выдает 7,2 вольта, а ардуино 5. попробовал подключить от кроны, телефон начал заряжаться.

      З.Ы. обращайте внимание на распиновку телефона. у меня она оказалась отличной от приведенной здесь

Обсуждение закрыто.