Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Умная кофемашина с Arduino и Bluetooth

Компоненты и расходные материалы

Arduino Nano R3
× 1
Модуль Bluetooth HC-05
× 1
Датчик температуры HARDWARIO DS18B20 1 м
× 1

Приложения и онлайн-сервисы

Последовательный терминал Bluetooth, созданный Каем Морихом
IDE Arduino

Об этом проекте

Введение

Умная автоматическая кофеварка с графиком, можно управлять через Bluetooth ... или просто загрузите свежую воду, и система запустится автоматически!

Каждая деталь сделана вручную, а все функции - мои собственные идеи.

Я также закодировал «Тестовый режим», чтобы контроллер можно было использовать как универсальный измеритель температуры с внешним датчиком температуры.

Разработано на Arduino Nano / Uno, использует дисплей ST7920 , HC-05 Bluetooth адаптер, Dallas DS18B20 датчик температуры , реле для управления змеевиком нагревателя, кнопка со светодиодами, зуммер и декадный счетчик CD4017BE управляет светодиодной полосой.

Как начать

  • Автозапуск :в режиме ожидания система циклически измеряет температуру в фоновом режиме. Загрузка пресной воды приводит к падению температуры , и система запустится.
    Эту функцию можно включить / отключить, отправив "авто" со смартфона, и настройка будет сохранена в памяти EEPROM.
  • Нажмите кнопку :чтобы начать / прервать приготовление кофе или выйти из тестового режима.
  • Отправить сообщение "начало" со смартфона или " стоп ".

Видео

Показаны все способы работы.

Как это было сделано, как это выглядит ... просто нажмите / коснитесь ниже!

Одноразовый анализ во время приготовления кофе

Через 60 секунд после запуска MCU сравнивает сохраненные начальные и текущие значения температуры, чтобы сделать выводы, основанные только на температуре и прошедшем времени, которые могут быть:

  • " Вы забыли воду. "- (слишком высокая температура)
  • " Кофе на двоих . "- (меньше воды - выше температура выше)
  • " Кофе на шестерых. "- (больше воды - меньше высота над уровнем моря)
  • " Ошибка нагревательной спирали! "- (нет значительного повышения температуры)

Кроме того, Обнаружение ошибки датчика работает непрерывно, пока кофемашина включена.

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

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

Изменение единицы измерения

Единицу измерения можно изменить, отправив " c "или" f "со смартфона, даже во время процедуры приготовления кофе, и не оставляет следов на графике .

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

Динамические элементы экрана

Если экран заполнен, график начинает вращаться влево.

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

Эти шесть маленьких анимированных изображений показывает, что я закодировал:

Что ж, приятное времяпрепровождение получилось:

Тестовый режим

К тому времени, как я создал все это, пришла идея, почему бы не использовать график для других целей?

Итак, я закодировал тестовый режим; просто присоедините внешний датчик температуры, и систему можно будет использовать как универсальный измеритель температуры с графиком.

При таком рабочем режиме крайние значения на графике составляют -20 ° C (-4 ° F) . и + 128 ° C (+ 262 ° F) .

Отправка номеров со смартфона между 1 и 999999 будет принят в качестве интервала измерения в секундах, поэтому ширина диаграммы составляет 128 секунд и 11,57 дня .

Связь по Bluetooth

Принимает команды и отправляет отчеты, определяет, подключается или отключается смартфон.

Отправленные сообщения отображаются синим цветом, а сообщения с ответами / отчетами - зеленым цветом.

Светодиодный контроль

Десятилетний счетчик CD4027BE управляет светодиодной полосой, получает CLK от MCU при каждом сообщении температуры и увеличивает положение. Если запускается новая процедура приготовления кофе или запускается тестовый режим, Atmega 328P отправляет сигнал RST для установки положения по умолчанию.

