This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags
Nothing to show
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Cancel Create
- Local
- Codespaces
HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Складской учет в Excel. Программа Склад: Продажи
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
6b267d8 Oct 21, 2020
Git stats
Files
Failed to load latest commit information.
Latest commit message
Commit time
README.md
Данное приложение — модель системы ведения учета на небольшом складе. Раньше, когда занимался языком Java, я уже делал что-то подобное (Warehouse), но с использованием Swing и JDBC. Теперь я решил повторить работу, но на другом уровне с использованием других технологий — Python и JS. И бэк- и фронт- часть написаны с нуля и самостоятельно.
Бэкенд работает на Django (использована версия 3.1) и Django Rest Framework (3.11.1) и разбит на два приложения: main и api. Первое предназначено для хранения моделей и размещения контроллеров, отдающих пользователю запрашиваемые страницы. Приложение api реализует функции api, выполнющие отельные запрашиваемые операции (такие, например, как построение отчетов, проведение документов, импорт данных).
Кроме того, я создал несколько django-команд, которые использовал для непосредственного тестирования работы интерфейса. Это команды:
- clear_base (полная очистка БД)
- load_test_products (загрузка тестового справочника товаров из xls-файла)
- load_test_contractors (загрузка тестовго справочника контрагентов)
- load_test_documents (создание тестовых документов)
- load_storage_items (загрузка начальных остатков)
- create_test_base (команда, объединяющая функциональность всех вышеперечисленных)
Также юнит-тестами покрыта критическая функциональность api: проведение и отмена проведения документов и формирование отчетов.
Для фронт-части я использовал jQuery, который изучал параллельно с работой над проектом и, чтобы обучение шло более эффективно, я старался делать основной упор при формировании страниц именно на jQuery. То есть вместе со страницей загружаются скрипты, которые затем запрашивают данные для страницы (например, список документов) и формируют на основе этих данных контент страницы.
Легкая программа для управления складом USU
Работа с приложением
Вход и различия в доступной функциональности
Страница входа. При входе в приложение формируется токен, который сохраняется в local storage и затем используется для обращения ко всем функциям api
После входа пользователь попадает на главную страницу с меню выбора действий. Если пользователь зарегистрирован в системе как superuser для него доступен ряд дополнительных действий, к которым не могут обращаться другие пользователи:
- Администрирование (вход на стандартную страницу администрирования Django)
- Удаление помеченных объектов
- Импорт справочника товаров
- Управление остатками
Обычный пользователь не видит этих пунктов меню и может только просматривать остатки на складе, не имея возможность изменять их вручную:
В справочнике доступен поиск товаров по наименованию и номеру товара. Также можно создавать товары, редактировать их, помечать на удаление, сортировать выводимые элементы по различным признакам (порядок сортировки изменяется щелчком по заголовкам столбцов).
Функциональность данного справочника аналогичная функциональности справочника товаров.
На этой странице пользователь может просматривать список документов (доступна фильтрация и сортировка списка по различным критериям) или отдельные документы, а также создавать приходные и расходные документы.
При создании расходного документа товары выбираются из имеющихся на складе.
Сводный отчет по базе данных:
Отчет по движениям товаров:
Для этого отчета доступны фильтры по дате и номеру/наименованию товара:
Если щелкнуть на строчке отчета, то можно получить сводную информацию по операциям с контрагентами по данному товару:
Отчет по операциям с контрагентами похож по структуре на отчет по операциям с товарами:
Также, если щелкнуть на строчку отчета можно получить информацию об операциях данного контрагента в разрезе товаров:
Также можно скачать список товаров и контрагентов в формате xls:
Удаление помеченных объектов
При выборе этого пункта происходит удаление всех помеченных объектов, для которых эта операция выполнима (нельзя удалить, например, проведенные документы, а также товары и контрагентов, на которые есть ссылки в документах).
В меню «Сервис» доступна возможность импорта справочника товаров из файла xlsx. Импортированные товары будут добавлены к уже имеющимся в справочнике.
С помощью данного раздела приложения можно решать две задачи:
- Просматривать текущие остатки (доступна возможность поиска по номеру и наименованию)
- Редактировать и добавлять остатки (если пользователь помечен как superuser)
Здесь отображаются операции, совершаемые пользователями приложения в порядке убывания даты их выполнения (самая последняя операция всегда вверху списка)
В тестовой базе данных, размещенной в данном репозитории созданы два пользователя:
- admin (пароль admin)
- ironman (пароль tk796799)
Приложение тестировалось на Windows 10 x64
About
Система ведения учета на небольшом складе
Источник: github.com
Система складского учета
Вы ведете деятельность, связанную с товарооборотом: обработку поступлений и списаний товаров, фиксацию остатка товаров на складе. Бипиум автоматизирует процесс складского учета товаров, позволяя хранить весь остаток по товарам в одном месте. Вы можете в один клик формировать операции поступления или списания и фиксировать их для быстрого доступа к истории всех таких операций.
Принцип работы
Параметры товаров хранятся в каталоге «Товары». При создании записи в каталоге «Операции с товарами» для выбранных товаров производятся операции поступления или списания, изменяя их остаток на складе. При этом:
- Если товара на складе (каталог «Склад») еще нет – то при поступлении он появится на складе.
- Если остаток по товару меньше чем число списания, то товар списан не будет.
- Если производится попытка произвести операцию из записи, откуда она уже была проведена, то сценарий запрета не даст это сделать.
- Для указанных на схеме каталогов есть сценарии генерации наименования.
Реализация
Структура каталогов
Каталог «Товары»
Создайте каталог «Товары». В этом каталоге будут собраны все товары с их атрибутами. В качестве примера для товаров оставлены два ключевых атрибута: наименование и цена. Пример структуры каталога:
- Наименование (текст)
Описание: Наименование товара, например «Шоколадный батончик».
Описание: Цена за единицу товара.
Настройки: Укажите единицу измерения.
Кроме указанных полей, вы можете добавить любые другие, если это необходимо.
Каталог «Склад»
Создайте каталог «Склад». В этом каталоге фиксируется остаток товаров на складе. Пример структуры каталога:
- Наименование (текст)
Описание: Наименование товара в складе. Будет автоматически сгенерировано сценарием.
Настройки: Текст, редактируемое только через API.
Описание: Связь с каталогом «Товары», нужна для выбора товара.
Настройки: Связь с каталогом «Товары».
Описание: Хранит остаток товара на складе.
Настройки: Укажите единицу измерения.
Кроме указанных полей, вы можете добавить любые другие, если это необходимо.
Каталог «Товары и количество»
Создайте каталог «Товары и количество». Это служебный каталог, который содержит в своей записи товар и его количество. Записи в этом каталоге создаются через каталог «Операции с товарами». Заполните структуру каталога следующим образом:
- Наименование (текст)
Описание: Наименование записи. Будет автоматически сгенерировано сценарием.
Настройки: Текст, редактируемое только через API.
Описание: Связь с каталогом «Товары». Нужна для выбора товара в записи.
Настройки: Связь с каталогом «Товары».
Описание: Содержит число выбранного товара в записи.
Описание: Логическое разделение заполняемых и системных полей.
Описание: Связь с каталогом «Операции с товарами», откуда будут создаваться записи в каталоге «Товары и количество».
Настройки: Связь с каталогом «Операции с товарами», редактируемое только через API.
Каталог «Операции с товарами»
Создайте каталог «Операции с товарами». Этот каталог производит списание/начисления выбранных товаров на склад в заданном количестве. Заполните структуру каталога следующими полями:
- Наименование (текст)
Описание: Наименование записи операции. Генерируется автоматически сценарием.
Настройки: Многострочный текст.
Описание: Используется для выбора между поступлением и списанием.
Варианты: Поступление, Списание.
Описание: Дата операции.
Описание: Связь с каталогом «Товары и количество», используется для выбора товаров и их количества для совершения операции.
Настройки: Связь с каталогом «Товары и количество», можно связывать несколько записей, убрать галочку «можно выбирать из существующих», проставить галочку «создание без всплывающего окна», расширенные поля: «Товар» (изменять), «Количество» (изменять).
Описание: Документы, связанные с операцией (напр. накладные)
Настройки: Можно загрузить несколько файлов.
Описание: Разделение полей с результатами операции.
Описание: Статус завершенности операции.
Варианты: Готово, Ошибка.
Настройки: Редактируемое только через API.
Описание: Сообщение ошибки.
Настройки: Многострочный текст, видимость по значению статуса «Ошибка».
Описание: Разделение полей с системной информацией.
Описание: Время создания записи.
Настройки: С временем, по умолчанию: текущая дата, редактируемое только через API.
Описание: Сотрудник, создавший запись.
Настройки: По умолчанию: текущий сотрудник, редактируемое только через API.
Создание автоматизаций
Генерация наименований
В процессе архитектуры складского учета вы можете столкнуться с необходимостью генерировать наименования созданных записей. О том зачем это нужно и как это реализовать подробно описано в статье «Создание наименований записей».
Наименования нужно генерировать в следующих каталогах:
- Склад
- Товары и количество
- Операции с товарами
Наименования в каталоге «Склад»
В системном каталоге «События» создайте новую запись и заполните ее следующим образом:
Это событие будет отслеживать сохранение записи при редактировании полей «Товар» и «Остаток». Из этих полей будет генерироваться наименование. В качестве сценария загрузите сценарий генерации наименования в каталоге «Склад».
Сценарий генерации наименования в каталоге «Склад» выглядит следующим образом:
- Генерацию наименования компонентом «Формируем тайтл»
- Запись наименования компонентом «Прокидываем тайтл в текущую запись»
В сценарии нужно изменить компоненты:
Измените тестовые id полей в компоненте, согласно его описанию.
Изменить шаблон наименования можно в компоненте «Формируем тайтл»
Наименования в каталоге «Товары и количество»
В «Событиях» создайте новую запись и заполните ее следующим образом:
Это событие будет отслеживать сохранение записи при редактировании полей «Товар» и «Количество». Из этих полей будет генерироваться наименование.
Сценарий генерации наименования в каталоге «Товары и количество» выглядит следующим образом:
Принцип работы сценария полностью аналогичен предыдущему.
В сценарии нужно изменить компоненты:
- fields: Измените тестовые id полей в компоненте, согласно его описанию.
Изменить шаблон наименования можно в компоненте «Формируем тайтл».
Наименования в каталоге «Операции с товарами»
В «Событиях» создайте новую запись и заполните ее следующим образом:
Это событие будет отслеживать создание записи в каталоге «Операции с товарами»
Сценарий генерации наименования в каталоге «Товары и количество» выглядит следующим образом:
Принцип работы сценария полностью аналогичен предыдущему.
В сценарии нужно изменить компоненты:
- fields: Измените тестовые id полей в компоненте, согласно его описанию.
Изменить шаблон наименования можно в компоненте «Формируем тайтл».
Автоматизация операций с товарами
Далее будут разобраны автоматизации, связанные с операциями над товарами.
Пополнение/списание количества товаров на складе
Основная автоматизация каталога.
В каталоге «События» создайте новую запись и заполните ее следующим образом:
Это событие отслеживает сохранение записи в каталоге «Операции с товарами». Сценарий запускается при изменении поля с товарами. В качестве сценария загрузите сценарий списания/пополнения товара на складе.
Сценарий списания/пополнения товара на складе выглядит следующим образом:
- Проверку назначения типа операции и выбора товаров для операции.
- Циклическое увеличение или списание товаров на складе. Зависит от выбранного типа операции (поступление/списание).
- Проверку на возможность списания: если количество списываемого товара больше остатка на складе (или на складе нет выбранного товара) – сценарий выведет ошибку и не спишет товар со склада.
- Создание записи товара на складе при поступлении товара: если на складе не было записи с поступившим товаром, то она будет создана автоматически.
В сценарии необходимо изменить компоненты:
- fields: Измените тестовые id полей в компоненте, согласно его описанию.
Запрет на повторное проведение операции
Автоматизация, запрещающая повторное проведение операции из записи, по которой она уже проводилась.
В каталоге «События» создайте новую запись и заполните ее следующим образом:
Это событие отслеживает сохранение записи в каталоге «Операции с товарами». Сценарий запускается при изменении поля с товарами. В качестве сценария загрузите сценарий запрета на повторное проведение операции.
Сценарий запрета на повторное проведение операции выглядит следующим образом:
- Проверку записи операции на завершенность: произошло ли ранее по этой записи начисление или списание.
- Если операция по записи уже проводилась – запрещает создание записи и выводит сообщение сотруднику.
В сценарии необходимо изменить компоненты:
- fields: Измените тестовые id полей в компоненте, согласно его описанию.
Прокидывание записи операции в запись товара и количества
Автоматизация, прокидывающая созданную запись операции в записи товаров в этой операции. Нужно для обратной связи записей из каталога «Товары и количество» с записью каталога «Операции над товарами». Позволяет быстро найти все записи из «Товаров и количества», принадлежащие записям «Операций над товарами».
В каталоге «События» создайте новую запись и заполните ее следующим образом:
Это событие отслеживает сохранение записи в каталоге «Операции с товарами». Сценарий запускается при изменении поля с товарами. В качестве сценария загрузите сценарий прокидывания операции в «Товары и количество».
Сценарий прокидывания операции в товары и количество выглядит следующим образом:
- Циклическую подстановку созданной записи операции во все связанные записи из каталога «Товары и количество».
В сценарии необходимо изменить компоненты:
- fields: Измените тестовые id полей в компоненте, согласно его описанию.
Тестирование
В каталоге «Товары» создайте несколько записей товаров, например:
Перейдите в каталог «Операции с товарами». Создайте поступление для каждого из товаров:
Если всё настроено верно, то в каталоге «Склад» появятся записи для каждого из товаров с числами поступления:
Перейдите в каталоге «Операции с товарами». Создайте списание для каждого из товаров:
Если все настроено верно, то в каталоге «Склад» произойдет списание введенных количеств товаров:
Источник: bpium.ru
Проектирование простой системы учёта товаров на небольшом складе
Задача соответствующего учёта складских остатков является достаточно актуальной и рассмотрена во множестве работ. Для этой цели использовано большое количество различных подходов. Однако тот подход, который мы собираемся рассмотреть в этой статье, является достаточно интересным, так как для этого используется разработка под нашу любимую Arduino IDE.
Современная экономика базируется на большом количестве товаров, перемещающихся из одного места в другое. Любая современная фирма, которая имеет дело с товарными запасами — обязана соответствующим образом поставить систему их учёта.
Это необходимо не только для соответствующего пополнения товарных запасов в нужные сроки (чтобы не было разрывов между расходом товаров со склада и их поступлением от поставщиков), но и для аналитических целей, когда по темпу расхода товаров со склада можно предугадать потребность в таких запасах на будущие периоды: день, неделю, месяц, год.
Несмотря на то что указанное уже звучит страшно для большинства читающих и «светит» использованием серьёзных корпоративных продуктов для учёта, такой учёт можно вести весьма простым способом! Причём в данном случае под «простым» не подразумевается «плохим», так как, несмотря на минимальные расходы, позволяет весьма эффективно учитывать запасы в рамках компании.
Предположим следующую распространённую ситуацию: некая компания поставляет товар в торговые точки, разбросанные по городу.
С некоторой периодичностью товар в этих точках расходуется, и необходимо постоянно пополнять запасы, не допуская их полного исчерпания. В большинстве компаний этим занимаются специальные сотрудники, которых называют «торговыми представителями». Эти сотрудники посещают торговые точки, ведут учёт товаров в конкретных точках, проводят мерчандайзинг (расстановку товаров в торговом зале), а также производят заказ требующихся товаров (это осуществляется как при прибытии обратно в офис, так и непосредственно в торговой точке, перед отправкой заказа по электронной почте).
Казалось бы, отлаженная система, действующая во множестве компаний, какие тут могут быть проблемы? Однако проблема приходит с неожиданной стороны: текучка кадров. Дело в том, что позиция торгового представителя является не сильно высокооплачиваемой, что приводит к соответствующей текучке кадров.
Ввиду этого постоянно возникают проблемы, когда компанию некому проинформировать о наличии/отсутствии/количестве товарных остатков в конкретной товарной точке. Это приводит к убыткам головной организации, потому что, как правило, эта организация платит кроме процента с каждой проданной единицы товара ещё и определённые арендные платежи за размещение товара в определённом месте торгового зала (к примеру, третья полка снизу от пола стоит гораздо дороже, чем 1 полка снизу, около самого пола. Это связано с тем, что третья полка снизу находится, с точки зрения маркетологов, на самом оптимальном месте и обеспечивает самые высокие продажи).
Теперь вернёмся к нашему вопросу об автоматизации склада. Казалось бы, что здесь можно автоматизировать, если товар расположен на полке? Действительно, в данном случае трудно что-либо предпринять, однако эту проблему можно устранить следующим образом: использование вендингового аппарата собственного производства.
Предположим, что такой аппарат может выдавать одну единицу товара, в процессе выдачи которого происходит её автоматический учёт определённым датчиком (мы сейчас не будем предметно останавливаться на конкретной конструкции такого аппарата, так как он может быть выполнен в абсолютно разных исполнениях, в зависимости от типа товара).
Кроме того, на базе рассмотренного ниже принципа можно создать автоматизированные склады «ячеистого» типа, которые будут вести учёт расходоа и поступлений товаров в автоматическом режиме, а также будут информировать центральный офис о состоянии товарных остатков в конкретном подразделении.
Использование вендингового аппарата или ячеистого автоматизированного склада даёт нам широчайшие возможности по контролю товарных остатков в нём. Но сразу встаёт вопрос: мало учитывать товар, необходимо также и в соответствующем темпе информировать о происходящем в каждой конкретной точке головной офис компании.
Для этого необходимо организовать соответствующую передачу данных через протоколы беспроводной связи. Мы не будем рассматривать более простой вариант, когда микроконтроллер подключался бы по wi-fi к точке доступа, находящейся в зоне доступности, так как это практически «сказочный» вариант. Потому что обычно всё гораздо сложнее: точки доступа нет (или к ней нельзя подключаться) и необходимо организовать передачу данных по интернету через мобильную сеть — самостоятельно.
В свою бытность, в начале 2010-х годов, автору статьи приходилось решать подобную задачу, и тогда для её решения использовалась связка из Arduino Ethernet и GPRS шилд для Arduino.
Эта связка вполне хорошо работала, однако в настоящее время, на взгляд автора, такая связка является устаревшим решением. Поэтому лучше использовать более современные решения на базе esp32, так как в этом случае мы получаем все плюшки этой платы: мощный процессор, wi-fi, Bluetooth, а в этом конкретном случае ещё и интернет через мобильную сеть, именно поэтому мы будем использовать плату TTGO T-Call ESP32 SIM800L.
В общем случае схема работы нашей системы будет выглядеть следующим образом:
То есть нам необходимо производить учёт в конкретной точке, далее отправлять эту информацию на центральный сервер, где она будет записываться в базу данных MySQL, откуда она может быть считана любыми средствами визуализации и ведения отчётности.
В простом случае можно использовать скрипт, который будет выводить данные в графическом виде.
Следует отметить, что это решение является несколько ограниченным, ввиду того что мы передаём данные, обращаясь к скрипту на сервере, который уже настроен и предназначен только для внесения изменений в базу данных. Однако существует гораздо более гибкое решение, которое вы можете попробовать проработать сами: библиотека, позволяющая вносить изменения в базу данных напрямую, без скрипта-посредника на сервере.
Справедливости ради следует отметить, что для большинства применений такая гибкость будет излишней, но можно держать эту возможность в уме.
В качестве основы мы возьмём 3 подхода. Первый не совсем соответствует потребностям, так как построен на основе wifi-сети. Второй — позволяет пересылать данные через мобильную сеть, но энергозатратен. Третий — энергоэффективен, но совершенно не работает с сетью 🙂
Сделаем на их базе наш гибридный, четвёртый вариант.
Продолжая прорабатывать нашу систему, сделаем следующие допущения: предположим, что у нас к микроконтроллеру подключены 2 устройства:
- Датчик, отвечающий непосредственно за выдачу товара (в качестве такового может быть использован любой датчик инфракрасного типа, датчик Холла, мимо которого проходит товар во время выдачи; либо датчик реагирует на открытие специальной дверцы выдачи товара т.д., реализации могут быть разные.
- Кнопка, которая обновляет количество запасов в конкретном автомате и устанавливает их максимальное количество, возможное для размещения в ёмкости для товаров. В этом конкретном случае мы взяли количество равное 40. Но это не является аксиомой, это просто взято для примера.
Кроме того, для обеспечения энергоэффективности работы автомата мы будем использовать режим глубокого сна микроконтроллера, когда он практически всё время спит и пробуждается только при возникновении соответствующих событий на пинах.
Рассмотрим более предметно отдельные участки кода.
Для лучшей читабельности кода и его визуального упрощения отдельные участки разнесены на вкладки:
Сначала мы инициализируем настройки GPRS:
// Ваши данные GPRS (оставьте пустыми, если не требуются) const char apn[] = «»; // APN (для примера: internet.vodafone.pt) const char gprsUser[] = «»; // GPRS User const char gprsPass[] = «»; // GPRS Password // SIM card PIN (оставьте пустым, если не требуются) const char simPIN[] = «»;
Далее нам необходимо ввести настройки сервера с базой данных, к которому будет производиться подключение (тут же мы обозначим веб-скрипт, который будет принимать наши POST-обращения):
const char server[] = «example.ru»; const char resource[] = «/post-data.php»; // адрес скрипта //для помещения в базу данных const int port = 80;
Следует отметить, что при подключении к скрипту мы используем ключ API, который должен совпадать в нашем коде, здесь в Arduino IDE, с таким же ключом, который должен быть прописан в самом веб-скрипте.
Далее вводим настройки конкретной ячейки:
int GoodsCounter = 40; //сколько товара помещается в ячейку
Интересным моментом является добавление в программу пинов, которые вызывают пробуждение микроконтроллера ото сна. Для этого используются соответствующие битовые маски этих пинов (подробная инструкция, как добавлять новые пины, вызывающие пробуждение системы, имеется здесь):
//пины, которые вызывают пробуждение #define BUTTON_PIN_BITMASK 0x8004 // GPIOs 2 and 15
Полностью функция, которая будит микроконтроллер, выглядит следующим образом:
esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH);
После полной инициализации и загрузки микроконтроллер уходит в сон по вызову соответствующей функции:
esp_deep_sleep_start();
Ещё одним интересным моментом является то, что метод loop () в данном случае не используется вообще.
Функция void toDataBaseLoader (), выполненная в отдельной вкладке, как можно догадаться по названию, служит для загрузки данных о товарных остатках в централизованную базу на сервере. Она содержит ряд служебных элементов, информирующих юзера о происходящем в данный момент методом вывода сообщений в Serial, а также соответствующим образом сконфигурированный метод POST, который представляет собой сформированную строку, отправляемую на сервер:
// Готовим данные HTTP метода POST String httpRequestData = «api_key=» + apiKeyValue + » + String(GoodsCounter) + «»;
Также у нас имеется 2 функции, одна из которых просто выводит сообщение о том, какая причина вывела микроконтроллер из режима сна — void print_wakeup_reason ():
//функция печатает причину вывода из сна void print_wakeup_reason() < esp_sleep_wakeup_cause_t wakeup_reason; wakeup_reason = esp_sleep_get_wakeup_cause(); switch(wakeup_reason) < case ESP_SLEEP_WAKEUP_EXT0 : Serial.println(«Wakeup caused by external signal using RTC_IO»); break; case ESP_SLEEP_WAKEUP_EXT1 : Serial.println («Wakeup caused by external signal using RTC_CNTL»); break; case ESP_SLEEP_WAKEUP_TIMER : Serial.println(«Wakeup caused by timer»); break; case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println(«Wakeup caused by touchpad»); break; case ESP_SLEEP_WAKEUP_ULP : Serial.println(«Wakeup caused by ULP program»); break; default : Serial.printf(«Wakeup was not caused by deep sleep: %dn», wakeup_reason); break; >>
А также функция, которая выводит номер конкретного пина, который явился причиной пробуждения — int wakeup_reason_PIN ():
//функция, определяющая, какой пин вызвал пробуждение int wakeup_reason_PIN () < uint64_t GPIO_reason = esp_sleep_get_ext1_wakeup_status(); GPIO_number = (log(GPIO_reason))/log(2); Serial.print(«GPIO вызвавший пробуждение: GPIO «); Serial.println((log(GPIO_reason))/log(2), 0); if (GPIO_number == 2) //если сработал датчик выдачи товара < if (GoodsCounter>0) < GoodsCounter—; >> //если сработал датчик загрузки товара поставщиком else if (GPIO_number == 15) < GoodsCounter == 40; >//загружаем в базу текущее состояние товарных запасов ToDataBaseLoader (); >
Скачать готовый скетч можно тут.
В завершение следует сказать, что рассмотренный подход очерчивает лишь общие рамки реально действующей системы. Код представленной выше наверняка, требует соответствующей доработки, ввиду того что у автора непосредственно на руках не было платы TTGO T-Call ESP32 SIM800L, чтобы произвести полную отладку.
Кроме того, реально действующая система должна включать ещё и исполнительный механизм (например, двигатель, который будет выталкивать товар из определённой ячейки), а также систему приёма платежей.
Кроме того, рассмотренный подход является упрощённым, так как в реальной ситуации наверняка потребуется выдавать за один раз не одну единицу товара, а некоторое количество сразу. В случае вендинговых аппаратов это достаточно просто. В случае же, если указанный подход будет использован для автоматизации небольшого склада, могут потребоваться дополнительные усложнения. Например, если кладовщик берёт товар из определённой ячейки в количестве более одной штуки, то можно рядом с каждой ячейкой расположить кнопку и микро LED мониторчик, при нажатии на кнопку на мониторчике будет выводиться соответствующее количество товара, которое будет взято сейчас из ячейки. После закрытия дверцы ячейки система будет считать, что забор товара завершён, и отправит изменившееся количество товара в базу данных.
Таким образом, система, которую мы рассмотрели в этой статье, может служить не только для создания вендинговых аппаратов с оперативным уведомлением офиса о состоянии товарных запасов, но и для создания полноценных складов ячеистого типа, которые в автоматическом режиме учитывают приход и расход товара и ведут централизованную базу.
НЛО прилетело и оставило здесь промокоды для читателей нашего блога:
— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS .
Доступно до 31 декабря 2021 г.
Источник: habr.com