Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

IoT сканер штрих-кода с отправкой результатов в облако

Рассмотрим создание IoT сканера штрих-кодов, который позволит проводить инвентаризацию товаров с отправкой результатов на сервер в сети Интернет и сохранением в базе данных. Сканер штрих-кода GM65 идентифицирует продукт по его штрих-коду. Затем мы вводим количество продукта на сенсорном дисплее Nextion и отправляем его через Wi-Fi на сервер, где вводим его в базу данных. Данное устройство позволяет автоматизировать процесс инвентаризации товаров.

Сканер штрих-кодов GM65

Сканер штрих-кодов GM65 – это с цифровая камера и модуль обработки изображений. На AliExpress в среднем стоит 20$. Он имеет алгоритм, который распознает штрих-коды и QR-коды в поле зрения камеры, и если ему не хватает внешнего освещения, включается встроенная светодиодная подсветка. Для точного наведения на штрих-код сканера предусмотрен световой маркер в виде красной полосы.

Для считывания штрих-кода необходимо поднести его к объективу модуля GM65 на расстояние около 20 см, при считывании раздается характерный сигнал зуммера, как на кассе супермаркета. Для ускорения процесса необходимо выровнять плоскость штрихкода перпендикулярно сканеру. Максимальный угол отклонения составляет 60 градусов.

В режиме по умолчанию сканер штрих-кода подключается к компьютеру по USB, работает как HID-клавиатура и выводит данные в виде строки текста.

Вы можете настроить сканер с помощью команд UART, но гораздо проще использовать сервис QR-кодов: переключать режимы чтения, управлять светодиодом и зуммером, сохранять и сбрасывать настройки, просто ориентируясь на соответствующий QR-код в инструкции устройства. Это позволяет изменять конфигурацию на лету.

Кнопка на плате используется по умолчанию для активации процесса сканирования. Встроенный зуммер сигнализирует об успешном считывании кода и изменениях в работе устройства.

Подключение и настройка сканера штрих-кодов GM65

В качестве контроллера будем использовать плату Arduino MKR 1000 WiFi. Для подключения по UART используем последовательный порт Serial1 платы Arduino MKR 1000 WiFi. Схема подключения сканера штрих-кодов.

Теперь необходимо настроить сканер для нашего проекта. Подключим сканер к компьютеру с помощью USB-кабеля и последовательно считаем коды, показанные на на риcунке ниже

Скетч получения кода со сканера 

// данные, пришедшие из последовательного порта
String inputString = "";        
// все данные получены
boolean stringComplete = false;  
int countstr=0;
// для поиска окончания
unsigned long millisendstr=0;

void setup() {
  // запуск последовательных портов
  Serial.begin(9600);
  Serial1.begin(9600);               
  // резервирование 50 bytes для inputString:
  inputString.reserve(50);
}

void loop() {
  // получение данных по Serial1
  serialScanerEvent();
  // при окончании передачи
  if (stringComplete) {
    Serial.println(inputString);
    // очистить строку
    inputString = "";
    stringComplete = false;
    countstr=0;
  }
  
}

// функция получения данных по Serial1
void serialScanerEvent() {
  //
  if (Serial1.available()>0) {
    // получить байт из буфера:
    char inChar = (char)Serial1.read();
    // добавить в строку:
    inputString += inChar;
    countstr++;
    millisendstr=millis();
  }
  else { // окончание передачи
    if(millis()-millisendstr>1000 && countstr>0) {
       stringComplete=true;
    }
  }
}

Загружаем скетч на плату Arduino и сканируем разные штрих-коды. Данные выводим в монитор последовательного порта

Подключение дисплея Nextion

В качестве дисплея будем использовать сенсорный дисплей Nextion NX3224K024. Дисплей Nextion представляет  собой полноценный компьютер с процессором, видеокартой и экраном, причем он выделяет весь свой вычислительный ресурс на обработку графики и позволяет записывать в него свои программы. На модулях дисплеев Nextion имеется разъем UART и выводы GPIO, что дает возможность использовать дисплеи Nextion как совместно с Arduino — подключая дисплей к Arduino по шине UART (обмен с помощью унифицированных команд), так и отдельно — подключая кнопки, светодиоды, реле и пр. напрямую к выводам GPIO дисплея). Через имеющийся у дисплея Nextion разъем для карт памяти micro-SD в него можно загружать программы.

Для работы с дисплеями Nextion необходимо установить программу Nextion Editor, которая позволяет создавать интерфейс пользователя с использованием различных библиотечных элементов: кнопок, слайдеров, картинок, графики, текста и т. п., а также прописывать алгоритмы поведения дисплея для различных событий элементов, формирующих этот интерфейс.

Загружаем изображения и создаем интерфейс приложения 

Назначьте события Touch Release для отправки команд через последовательный порт при нажатии кнопок

Вы можете просмотреть отправленные коды, запустив отладчик

Для прошивки дисплея через UART понадобится адаптер USB-Serial. Схема подключения Nextion к адаптеру USB-Serial 