На кнопке есть двухцветный светодиод с двумя контактами, поэтому мое простое и забавное решение можно увидеть в коде, как им управлять.

  • Горит зеленым :ожидание или кофе готов, змеевик выключен
  • Сплошной красный :идет приготовление кофе, змеевик нагревателя включен
  • по очереди красный / зеленый :Тестовый режим
  • Мигающий красный :произошла ошибка, это может быть
    -ошибка датчика,
    -ошибка змеевика или
    -вы забыли воду, поэтому процесс приготовления кофе был прерван системой

Код

  • Умная кофеварка - Эси Дьюла
Умная кофеварка - Эси Дьюла Arduino
 // Программный код - Умная кофеварка. Разработан на Arduino Nano, использует дисплей ST7920, адаптер Bluetooth HC-05, // датчик температуры Dallas DS18B20, реле, кнопку, светодиоды, зуммер и декадный счетчик CD4017BE. // // Можно управлять через Bluetooth, отправляя команды и рабочие параметры или с помощью кнопки ... или просто загрузите пресную воду! //// Функции:// -Graph:динамический график температуры на экране // -Autostart:загрузка пресной воды вызывает падение температуры, и система запустится // Это функцию можно включить / выключить, отправив «Авто», и настройка будет сохранена в памяти EEPROM // -Анализ во время приготовления кофе:через 60 секунд после запуска система сравнивает текущее и начальное значения температуры // и делает выводы, которые могут be:// 1. Вы забыли воду (слишком высокая температура) // 2. Кофе на двоих (меньше воды - больше повышение температуры) // 3. Кофе на шесть человек (больше воды - меньше повышение температуры) // 4. Ошибка нагревательной спирали (нет значительного повышения температуры с самого начала) // -Обнаружение ошибки датчика (получение аномальных значений) // -C elsius или Fahrenheit работают:можно переключить, отправив C из F со смартфона, даже во время процедуры приготовления кофе. // Начальные и предыдущие значения температуры будут преобразованы, чтобы использоваться для статистики и анализа. // Эта настройка сохраняется в памяти EEPROM. .// -Тестовый режим:подключив внешний датчик температуры, систему можно использовать как универсальный измеритель температуры .// В этом режиме интервал графика составляет от -20C / -4F до + 128C / + 262F .// Отправка числовых значений от 1 до 999999 будет принято в качестве интервала измерения в секундах, поэтому // ширина графика может составлять от 128 секунд до 11,57 дней. // -Связь по Bluetooth:принимает команды и отправляет отчеты, определяет, подключается или отключается смартфон // - Управление светодиодной полосой:MCU управляет декадным счетчиком CD4027BE, и светодиодная шкала будет перешагивать через весь цикл измерения температуры // ------------------------- -------------------------------------------------- -------------------------------------------------- --- // // спроектировано, построено t и запрограммировано // Дьюлой Оси //// Все права защищены .// ---- Отображение #include "U8glib.h" // U8GLIB_SSD1306_128X64 u8g (U8G_I2C_OPT_NONE); // OLED-дисплей, шина I2C, SDA (TX) A4, SCL (RX) A5U8GLIB_ST7920_128X64 u8g (11, 10, 9, U8G_PIN_NONE); // конструктор отображения PIN6-D11, PIN5-D10, PIN4-D9byte frame =0; // начальный указатель логотипа // ---- Порты и управляемые периферийные устройства // красный светодиод на A0 // зеленый светодиод на A1const int bright [2] ={0, 500}; const byte buzzer =3; const byte cd4017beCLK =4; // управление декадным счетчиком CD4017BEconst byte cd4017beRST =5; const byte btn =13; const byte relay =12; // ---- Системные строки # define strSize 3String str [strSize]; // распечатка системных событий и отчетов # define reportSize 5const String reportStr [reportSize] ={"Запуск ...", "Скоро переход в режим ожидания ...", "Остановлен.", "*** ТЕСТОВЫЙ РЕЖИМ ***", "Normal mode."}; // # define standbySize 5 // const String standbyStr [standbySize] ={"Нажмите клавишу", ">", "или", "send", "start"}; const String autostartStr [2 ] ={"Автозапуск выключен.", "Автозапуск включен."}; // ---- Структура массива двоичных флагов состояния системы #define flagElements 6bool binFlags [flagElements] ={0, 1, 1, 0, 0, 0 }; // ---- elements [i] назначение init / режим ожидания val // 0 проверено 0 // 1 завершено 1 // 2 standby 1 // 3 standby msg отправлено 0 // 4 ошибка катушки / датчика 0 // 5 test mode 0 // ---- Измерение температуры и связанные функции # include "OneWire.h" #include "DallasTemperature.h" #define DS18B20 2 // настройка шины OneWire на D2OneWire temprWire (DS18B20); // настраиваем DS18B20 для работы с шиной OneWire Датчики температуры Даллас (&temprWire); float tempr; // измеренное значение float temprInit; // копия измеренного значения для однократного сравнения float temprPrev; // копия измеренного значения для циклического сравнения # define mUnit 2float temprBottomLim [mUnit] ={0, 26}; // автозапуск при температуре И одноразовый анализ при температуре константы char unit [mUnit] ={'F', 'C'}; const String unitStr [mUnit] ={"Режим Фаренгейта.", "Режим Цельсия."}; float trendSens [mUnit] ={0, 0,1}; // +/- диапазон (F / C), который будет оцениваться как постоянная температура // *** Контрольные значения по Фаренгейту будут вычисляться при запуске! bool trend [2] ={1, 0}; // описывает тенденции температуры, как показано ниже // ---- elements [i] цель // 0 изменение // 1 тенденция #define checkSize 7const String checkStr [checkSize] ={"Обнаружена вода!", "Ошибка нагревательного змеевика!", «Кофе на шесть человек», «Кофе на двоих», «Вы забыли воду!», «Ошибка датчика!», «Ваш кофе готов».}; Float temprCheck [mUnit] [checkSize] ={{}, {- 0,15, 5, 17, 28, 60, -127, 110}}; // | <- REL -> | <--CONST--> | // [j] F / C // ---------------------------------------- ----- // ---- elements [i] назначение, используемое как // 0 автозапуск значение rel // 1 обнаружение ошибки катушки значение rel // 2 воды для шести значений rel // 3 воды для двух значений rel // 4 значение rel без обнаружения воды // 5 нет сигнала на D2 Ссылка const // 6 точка кипения Ссылка const // ---- Объявления и переменные графика # define posYsize 128byte posY [posYsize]; byte pointer =0; #define refrElements 42float temprRefr [refrElements]; # define rangeElements 2 // min / max # define mode 2 // normal / test modefloat graphRange [mUnit] [mode] [rangeElements] ={{{}, {}}, {{24, 127.938889 + 2}, {-20, graphRange [1] [0] [1]}}}; // [k] 0 1 0 1 // [j] | 0 | 1 // ---- elements [i] | | | | // 0 minFnorm maxFnorm minFtest maxFtest // 1 minCnorm maxCnorm minCtest maxCtestfloat graphDiff [mUnit] [mode]; // шаги по вертикали по температуре // ---- Системные таймеры, управление и аналитика # include  elapsedMillis timer0; // 8-битный таймер ШИМ, используемый функцией elapsedMillis () unsigned long tmrPrev =0; // прошедшее будет предыдущим, если интервал upbool cyclic =0; const long tmrInt [5] ={500, 2000, 60000, 640000, 800000}; // ---- elements [i] цель // 0 интервал измерения (тестовый режим), led ctrl // 1 интервал измерения (нормальный режим) // 2 разовая аналитика (нормальный режим, во время приготовления кофе) / циклическая аналитика ( режим ожидания) // 3 отправка сообщения ожидания (нормальный режим, после приготовления кофе) // 4 режим ожидания системы (нормальный режим, после приготовления кофе) long copyof_tmrInt0 =tmrInt [0]; const String tmrInt0Str ="Интервал изменен."; // ---- Конфигурация последовательной связиconst byte btState =6; bool conn =0; const String connStr [2] ={"Соединение потеряно.", "Смартфон подключен."}; # Include  const int RX1 =7; const int TX1 =8; SoftwareSerial sUART (RX1, TX1); #define exRXSize 6char exRX [exRXSize]; // переменная для приема данных из последовательного порта // ---- Управление памятью # include  #define occBytes 2const byte addr [occBytes] ={0, 1}; bool sysSettings [occBytes]; // ---- Карта памяти addr [i] | данные | descr | сохраненное значение // ---------------------------------------------- ------- // 0 | bool | автозапуск | 0:без автозапуска, 1:автозапуск // 1 | bool | единица измерения | 0:по Фаренгейту, 1:по Цельсию // ---- Терминаторы и команда уборкиconst char termCharSpc =''; const String termStr; const byte termByte =0; const bool termBool =0; const uint8_t frame0 [] U8G_PROGMEM ={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0xFF, 0x7F, 0xF0, 0x3F, 0x00FF, 0xFE, 0x 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0xFF, 0x7F, 0xF0, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x1FFF, 0xF1 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF , 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0x1F, 0x7F, 0x8C, 0x3F, 0x1E, 0xFF, 0xFFx1, 0xFFE, 0xFF, 0xF , 0x00, 0x18, 0xC0, 0x8F, 0xFF, 0x1F, 0x7F, 0x8C, 0x3F, 0x1E, 0xFF, 0x00, 0xFE, 0x1F, 0xFF, 0xF1, 0x00, 0x18, 0xC0, 0x8F, 0x3, 0x1, 0x1F , 0x1E, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0x31, 0xFE, 0x7F, 0xFC, 0x8F, 0xFF, 0x1F, 0x1F, 0x0C, 0x3E, 0x1E, 0xFF, 0xFF, 0xF8, 0x1F, 0x31F, 0xF8, 0x1F, 0x31F , 0xFC, 0x0F, 0x0E, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0xFC, 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0x7F, 0xF0, 0x0F, 0x0E, 0x18, 0x0x3, 0x1F, 0x1F , 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0x7F, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0x0x0, 0xF0, 0x7C, 0x0x0, 0xF0, 0x7C , 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x00, 0x7E, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x3E, 0x0C, 0x3E, 0x0C, 0x3E, 0x0C, 0x3E, 0x0C , 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0x0x3, 0xF0x, 0xF0x3 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x3F, 0x00, 0x7E, 0x00, 0x3C, 0x80, 0x0x07, 0x8F 0x7F, 0x00, 0x3C, 0x00, 0x1E, 0xC0, 0x3F, 0x00, 0x7E, 0x00, 0x3C, 0x80, 0x07, 0xF0, 0x00, 0xF8, 0x7F, 0x00, 0x3C, 0x00, 0x1EFF, 0xC0x, 0x1EFF, 0xC0x, 0x1EFF 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFFFF, 0xFF, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7FFF, 0x00, 0x00, 0x00 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x FF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x6, 0x3 0xFE , 0x06, 0xC6, 0x7F, 0xFE, 0xE7, 0x3F, 0x7E, 0xFE, 0xC7, 0x7F, 0x00, 0x00, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x60, 0x60x, 0x60x, 0x60 , 0x00, 0x00, 0x00, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x30, 0x1E, 0x66, 0x60 , 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x30, 0x3E, 0x66, 0x60, 0 x06, 0x66, 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xE6, 0x61, 0x1E, 0xC7, 0x3F, 0x70, 0xE0, 0x3F, 0x3C, 0x3F, 0x00, 0x00, 0x3C, 0x7E, 0xE6, 0x61, 0x1E, 0xC7, 0x3F, 0x70, 0xE0, 0x3F, 0x3C, 0xFE, 0xC3, 0x3F, 0x00, 0x00, 0x3C, 0xDE, 0xE7, 0xE7 0x70, 0x70, 0xE0, 0x1D, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE7, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x31, 0x370, 0x00, 0x1E 0x00, 0x3C, 0x1E, 0xE6, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE6, 0x61 0x070, 0x1E 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x7F, 0x1E, 0xE6, 0x3F, 0xFC, 0xE3, 0x3F, 0x70, 0xE0, 0x61, 0x7E, 0xFE, 0xE7, 0x300, 0x00, 0xE7, 0x300, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0 0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}; const uint8_GMEM frame1 [] ={0xF8, // 11111000 00 0x21, // 00100001 01 0x22, // 00100010 02 0x24, // 00100100 03 0x08, // 00001000 04 0x10, // 00010000 05 0x24, // 00100100 06 0x44, // 01000100 07 0x0F, // 00001111 08 0x04, // 00000100 09 0x04, // 00000100 10 0x03, // 00000011 11}; const uint8_t frame2 [] PROGMEM ={0x08, // 00001000 00 0x1C, // 00011100 01 0x3E, // 00111110 02 0x7F, // 01111111 03}; const uint8_t frame3 [] PROGMEM ={0x7F, // 01111111 00 0x3E, // 00111110 01 0x1C, // 00011100 02 0x08, // 00001000 03}; void setup () {u8g .начинать(); fillArrays (); pinMode (cd4017beCLK, ВЫХОД); pinMode (cd4017beRST, ВЫХОД); CD4017BE (0); // отправляем СБРОС на микросхему счетчика декад pinMode (btState, INPUT); pinMode (btn, ВХОД); pinMode (реле, ВЫХОД); sUART.begin (9600); памятка (2); // загружаем системные настройки из EEPROM sensor.begin (); // запускаем DS18B20 temprMeas (); temprInit =tempr; граф (2); // запуск графа ledHandler (0);} void loop () {sysControl (); checkBtn (); checkConn (); RX (); u8g.firstPage (); делать {рисовать (); } while (u8g.nextPage ()); если (кадр ==0) {задержка (3000); frame =1; scrClr (); }} // ---- Управление памятью // параметр вызова // 2:чтение при запуске // 0, 1:запись по правильному адресу // void memo (byte op) {switch (op) {case 2:for (байт i =0; i  tmrInt [2]) &&(! binFlags [5])) {если (binFlags [2]) {temprMeas (); если ((tempr - temprInit <=temprCheck [sysSettings [1]] [0]) &&(tempr =temprCheck[sysSettings[1]][6]) &&(!binFlags[1])) { // check boiling point coil(0); strSelector(0, 6); } if ((timer0> tmrInt[3]) &&(!binFlags[2]) &&(!binFlags[3])) { // going standby msg AND a second security check strSelector(1, 1); binFlags[3] =1; if (!binFlags[1]) { // for case if the coil went broken after the One Time Analysis coil(0); // and therefore there was no boiling point strSelector(0, 1); } } if (timer0> tmrInt[4]) { // the system goes standby binFlags[2] =1; strSelector(6, 0); } }void temprMeas() { temprPrev =tempr; sensor.requestTemperatures (); // update sensor readings if (sysSettings[1]) { tempr =sensors.getTempCByIndex(0); // read remperature } else { tempr =sensors.getTempFByIndex(0); } if (tempr>=temprPrev + trendSens[sysSettings[1]]) { trend[0] =0; trend[1] =1; } if (tempr <=temprPrev + trendSens[sysSettings[1]]) { trend[0] =0; trend[1] =0; } if ((tempr  temprPrev - trendSens[sysSettings[1]])) { trend[0] =1; }} // ---- Coil Control // 0:power off // 1:power onvoid coil(byte op) { switch (op) { case 0:digitalWrite(relay, 0); binFlags[1] =1; strSelector(1, 2); ledHandler(0); ломать; case 1:digitalWrite(relay, 1); strSelector(6, 0); CD4017BE(0); graph(1); for (byte i =0; i  0; i--) { str[i] =termStr; } return; } TX(); for (byte i =(strSize - 1); i> 0; i--) { // roll for printout str[i] =str[i - 1]; } buzz(4, 1); }void draw(void) { if (frame ==0) { u8g.drawXBMP( 0, 0, 128, 64, frame0); } else { if (frame ==1) { scr(); } }}void scr(void) { if (binFlags[2]) { #define standbySize 4 const String standbyStr[standbySize] ={"Press key>>>>", "or", "send", "start"}; u8g.setFont(u8g_font_courB10); u8g.setPrintPos(2, 12); u8g.print(standbyStr[0]); u8g.setPrintPos(14, 26); u8g.print(standbyStr[1]); u8g.setPrintPos(30, 40); u8g.print(standbyStr[2]); u8g.setColorIndex(!cyclic); u8g.drawBox(74, 28, 50, 14); u8g.setColorIndex(cyclic); u8g.setPrintPos(76, 40); u8g.print(standbyStr[3]); u8g.setColorIndex (1); } else { if ((posY[0]>=20) || (posY[13]>=20)) { u8g.drawBitmapP( 5, 0, 1, 12, frame1); } else { u8g.drawBitmapP( 5, 25, 1, 12, frame1); } if ((posY[54]>=30) || (posY[112]>=30)) { u8g.drawHLine(69, 40, 53); scrTempr(72, 12); } else { scrTempr(72, 44); } for (byte i =0; i  0) { u8g.drawVLine(i, posY[i], 2); } } } u8g.setFont(u8g_font_6x12); byte y =53; for (byte i =(strSize - 1); i> 0; i--) { u8g.setPrintPos(0, y); y =y + 9; u8g.print(str[i]); } }void scrTempr (byte tX, byte tY) { u8g.drawVLine(2, 4, 39); u8g.drawHLine(0, 40, 69); u8g.drawHLine(0, posY[pointer - 1], 5); byte tXrel =2; byte tYrel =11; if ((tempr <100) &&(tempr> -10)) { u8g.drawFrame(tX - tXrel, tY - tYrel, 45, 13); u8g.drawHLine(116, 40, 12); } else { u8g.drawFrame(tX - tXrel, tY - tYrel, 51, 13); u8g.drawHLine(122, 40, 6); } u8g.setFont(u8g_font_6x12); u8g.setPrintPos(tX, tY); u8g.print(tempr); u8g.print(char(176)); u8g.print(unit[sysSettings[1]]); if (trend[0]) { return; } tXrel =12; if (trend[1]) { u8g.drawBitmapP(tX - tXrel, tY - tYrel, 1, 4, frame2); } else { u8g.drawBitmapP(tX - tXrel, tY - tYrel, 1, 4, frame3); }}void scrClr(){ u8g.firstPage(); do { } while(u8g.nextPage());} // ---- Maintenance of Graph Arrays // call param // 0:step &fill // 1:clr // 2:initvoid graph(byte op) { switch (op) { case 0:if (pointer ==posYsize) { for (byte i =0; i <(posYsize - 1); i++) { posY[i] =posY[i + 1]; posY[i + 1] =termByte; } pointer =posYsize - 1; } for (byte i =0; i =temprRefr[i + 1])) { posY[pointer] =i; возвращение; } } break; case 1:for (byte i =0; i  0) &&(atof(exRX)>=1) &&(atof(exRX) <=999999)) { copyof_tmrInt0 =(atof(exRX) * 1000); strSelector(5, 0); } for (byte i =0; i  

Схема


Производственный процесс

  1. Контроль доступа с помощью QR, RFID и проверки температуры
  2. Регистратор данных температуры и влажности
  3. Arduino с Bluetooth для управления светодиодом!
  4. Умная обувь (автоматическая шнуровка и выработка электроэнергии)
  5. BME280 Температура, влажность и давление на дисплее Nextion
  6. Управление серводвигателем с помощью Arduino и MPU6050
  7. Устройства с голосовым управлением Bluetooth с OK Google
  8. u-blox LEA-6H 02 GPS-модуль с Arduino и Python
  9. Как читать температуру и влажность на Blynk с DHT11
  10. Простая и умная роботизированная рука с использованием Arduino