Текстовой дисплей для удаленной связи с офисом на базе Arduino Uno

Во время работы в течение дня может возникнуть необходимость покинуть офис и оставить сообщение, где я могу находиться. Некоторые сообщения могут начинаться так: “Я отдыхаю. Вернусь 11/20.”, а некоторые в таком виде “Буду в лаборатории 3113”. Иногда я опаздываю со встречи, или лежу дома больной. В таких случаях, нужно указать мое реальное местоположение.

Для подобных случаев я решил использовать Arduino Uno и GSM шилд, которые позволяют отправлять текстовые сообщения в Arduino/GSM. При использовании Arduino, текстовое сообщение извлекается, происходит побитное управление, и далее информация отображается на ЖК-дисплее размером 16 символов × 2 строки, который можно прикрепить к двери офиса. Для крепления дисплея к двери можно использовать кронштейн, изготовленный самостоятельно или распечатать его на 3D-принтере, а также подключить кабель для соединения платы Arduino к ЖК-дисплею.

В данном проекте используется GSM-модуль и программный код для отображения сообщений дисплея. Вы можете выполнить проект в соответствии с вашими потребностями, в особенности касательно места размещения дисплея.

Программный код и сопутствующие файлы для данного проекта располагаются в депозитарии GitHub repository.

Шаг #1: Получение текстового сообщения

  • Подключите GSM шилд к плате Arduino Uno через коннекторы. Установите SIM-карту. Вам потребуется активировать SIM-карту, если она новая.
  • Подключите Arduino к ноутбуку через USB. USB-порт имеет достаточную мощность для выполнения подобного шага.
  • Следуйте инструкциям для получения сообщения для Arduino (GSM пример). По данной сноске вы получите полную информацию по инициализации GSM модема, обнаружении сообщения и извлечения текстового сообщения.
  • Во время запуска примера кода для GSM выполните некоторые модификации. (1) Используйте меры предосторожности, чтобы ваши друзья не разыграли вас с текстовым сообщением. Я добавил проверку, при которой будет отображаться текст лишь из моего мобильного телефона. Другие сообщения будут удаляться. (2) Добавьте код, который будет сверять текстовое сообщение с переменной txtMsg, и определите ее длину, поскольку данную переменную потребуется отображать на дисплее.

// Any messages not coming from my cell number should be discarded.
if( strncmp( senderNumber, myCellNumber, 12 ) != 0 ) // strncmp returns 0 if match
{
Serial.println(«Discarded SMS»); // Diagnostic
sms.flush();
}
else {
// Read message bytes and save them
i = 0;
while( c = sms.read() ) {
Serial.print(c); // Diagnostic
// save the message character by character and keep track how many chars in message
txtMsg[i] = c;
i++;
validMessage = 1; // there is a valid message
}
numChars = i; // the number of characters in txtMsg
}

Одиночный скетч, который имеет все вышеупомянутые изменения, называется ReceiveSMS_modP.ino. Вам потребуется связать переменную myCellNumber с номером вашего мобильного телефона. Она начинается со знака «+».

  • Если у вас возникают проблемы с GSM соединением, тогда необходимо отправить сообщение, которое не будет отображаться, и далее проверить класс GSM Scanner class для оценки, что в реальности происходит в настоящий момент.