Для загрузки прошивки выбираем пункт меню Upload и в открывшемся окне нажимаем на кнопку Go. Процесс прошивки будет отображаться в окошке программы и на дисплейном модуле. По окончании прошивки загружаемый проект начнет выполняться и отображаться на дисплейном модуле. Надо отметить, что прошивка через UART занимает весьма долгое время.

Теперь подключим дисплей Nextion к плате Arduino MKR1000 WiFi. Порт Serial мы используем для связи с компьютером и отладки. Порт Serial1 используем для подключения сканера штрих-кодов. Нам необходим еще один последовательный интерфейс для подключения дисплея Nextion.

Одним из преимуществ новых платформ Arduino является упрощение встроенного программного обеспечения, присваивающего каждому контакту микроконтроллера одну из множества возможных функций. Для добавления дополнительных последовательных интерфейсов (Serial2 и Serial3) к микроконтроллерам SAMD (SERCOM)

 

Рассмотрим как добавить больше последовательных интерфейсов (SERCOM’ов) на плату Arduino, оснащенную микропроцессором SAMD. Эти интерфейсы являются аппаратными и могут быть типов I2CUART и SPI. Подключение дополнительных интерфейсов возможно, поскольку микроконтроллер SAMD имеет шесть встроенных модулей для последовательной коммуникации, которые можно настраивать отдельно друг от друга. На момент покупки платы настроены лишь четыре:

SPI / SERCOM 1:

  • MOSI на контакте 8
  • SCK на контакте 9
  • MISO на контакте 10

I2C / SERCOM 0:

  • SDA на контакте 11
  • SCL на контакте 12

UART / SERCOM 5:

  • RX на контакте 13
  • TX на контакте 14

WINC1500 SPI / SEERCOM 2:

  • MOSI на контакте 26
  • SCK на контакте 27
  • MISO на контакте 29

Поэтому оставшиеся два можно вывести на контакты платы. 

Код для добавления последовательных интерфейсов Serial2 и Serial3.

#include <Arduino.h>                              
#include <wiring_private.h>

#define PIN_SERIAL2_RX       (1ul)                
#define PIN_SERIAL2_TX       (0ul)                
#define PAD_SERIAL2_TX       (UART_TX_PAD_0)      
#define PAD_SERIAL2_RX       (SERCOM_RX_PAD_1)    


#define PIN_SERIAL3_RX       (5ul)                
#define PIN_SERIAL3_TX       (4ul)                
#define PAD_SERIAL3_TX       (UART_TX_PAD_2)      
#define PAD_SERIAL3_RX       (SERCOM_RX_PAD_3)    


// Создание экземпляров Serial
Uart Serial2(&sercom3, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX);
Uart Serial3(&sercom4, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX, PAD_SERIAL3_TX);

void SERCOM3_Handler()    
{
Serial2.IrqHandler();
}
void SERCOM4_Handler()    
{
Serial3.IrqHandler();
}

Для подключения дисплея Nextion сконфигурируем Serial2 на контактах 0 и 1. Схема соединений

При нажатии кнопок на дисплее, по последовательному порту Serial2 плата Arduino получает данные. Необходимо переводить эти данные в количество (для кнопок 0-9), сброс (кнопка *) или отправка данных на сервер (кнопка OK). При изменении количества необходимо отправлять на дисплей последовательности для изменения содержимого элемента n0.

Код получения данных (нажатие кнопок) с дисплея Nextion и отправка данных с Arduino (штрих-код и количество) на дисплей Nextion 

void loop() {
  // 
  serialScanerEvent1(); 
  if (stringComplete1) {
    Serial.println(inputString1);
    Serial2.print("t0.txt=\"");
    Serial2.print(inputString1);
    Serial2.print("\"");
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);        
    // очистить строку
    inputString1 = "";
    stringComplete1 = false;
    countstr3=0;
   }
  serialNextionEvent2(); 
  if (stringComplete2) {
    Serial.println(inputString2); 
    parse_message(inputString2);
    // очистить строку
    inputString2 = "";
    stringComplete2 = false;
    countstr2=0;
   }  
  
}

void serialScanerEvent1() {
  //
  if (Serial3.available()>0) {
    // get the new byte:
    char inChar = (char)Serial1.read();
    // add it to the inputString:
    inputString3 += inChar;
    countstr1++;
    millisendstr1=millis();
  }
  else {
    if(millis()-millisendstr1>1000 && countstr1>0) {
       stringComplete1=true;
    }
  }
}

void serialNextionEvent2() {
  //
  if (Serial2.available()>0) {
    // get the new byte:
    char inChar = (char)Serial2.read();
    // add it to the inputString:
    inputString2 += String(inChar,HEX);
    countstr2++;
    inputString2 += " ";
    countstr2++;
    millisendstr2=millis();
  }
  else {
    if(millis()-millisendstr2>200 && countstr2>0) {
       stringComplete2=true;
    }
  }
} 

Код установки количества продукта при нажатии кнопок

