Прайсчекер своими руками на Mega2560- работает больше года!

Тема в разделе "Arduino & Shields", создана пользователем Рамик, 4 фев 2019.

  1. Рамик

    Рамик Нерд

    Было дано задание закупить прайс-чекер для предприятия в котором тружусь.

    Промониторив цены, которые начинаются от 25 т.р. было решено сделать устройство своими руками.

    Абсолютно не зная, что такое ардуино, как её программировать.
    На познание основ и создание прототипа, а также заказ деталей - ушло 2 месяца.
    Установлен в магазине и доработан уже в строю.
    Трудится и по сей день. Никаких нареканий нет.
    Работает словно "автомат Калашникова".
    Ни разу не дал о себе знать.
    Прайс-чекер отправляет/получает данные из 1С (можно через php)
    Прошел год.
    Я позабыл о нем, как вдруг..
    Руководство вспомнило, а почему у нас только одно устройство, "хозяйство" же большое, давай "Ищо".
    Сейчас принимаю решение о модернизации.

    Ставлю следующие задачи:
    1. сборка из деталей в готовое изделие за 10-15 минут.
    2. начальная настройка за 10 минут.
    3. создание индивидуального корпуса
    4. мог с этим справится каждый.

    Долгое время не выкладывал информацию, банально было лень.
    Рекомендую к импортозамещению.

    Также на предприятии работают более 20 "DIY" терминалов сбора данных.
    Отзывы о которых только положительные. До этого использовали дорогие модели ТСД.


    Все вопросы в комментах.
    Код выкладывать стыдно, буду очень признателен каждому кто укажет на ошибки.
    Простите за ролик. Всему учусь на ходу.
     

    Вложения:

    b707 и ZAZ-965 нравится это.
  2. b707

    b707 Гуру

    молодец, только это надо в раздел "Смотрите что я сделал"
     
  3. Рамик

    Рамик Нерд

    Спасибо, буду рад советам гуру. Уверен код очень "грязный"
     
  4. parovoZZ

    parovoZZ Гуру

    Директор что ле? Если бы я в аэропорту где-нить поставил самопальную считку из деталей с алиэкспресса, меня бы вздернули на дыбе тем же вечером.

    И что здесь отечественного О_о
     
  5. b707

    b707 Гуру

    только это вовсе не потому, что детали с Алика - а потому что твой завхоз получает откат от закупок "отечественных" товаров :)
     
  6. Рамик

    Рамик Нерд

    У вас всегда есть выбор! Импортозамещение - не корректное выражение в плане 100%ного его значения слова. Но уверен,то что выпускается в России, содержит детали - made in china
    Я тоже как и вы не рисковал бы жизнями людей, если бы мое устройство как то могло на это повлиять.
     
  7. parovoZZ

    parovoZZ Гуру

    ни угадал ни разу. Надзор был тотальный.
    За 10 лет работы у меня СКУД не встрял ни разу. Был, правда, случай - на серваке погорел БП как раз в период проведения саммита G. Вот это ахтунг был))) Правда, разбора полетов не было - в течение получаса (20 из которых меня везли к серверу) все устранил.
     
  8. parovoZZ

    parovoZZ Гуру

    китай китаю рознь.
    И в России, и в Беларуси электроника выпускается. Но идет исключительно в оборонку и космос.
     
  9. Airbus

    Airbus Радиохулиган Модератор

    Хорошая работа!Вот код.Все нормально.Респект Аффтару!
    Код (C++):
    #include <TFT_HX8357.h> // Hardware-specific library
    #include <SPI.h>
    #include <Ethernet2.h>
    #include <ICMPPing.h>
    #include <avr/wdt.h>
    #include <Fonts/GFXFF/DroidSerifBold18pt8b.h>
    // Invoke library
    TFT_HX8357 tft = TFT_HX8357();
    //****  Сканер  ***
    char FileText;
    String txtMsg;
    int laststatuslevel=0;
    long lastMillisScan = 0;

    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    char server[] = "192.168.150.155";  
    IPAddress ip(192, 168, 150, 229);
    EthernetClient client;
    //**********************ping*****************
    long lastMillisPing = 0;
    int laststatusPing=0;
    IPAddress pingAddr(192, 168, 150, 155); // ip address to ping
    SOCKET pingSocket = 0;
    char buffer [256];
    ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
    //**********************ping*****************
    void welcome()   // *** Вывод приветствия на дисплей ***
    {
      tft.setFreeFont(&DroidSerifBold18pt8b);
      tft.fillScreen(TFT_DARKGREEN);
      tft.setRotation(1);
      tft.setTextColor(TFT_YELLOW);
      tft.setTextSize(2);
      tft.setCursor(40,45);
      tft.println(utf8rus("Добро пожаловать!"));
      tft.setTextColor(TFT_WHITE);
      tft.setTextSize(2);
      tft.setCursor(65,165);
      tft.println(utf8rus("Поднесите товар"));
      tft.setTextSize(2);
      tft.setCursor(125,215);
      tft.println(utf8rus("к сканеру"));
      tft.setFreeFont();
       }
    /* Recode russian fonts from UTF-8 to Windows-1251 */
    String utf8rus(String source)
    {
      int i,k;
      String target;
      unsigned char n;
      char m[2] = { '0', '\0' };

      k = source.length(); i = 0;

      while (i < k) {
        n = source[i]; i++;

        if (n >= 0xC0) {
          switch (n) {
            case 0xD0: {
              n = source[i]; i++;
              if (n == 0x81) { n = 0xA8; break; }
              if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
              break;
            }
            case 0xD1: {
              n = source[i]; i++;
              if (n == 0x91) { n = 0xB8; break; }
              if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
              break;
            }
          }
        }
        m[0] = n; target = target + String(m);
      }
    return target;
    }

    void setup() {
      Serial.begin(9600);
      Serial3.begin(9600);
      Serial.println("Lets GO");
      Ethernet.begin(mac, ip);
      EthernetClient client;
      tft.begin();
      welcome();//вывести приветствие
      //*******************************watchdog************************
      wdt_disable(); // бесполезная строка до которой не доходит выполнение при bootloop
      //*******************************watchdog************************
    }

    void loop(void) {

    if ((millis() - lastMillisPing > 3000)) {   //Каждые 3 секунды ping 155
      lastMillisPing = millis();
      ICMPEchoReply echoReply = ping(pingAddr, 4);
      if (echoReply.status == SUCCESS)
      {
      // при удачном пинге сброс счетчика
       if (laststatusPing == 1) {
                                laststatusPing=0;
                                Serial.println("Wachdog timer OFF");
                                 wdt_disable();
                                }
      Serial.println("ok.");
     
      }
      else
      { //пинг не прошел
    if (laststatusPing == 0) {
                          wdt_enable (WDTO_8S);
                          laststatusPing=1;
                          Serial.println("Watchdog timer ON");
                            }
    if (laststatusPing == 1) {
                          Serial.println("Watchdog Tik Tak Tik Tak");
                            }
                           
                     }
      }



     
      if ((millis() - lastMillisScan > 10000) && (laststatuslevel==1)) {   //Каждые 10 секунд если статус "на экране инфа"
      lastMillisScan = millis();
      welcome();//вывести приветствие
      laststatuslevel=0;
                     }
    if (Serial3.available()) {
    FileText=Serial3.read();
    if (FileText!=13) txtMsg+=(char(FileText));
    if (FileText==13) {
                          txtMsg.replace("\n","");
                          txtMsg.replace("\r","");
                          tft.fillRect(0, 0, 480, 320, TFT_DARKGREEN); //очистить область экрана
                          tft.setTextColor(TFT_WHITE);
                          tft.setCursor(1,28);
                          tft.setTextSize(2);
                          tft.setTextColor(TFT_LIGHTGREY);
                          tft.print(txtMsg);//вывод штрихкода
                          tft.setCursor(1,62);
                          tft.setTextSize(3);
                          tft.setTextColor(TFT_WHITE);
      //****** EthernetClient client;
       if (client.connect(server, 80)) {
        Serial.println("connected");
        // Make a HTTP request:
        Serial.println(String(txtMsg));
       client.println("GET /httpserver/hs/feedback?id=229&price=1&sk="+txtMsg);
       client.println("Connection: close");
       client.println();
        while(client.available() == 0){//Ждем данных с сервера
           Serial.print("*");
           delay(100);
    // выполнить что-то, повторив  раз
       }
       while(client.available() > 0){//Получаем данные с сервера
    // выполнить что-то, повторив  раз
         if (client.available()) {
        char c = client.read();
       // Serial.println(c);
         tft.print(c);
              }
      }
    client.stop();
    }
         txtMsg="";
         laststatuslevel=1;
           Serial.println("Done");
             lastMillisScan = millis();
               
    } // if (FileText==13)

                        }

     
       }
     
  10. ZAZ-965

    ZAZ-965 Гуру

    @Рамик, пару вопросов - 1C выгружает справочник товаров на промежуточный веб сервер? оператором или автоматической обработкой?
    Согласен, хорошая работа. Ждем пост о DIY ТСД.
    PS Я бы взял старый монитор + тонкий клиент со сканером, в 1С базе завел пользователя с правом чтения только справочника товаров + нарисовал бы форму на весь экран для отображения отсканированного товара. А во время простоя выводил бы рекламные ролики с локального диска.
     
  11. Airbus

    Airbus Радиохулиган Модератор

    Еще бы схему и список компонентов.И с согласия Автора тему перенесу в другой раздел "Глядите что я сделал".
     
  12. Рамик

    Рамик Нерд

    Схема проста как 3 копейки. От сканера 5в и Gnd - на соответсвующие пины на меге
    От W5500 все по стандарту. Экран садится по дефолту. Если это важно могу нарисовать. Уверен у вас получится с первого раза.
     
  13. b707

    b707 Гуру

    модель сканера и сколько стоит?
     
  14. Рамик

    Рамик Нерд

    сканер metrologic 9520 - старик, лазерный. Такие в нашей организации уже просто зип.
    Но я нашел сканер оптический, в поднебесной. Цена 1500 руб. Можно и дешевле.
     
  15. Рамик

    Рамик Нерд

    В самом начале при отладке уже в магазине. Были жалобы. Сканируют товар, на экране определился код, но ответа нет. Выяснил причину. Зависание W5500 по "не понятным". Вроде все идеально. Возможно надо использовать витые провода от W5500. Долго не стал думать. Так как выкл/вкл(хардресет) - 1 секунда. Принял решение запустить в скетче watchdog. Т.е. Устройство пингует сервер. И в случае необходимости рестарт. На практике даже не замечаем когда происходит рестарт.
    Прайсчекер установлен близко с рабочим местом продавцов. И судя по отзывам, нет ни одного нарекания на работу устройства. Им они пользуются и сами.
     
    b707 нравится это.
  16. b707

    b707 Гуру

    да что говорить - отличная поделка. И что важно (ИМХО) - реально полезная.
    А то эти вывосанные из пальца проекты типа "мониторинга температуры в сарае" или "проверка показаний электросчетчика на мадагаскаре" порядком поднадоели :)
     
  17. ИгорьК

    ИгорьК Гуру

    И то правда. Надо забабахать проект "учет домашнего хлама по штрих-кодам на бирках".
     
    b707 и parovoZZ нравится это.
  18. parovoZZ

    parovoZZ Гуру

    Вчерашний день. Нет. Даже век. RFID наше все! Зачипуй всё нахер! Носки, трусы, ботинки, посуду, ложки - всё зачиповать!!!
     
  19. b707

    b707 Гуру

    не, мне баркоды ближе :) у меня в лабе 15 лет все на баркодах
     
  20. b707

    b707 Гуру

    ИгорьК - как Вы быстро среагировали :) Телепатия? Я когда писал - про вас думал :)