Шаг #2: ЖК-дисплей и управление символами

  • Если вы знакомы с основами подключения ЖК-дисплея 16×2 и отображением сообщений, вы можете пропустить данный шаг. Если вы новичок в этом деле, тогда выполните пример Hello World example с сайта Arduino.
  • Примечание: Пример с сайта Arduino предполагает, что используется лишь плата Uno (GSM шилд не подключен). Если присоединить GSM шилд, тогда вам необходимо изменить используемые цифровые выходы для управления дисплеем, поскольку GSM шилд использует два вывода для данного примера. Для этого необходимо откорректировать программный код:

    /* initialize the library with the numbers of interface pins:
    LCD RS pin to digital pin 12
    LCD Enable pin to digital pin 11
    LCD data pin D4 to digital pin 5
    LCD data pin D5 to digital pin 4
    LCD data pin D6 to digital pin 6 // changed for GSM shield
    LCD data pin D7 to digital pin 8 // changed for GSM shield
    */

  • На следующем шаге происходит выполнение кода из примера Hello world (Привет мир). Я добавил текстовое сообщение в первом ряду дисплея в качестве настройки, и также добавил код настройки, который позволяет вводить массив символов с клавиатуры. Это позволит связываться с GSM модемом каждый раз во время проведения коррекции программного кода. Данный подход реализован в SendSMS.ino в примере для Arduino GSM.
  • Функции LCD библиотеки пролистывания не удовлетворяли моим потребностям, поэтому я написал свой код. После нескольких повторов пролистывание заработало так, как мне было нужно. Ниже указан пример программного кода для пролистывания:

    if ( numChars <= 16 ) {
    // message does not need scrolling
    for (i = 0; i < numChars; i++) {
    lcd.setCursor(i, 1); // format is col,row
    lcd.print(txtMsg[i]);
    }
    }
    else {
    // logic for how far to scroll. scroll length of message minus the
    // part that displays at first. q controls number of scroll events.
    for ( int q = 0; q <= numChars — 16; q++) {
    // print out just one char at a time, and repeat for each column
    for (i = 0; i < 16; i++) {
    // send the LCD a set of 16 chars based on position in txtMsg
    // determined by indexing based on q start position.
    lcd.setCursor(i, 1); // i prints to a column
    lcd.print(txtMsg[i+q]);
    if (q == 0 && i == 15) {
    // detects the first 16 chars that are displayed before
    // scrolling begins
    delay(1800); // pause time to read the starting 16 chars
    }
    }
    delay(500); // time for the scroll delay
    }
    }

  • Также имеется фрагмент кода, который скрывает сообщение, а далее сообщение повторяется. StringManipulateLCD_modP.ino – это отдельный скетч, который доступен с проекта по работе с ЖК-дисплеем.