void parse_message(String msg)
  {  
  //Serial.println(msg); 
  // * сброс
  if (msg == "65 0 b 0 ff ff ff ") 
    {  
    counter=0;
    Serial2.print("n0.val=");
    Serial2.print(counter);    
    Serial2.print("");
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);      
    delay(10);  
    }
  // send
  else if (msg == "65 0 c 0 ff ff ff ") 
    {
    Serial2.print("t0.txt=\"send ...\"");
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);    
    delay(10);  
    // **** send data to server
    delay(1000);
    send_data_to_server();
    Serial2.flush();
    //
    Serial2.print("t0.txt=\"wait ...\"");
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);    
    delay(10);  
    counter=0;
    Serial2.print("n0.val=");
    Serial2.print(counter);    
    Serial2.print("");
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);    
    delay(10);  
    }
  // 0
  else if (msg == "65 0 1 0 ff ff ff ") 
    {
    add_count(0);  
    delay(10);  
    }
  // 1
  else if (msg == "65 0 2 0 ff ff ff ") 
    {
    add_count(1);  
    delay(10);  
    }
  // 2
  else if (msg == "65 0 3 0 ff ff ff ") 
    {
    add_count(2);  
    delay(10);  
    }
  // 3
  else if (msg == "65 0 4 0 ff ff ff ") 
    {
    add_count(3);  
    delay(10);  
    }
  // 4
  else if (msg == "65 0 5 0 ff ff ff ") 
    {
    add_count(4);  
    delay(10);  
    }
  // 5
  else if (msg == "65 0 6 0 ff ff ff ") 
    {
    add_count(5);  
    delay(10);  
    }
  // 6
  else if (msg == "65 0 7 0 ff ff ff ") 
    {
    add_count(6);  
    delay(10);  
    }
  // 7
  else if (msg == "65 0 8 0 ff ff ff ") 
    {
    add_count(7);  
    delay(10);  
    }
  // 8
  else if (msg == "65 0 9 0 ff ff ff ") 
    {
    add_count(8);  
    delay(10);  
    }
  // 9
  else if (msg == "65 0 a 0 ff ff ff ") 
    {
    add_count(9);  
    delay(10);  
    }
  else ;  
  }
  
void add_count(int n) {
  if(counter<100) {
     counter=counter*10+n;
     Serial2.print("n0.val=");
     Serial2.print(counter);    
     Serial2.print("");
     Serial2.write(0xff);
     Serial2.write(0xff);
     Serial2.write(0xff);    
     delay(10);  
  }
}

 Подключение платы Arduino MKR 1000 WiFi к интернету.

Для подключения Arduino MKR1000 к сети Wi-Fi мы будем использовать библиотеку WiFi101, которую установим с помощью менеджера библиотек (Sketch Include Include library Manager Manager Libraries).

Скачать эскиз подключения платы Wi-Fi Arduino MK R 1000 к необходимой точке доступа. Загрузите пример из connectWithWPA.библиотека ino на плате, введя данные для вашей точки доступа Wi-Fi во вкладке:

#define SECRET_SID "*********k"
#define SECRET_PASS "********"

После загрузки эскиза откройте монитор последовательного порта, где вы можете наблюдать за процессом подключения платы Wi-Fi Arduino MKR1000 к точке доступа.

 

Код отправки данных на сервер

void send_temp_to_server() {
   client.stop();
   if (client.connect(server, 80)) {
      //// sending data to the server
      // forming a string
      // uid per line
      String str="/firm/get_barcode.php?barcode=";
      str+=String(cardUID[i],HEX);
      str+="&count="+String(temp);
      Serial.print("str=");Serial.println(str);
      client.println("GET "+str+" HTTP/1.1");
      client.println("Host: ************.ru");
      client.println("User-Agent: ArduinoWiFi/1.1");
      client.println("Connection: close");
      client.println();
      Serial.println(response);
      delay(10); }
   else {
      // no connection
      Serial.println("connection failed");
   }
}

Скачать полный скетч можно по ссылке в конце статьи

Получение данных на сервере с занесением в базу данных

Создание базы данных на хостинге (MySQL) и двух таблиц в ней:

  • tovar – продукция и ее штрих-коды;
  • count – результаты инвентаризации.

Структура таблиц 

На сервере создадим php-скрипт get_barcode.php, который получает приходящие со сканера данные и заносит их в базу данных. Содержимое скрипта

<?php

//Параметры MySQL
$location="localhost";
$user="********";
$pass="***************";
$db_name="*****************";

// connect db
if(! $db=mysqli_connect($location,$user,$pass,$db_name))
 {echo "connect error";}
else
 {;}

$query1=" INSERT INTO count SET 
          barcode='".$_GET['barcode']."',
          count='".$_GET['count']."',
          date='".date('Y-m-d H:i:s')."' ";  
if(mysqli_query($db,$query1)){
   echo "#yes";
}
else {
   echo "#no";
}
?>  

Сканируем и проверяем приход и сохранение данных на сервере

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (2) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
+1
Pauk #
Не подскажете, почему может быть такая ошибка: "Uart does not name a type"
Прикрепленный файл: Uart.png
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
Raspberry Pi 2 Мультиметр Mastech MS8239C
вверх