Шаг #3: Общая сборка

  • Теперь вы имеете работающую GSM и ЖК-часть проекта, объединенную с помощью 2-х скетчей, или вы можете загрузить готовый код GSMTextMessage2LCD_modP.ino из депозитария. В отношении аппаратного обеспечения, если ЖК-дисплей подключен к GSM шилду, тогда все подключения выполнены правильно.
  • Настройка Setup() аналогична для тестового скетча GSM шилда. Я добавил средства диагностики, которые отображают несущую сигнала и ее уровень. Несколько начальных GSM сообщений, которые отображаются на дисплее ноутбука, будут дублироваться на ЖК-дисплее. Это полезно при автономной работе проекта без соединения с ноутбуком.

    // include the GSM library
    #include
    // include the LCD library
    #include

    // PIN Number for the SIM
    #define PINNUMBER «» // «» means no PIN is used

    /* initialize the library with the numbers of interface pins:
    LCD RS pin to digital pin 12
    LCD Enable pin to digital pin 11
    LCD data pin D4 to digital pin 5
    LCD data pin D5 to digital pin 4
    LCD data pin D6 to digital pin 6 // changed for gsm shield
    LCD data pin D7 to digital pin 8 // changed for gsm shield
    */
    LiquidCrystal lcd(12, 11, 5, 4, 6, 8); // free pins when GSM shield used

    // initialize the library instances
    GSM gsmAccess;
    GSMScanner scannerNetworks;
    GSM_SMS sms;

    char senderNumber[20]; // char array to hold the number a SMS is retreived from
    char txtMsg[200]; // the text message char array
    int numChars = 0; // number of characters in txtMsg
    int validMessage = 0; // set to 1 when there is a message to display
    char myCellNumber[] = «+XXXXXXXXXXX»; // used for message screening

    void setup()
    {
    // initialize serial communications and wait for port to open:
    Serial.begin(9600);

    // set up the LCD’s number of columns and rows
    lcd.begin(16, 2);

    // connection state
    boolean notConnected = true;

    // provide information to LCD as GSM gets started
    lcd.print(«GSM starting up …»);

    // Start GSM connection
    while(notConnected)
    {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
    notConnected = false;
    else
    {
    lcd.setCursor(0,1); // format is col,row
    lcd.print(«Initializing…»);
    // delay(1000);
    }
    }

    // currently connected carrier
    Serial.print(«Current carrier: «);
    Serial.println(scannerNetworks.getCurrentCarrier());
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(«Current carrier:»);
    lcd.setCursor(0,1);
    lcd.print(scannerNetworks.getCurrentCarrier());
    delay(1000);
    lcd.clear();

    // returns strength and ber
    // signal strength in 0-31 scale. 31 means power > 51dBm
    // BER is the Bit Error Rate. 0-7 scale. 99=not detectable
    Serial.print(«Signal Strength: «);
    Serial.print(scannerNetworks.getSignalStrength());
    lcd.setCursor(0,0);
    lcd.print(«Signal Strength:»);
    delay(1000);
    lcd.setCursor(0,1);
    lcd.print(scannerNetworks.getSignalStrength());
    delay(2000);
    lcd.clear();

    // print one time message to the LCD
    lcd.setCursor(0,0); // format is col,row
    lcd.print(«Where’s TP?»); // first row

    lcd.setCursor(0,1); // format is col,row
    lcd.print(«Waiting for SMS»);
    Serial.println(«Waiting for SMS»); // Diagnostic
    }

  • Цикл Loop() имеет два главных раздела: (1) проверка и сохранение новых текстовых сообщений и (2) вывод фактических текстовых сообщений на ЖК-дисплей и их пролистывание. Скетч проверяет наличие нового текстового сообщения каждый раз при выполнении программного кода.

    void loop()
    {
    char c;
    int i; // char array index of txtMsg
    int validMessage; // set to 1 when there is a message to display

    // If there are any SMSs available()
    if (sms.available())
    {

    // show on display that a text message has been received
    lcd.setCursor(0,1); // format is col,row
    lcd.print(«SMS received»);
    delay(2000);

    // Get remote number
    sms.remoteNumber(senderNumber, 20);
    Serial.println(«Message received from:»); // Diagnostic
    Serial.println(senderNumber); // Diagnostic

    // Any messages not coming from my cell number should be discarded.
    if( strncmp( senderNumber, myCellNumber, 12 ) != 0 ) // strncmp returns 0 if match of 12 chars
    {
    Serial.println(«Discarded SMS»); // Diagnostic
    sms.flush();
    }
    else {
    // Read message bytes and save them
    i = 0;
    while( c = sms.read() ) {
    Serial.print(c); // Diagnostic
    // save the message character by character and keep track how many chars in message
    txtMsg[i] = c;
    i++;
    validMessage = 1; // there is a valid message
    }
    numChars = i; // the number of characters in txtMsg
    }

    // Delete message from modem memory
    sms.flush();
    Serial.println(«MESSAGE DELETED»);

    } // end of if sms.available section

    if ( validMessage ) {

    // now print the message to the LCD.
    // if there is only one row, print it all at once, else
    // do scrolling.
    if ( numChars <= 16 ) {
    for (i = 0; i < numChars; i++) {
    lcd.setCursor(i, 1); // format is col,row
    lcd.print(txtMsg[i]);
    }
    }
    else {
    // logic for how far to scroll
    for ( int q = 0; q <= numChars — 16; q++) {
    // print out just one char at a time, and repeat for each column
    for (i = 0; i < 16; i++) {
    lcd.setCursor(i, 1); // i prints to a column
    lcd.print(txtMsg[i+q]);
    if (q == 0 && i == 15) {
    delay(1800); // time to read the starting 16 chars
    }
    }
    delay(650); // time for the scroll delay
    }
    }

    delay(1000); // time to hold the last line fragment

    // blank out the display after the scrolling has completed to prepare repeat
    for (i = 0; i < 16; i++) {
    lcd.setCursor(i, 1); // format is col,row
    lcd.print(‘ ‘); // blank out the second row
    }

    delay(2000); // time the display is blank

    } // end of if validMessage section

    }

Шаг #4: Крепление к двери

  • На данном шаге мы отключаем дисплей от платы прототипа и прикрепляем его к двери офиса. Для этого потребуются коннекторы и кабели, а также кронштейн для крепления дисплея.
  • Для крепления дисплея размером 16×2 можно использовать готовый кронштейн или изготовить самостоятельно с использованием 3-х мерных технологий.
  • Изготовление кабеля с коннектором обычно является утомительной частью проекта. Я использовал коннекторы Sub-D 9 и 10-выводной кабель для подключения дисплея к плате. Для выполнения данного соединения можно использовать макетную плату для подключения Arduino/GSM шилда к кабельному разъему. Данная схема подключения аналогична схеме подключения к плате прототипа с ЖК-дисплеем, за исключением коннекторов.
  • Кронштейн дисплея прикрепляется к двери с помощью клейких прозрачных лент. Это позволит прикрепить дисплей на несколько недель.
  • В отличие от использования прототипа, пришлось поменять дисплей на ЖК-дисплей с голубой подсветкой. Первый дисплей (зеленый с черными символами) было трудно распознавать после прикрепления к двери. Голубой дисплей решил данную проблему.
  • Вы можете изготовить различное крепление и выполнить электрическое подключение в зависимости от требуемого места расположения дисплея.

Оригинал статьи

Добавить комментарий

Ваш адрес email не будет опубликован.