Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Smarte Kaffeemaschine mit Arduino und Bluetooth

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1
HC-05 Bluetooth-Modul
× 1
HARDWARIO DS18B20 Temperatursensor 1m
× 1

Apps und Onlinedienste

Serielles Bluetooth-Terminal von Kai Morich
Arduino-IDE

Über dieses Projekt

Einführung

Intelligente automatische Kaffeemaschine mit Graph, kann über Bluetooth gesteuert werden... oder einfach frisches Wasser laden, und das System startet automatisch!

Alle Teile sind handgefertigt und alle Funktionen sind meine eigenen Ideen.

Ich habe auch "Test Mode" codiert, damit der Controller als Mehrzweck-Temperaturmesser mit externem Temperatursensor verwendet werden kann.

Entwickelt auf Arduino Nano / Uno, verwendet ST7920 Display , HC-05 Bluetooth Adapter, Dallas DS18B20 Temperatursensor , Relais zur Steuerung des Heizregisters, Taster mit LEDs, Summer und ein Dekadenzähler CD4017BE steuert die LED-Leiste.

So starten Sie

  • Autostart :Im Standby-Modus misst das System zyklisch die Temperatur im Hintergrund. Das Laden von frischem Wasser führt zu einem Temperaturabfall , und das System wird gestartet.
    Diese Funktion kann durch Senden von "auto" vom Smartphone aktiviert / deaktiviert werden, und die Einstellung wird im EEPROM-Speicher gespeichert.
  • Drücken Sie die Taste :um die Kaffeezubereitung zu starten / zu unterbrechen oder den Testmodus zu verlassen.
  • Startnachricht senden von Ihrem Smartphone oder "Stopp ".

Video

Zeigt alle Arbeitsweisen.

Wie es gemacht wurde, wie es aussieht... einfach unten klicken/tippen!

Einmalige Analyse während der Kaffeezubereitung

60 Sekunden nach dem Start vergleicht die MCU die gespeicherten anfänglichen und aktuellen Temperaturwerte, um nur auf der Grundlage der Temperatur und der verstrichenen Zeit Schlussfolgerungen zu ziehen, die sein können:

  • "Du hast das Wasser vergessen. " - (Temperatur ist zu hoch)
  • "Kaffee für zwei. " - (weniger Wasser - mehr Temperaturerhöhung)
  • "Kaffee für sechs. " - (mehr Wasser - weniger Temperaturerhöhung)
  • "Heizregisterfehler! " - (keine signifikante Temperaturerhöhung)

Zusätzlich die Sensorfehlererkennung arbeitet ununterbrochen, solange die Kaffeemaschine eingeschaltet ist.

Wie zu sehen ist, brauchten sechs Dosen Wasser mehr Zeit, um die gleiche Temperatur zu erreichen, die die kleine Dosis viel früher erreichte.

Das Starten ohne Wasser führt zu einer sehr hohen Temperatur, die flache Linie zeigt jedoch eine unveränderte Temperatur an, also einen Heizwendelfehler.

Maßeinheit ändern

Die Maßeinheit kann durch Senden von "c . geändert werden " oder "f " vom Smartphone, auch während einer Kaffeezubereitung, undes hinterlässt keine Spuren in der Grafik .

Gespeicherte Anfangs- und vorherige Temperaturwerte werden konvertiert durch einen Programmfunktionsaufruf habe ich codiert - für Statistik und Analyse verwendet. Diese Einstellung wird auch im EEPROM-Speicher gespeichert.

Dynamische Bildschirmelemente

Wenn der Bildschirm voll ist, beginnt die Grafik nach links zu rollen.

Je nach Messwert kann ein Bildschirmelement im Weg sein. Um Kollisionen zu vermeiden, sind ihre Orte dynamisch.

Diese sechs kleinenanimierten Bilder zeigt was ich codiert habe:

Nun, es war ein angenehmer Zeitvertreib:

Testmodus

Als ich all diese erstellt hatte, kam die Idee auf, warum nicht das Diagramm für andere Zwecke verwenden?

Also habe ich den Testmodus codiert; Schließen Sie einfach einen externen Temperatursensor an und das System kann als Mehrzweck-Temperaturmesser mit Grafik verwendet werden.

Auf diese Weise sind die Extremwerte des Diagramms -20°C (-4°F) und +128 °C (+262 °F) .

Senden von Nummern vom Smartphone zwischen 1 und 999999 wird als Messintervall in Sekunden akzeptiert, sodass die Breite des Diagramms zwischen 128 Sekunden liegt und 11,57 Tage .

Bluetooth-Kommunikation

Akzeptiert Befehle und sendet Berichte, erkennt, ob sich ein Smartphone verbindet oder trennt.

Gesendete Nachrichten sind blau und die Antwort-/Berichtsnachrichten sind grün, die von der Kaffeemaschine gesendet werden.

LED-Steuerung

Ein Dekadenzähler CD4027BE steuert die LED-Leiste, empfängt CLK von der MCU bei jeder Temperaturmessung und erhöht die Position. Wenn ein neuer Kaffeezubereitungsvorgang oder der Testmodus beginnt, sendet der Atmega 328P ein RST-Signal, um die Standardposition einzustellen.

Der Taster hat eine zweifarbige LED mit nur zwei Pins, daher ist meine einfache und lustige Lösung im Code zu sehen, wie man ihn steuert.

  • Einfarbiges Grün :Standby oder der Kaffee ist fertig, die Spule ist ausgeschaltet
  • Einfarbiges Rot :Kaffeezubereitung läuft, die Heizspirale ist eingeschaltet
  • Rot / Grün im Wechsel :Testmodus
  • Rot blinkend :Fehler aufgetreten, das kann sein
    -Sensorfehler,
    -Heizspulenfehler, oder
    -Sie haben das Wasser vergessen, daher wurde der Kaffeezubereitungsvorgang vom System unterbrochen

Code

  • Smarte Kaffeemaschine - Ősi Gyula
Smarte Kaffeemaschine - Ősi GyulaArduino
// Programmcode - Intelligente Kaffeemaschine. Entwickelt auf Arduino Nano, verwendet ST7920-Display, HC-05-Bluetooth-Adapter // Dallas DS18B20-Temperatursensor, Relais, Taste, LEDs, Summer und einen CD4017BE-Dekadenzähler. // // Kann über Bluetooth durch Senden von Befehlen und Arbeitsparametern gesteuert werden oder mit der Taste... oder einfach Frischwasser laden!//// Funktionen:// -Graph:dynamisches Temperaturdiagramm auf dem Bildschirm// -Autostart:Das Laden von Frischwasser führt zu einem Temperaturabfall und das System startet// Dies Funktion kann durch Senden von "Auto" aktiviert/deaktiviert werden und die Einstellung wird im EEPROM-Speicher abgelegt// be:// 1. Sie haben das Wasser vergessen (Temperatur ist zu hoch)// 2. Kaffee für Zwei (weniger Wasser - mehr Temperaturerhöhung)// 3. Kaffee für Sechs (mehr Wasser - weniger Temperaturerhöhung)// 4. Heizspulenfehler (keine signifikante Temperaturerhöhung von Anfang an) // -Sensorfehlererkennung (erhält abnormale Werte) // -C Elsius- oder Fahrenheit-Betrieb:kann durch Senden von C oder F vom Smartphone umgeschaltet werden, auch während eines Kaffeezubereitungsvorgangs.// Anfangs- und vorherige Temperaturwerte werden für Statistiken und Analysen umgerechnet.// Diese Einstellung wird im EEPROM-Speicher gespeichert .// -Testmodus:Anschließen eines externen Temperatursensors kann das System als Mehrzweck-Temperaturmesser verwendet werden.// In diesem Modus liegt das Diagrammintervall zwischen -20 °C / -4 °F und +128 °C / +262 °F.// Senden von numerischen Werten zwischen 1 und 999999 werden als Messintervall in Sekunden akzeptiert, also // die Diagrammbreite kann zwischen 128 Sekunden und 11,57 Tagen liegen.// -Bluetooth-Kommunikation:nimmt Befehle an und sendet Berichte, erkennt, ob sich ein Smartphone verbindet oder trennt // - LED-Leistensteuerung:Die MCU steuert einen CD4027BE-Dekadenzähler, und die LED-Leiste wird bei jedem Temperaturmesszyklus schrittweise // -------------------------- -------------------------------------------------- -------------------------------------------------- ---// // entworfen, gebaut t und programmiert // von Gyula Osi//// Alle Rechte vorbehalten.// ---- Anzeige #include "U8glib.h"//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // OLED-Display I2C Bus, SDA(TX) A4, SCL(RX) A5U8GLIB_ST7920_128X64 u8g(11, 10, 9, U8G_PIN_NONE); // Anzeigekonstruktor PIN6-D11, PIN5-D10, PIN4-D9byte Frame =0; // Logo-Zeiger starten // ---- Ports &Controlled Peripherals // rote LED auf A0 // grn LED auf A1const int bright[2] ={0, 500};const Byte Summer =3;const Byte cd4017beCLK =4; // Steuerung CD4017BE Dekade Counterconst Byte cd4017beRST =5;const byte btn =13;const byte relay =12;// ---- System Strings#define strSize 3String str[strSize]; // Systemereignisse und Berichte printout#define reportSize 5const String reportStr[reportSize] ={"Starting...", "Going standby soon...", "Stopped.", " *** TEST MODE ***", "Normaler Modus."};//#define standbySize 5//const String standbyStr[standbySize] ={"Taste drücken", ">", "or", "send", "start"};const String autostartStr[2 ] ={"Autostart aus.", "Autostart ein."};// ---- Struktur des Systemzustands Binary Flag Array #define flagElements 6bool binFlags[flagElements] ={0, 1, 1, 0, 0, 0 }; // ---- Elemente [i] Zweck Init/Standby mode val // 0 geprüft 0 // 1 fertig 1 // 2 standby 1 // 3 standby msg gesendet 0 // 4 Spulen-/Sensorfehler 0 // 5 test Modus 0// ---- Temperaturmessung und zugehörige Funktionen#include "OneWire.h" #include "DallasTemperature.h"#define DS18B20 2 // Einrichten des OneWire-Busses auf D2OneWire temprWire(DS18B20); // DS18B20 so einrichten, dass es an den OneWire-BusDallasTemperatursensoren (&temprWire) arbeitet; float tempr; // Messwertfloat temprInit; // Kopie des Messwertes für einmaligen Vergleichfloat temprPrev; // Messwertkopie für zyklischen Vergleich#define mUnit 2float temprBottomLim[mUnit] ={ 0, 26}; // Autostart unter Tempr von AND einmalige Analyse unter Tempr ofconst char unit[mUnit] ={'F', 'C'};const String unitStr[mUnit] ={"Fahrenheit mode.", "Celsius mode."};float trendSens[mUnit] ={ 0, 0.1}; // +/- Bereich (F/C), der als konstante Temperatur ausgewertet wird // *** Fahrenheit-Referenzwerte werden beim Start berechnet!bool trend[2] ={1, 0}; // beschreibt Temperaturtrends wie folgt // ---- Elemente [i] Zweck // 0 Änderung // 1 Trend #define checkSize 7const String checkStr[checkSize] ={"Wasser erkannt!", "Heizregisterfehler!", "Kaffee für sechs", "Kaffee für zwei", "Du hast das Wasser vergessen!", "Sensorfehler!", "Dein Kaffee ist fertig."};float temprCheck[mUnit][checkSize] ={{ }, {- 0,15, 5, 17, 28, 60, -127, 110}}; // |<-- REL -->|<--CONST-->| // [j] F / C // ---------------------------------------- ----- // ---- Elemente [i] Zweck verwendet als // 0 Autostart rel Wert // 1 Spulenfehlererkennung rel Wert // 2 Wasser für sechs rel Wert // 3 Wasser für zwei rel Wert // 4 kein Wassererkennungs-Relwert // 5 kein Signal an D2 const reference // 6 Siedepunkt const reference // ---- Graph-Deklarationen und Variablen#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 // ---- Elemente [i] | | | | // 0 minFnorm maxFnorm minFtest maxFtest // 1 minCnorm maxCnorm minCtest maxCtestfloat graphDiff[mUnit][mode]; // vertikale Schritte nach Temperatur // ---- System-Timer, Steuerung und Analyse#include  elapsedMillis timer0; // 8-Bit, PWM-Timer, verwendet von der Funktion elapsedMillis () unsigned long tmrPrev =0; // die verstrichene Zeit ist die vorherige, wenn das Intervall upbool cyclisch =0;const long tmrInt[5] ={500, 2000, 60000, 640000, 800000}; // ---- Elemente [i] Zweck // 0 Messintervall (Testmodus), LED-Strg // 1 Messintervall (Normalmodus) // 2 einmalige Analysen (Normalmodus, während der Kaffeezubereitung) / Zyklische Analysen ( Standby-Modus) // 3 Standby-Nachricht senden (normaler Modus, nach der Kaffeezubereitung) // 4 System-Standby (normaler Modus, nach der Kaffeezubereitung)long copyof_tmrInt0 =tmrInt[0]; const String tmrInt0Str ="Intervall geändert."; // ---- Konfiguration der seriellen Kommunikationconst byte btState =6;bool conn =0;const String connStr[2] ={"Verbindung verloren.", "Smartphone verbunden."};#include  const int RX1 =7;const int TX1 =8;SoftwareSerial sUART(RX1,TX1); #define exRXSize 6char exRX[exRXSize]; // Variable zum Empfangen von Daten vom seriellen Port// ---- Memory Management#include #define occBytes 2const byte addr[occBytes] ={ 0, 1};bool sysSettings[occBytes]; // ---- Speicherzuordnungsadresse[i] | Daten | Beschreibung | gespeicherter Wert // ---------------------------------------------------------- ------- // 0 | bool | Autostart | 0:kein Autostart, 1:Autostart // 1 | bool | Maßeinheit | 0:Fahrenheit, 1:Celsius// ---- Terminatoren &The Cleanup Crewconst 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, 0x00, 0xFE, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0xFF, 0x7F, 0xF0, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFFx 0x1F, 0xFFx 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, 0x .FxFE, 0x .FxFE , 0x00, 0x18, 0xC0, 0x8F, 0xFF, 0x1F, 0x7F, 0x8C, 0x3F, 0x1E, 0xFF, 0x00, 0xFE, 0x1F, 0xFF, 0xF1, 0x00, 0x18, 0xC0, 0x8F, 0x .F, 0 , 0x1E, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0x31, 0xFE, 0x7F, 0xFC, 0x8F, 0xFF, 0x1F, 0x1F, 0x0C, 0x3E, 0x1E, 0xFF, 0xFF, 0xF8, 0xF,0 , 0xFC, 0x0F, 0x0E, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0xFC, 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0xFC, 0xF0, 0x0F, 0x0E, 0x18, 0x , 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0x7F, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7E , 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x00, 0x7E, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E , 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, 0x3E, 0x1E, 0xF3C, 0x3E, 0xF8, 0x1F, 0x7C 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x3F, 0x00, 0x7E, 0x00, 0x3C, 0x 0x7F, 0x00, 0x3C, 0x00, 0x1E, 0xC0, 0x3F, 0x00, 0x7E, 0x00, 0x3C, 0x80, 0x07, 0xF0, 0x00, 0xF8, 0x7F, 0x00, 0x3C, 0x00, 0x1FF,FF 0x, 0x1FF,FF 0x, 0x1FF,FF 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 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, 0x , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x06, 0x , 0x06, 0xC6, 0x7F, 0xFE, 0xE7, 0x3F, 0x7E, 0xFE, 0xC7, 0x7F, 0x00, 0x00, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x0, 0x060, , 0x00, 0x00, 0x00, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x30, 0x1E, 0x6606, 0x60, 0x , 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, 0xFEx 0x3F, 0x00, 0x00, 0x3C, 0x7E, 0xE6, 0x61, 0x1E, 0xC7, 0x3F, 0x70, 0xE0, 0x3F, 0x3C, 0xFE, 0xC3, 0x3F, 0x00, 0x00, 0x3 0x, 0x,E,61 0x70, 0x70, 0xE0, 0x1D, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE7, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x31, 0x3C, 0x,1 0x00, 0x3C, 0x1E, 0xE6, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE6, 0x61, 0x,1E, 0x61, 0x,1 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x7F, 0x1E, 0xE6, 0x3F, 0xFC, 0xE3, 0x3F, 0x70, 0xE0, 0x61, 0x7E, 0xFE, 0xE, 0x, 0xE, 0x 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0 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, 0 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };const[ uint8_t 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 .Start(); FillArrays(); pinMode (cd4017beCLK, AUSGANG); pinMode (cd4017beRST, AUSGANG); CD4017BE(0); // RESET an Dekadenzähler IC senden pinMode (btState, INPUT); pinMode (btn, EINGANG); pinMode (Relais, AUSGANG); sUART.begin(9600); Notiz (2); // Systemeinstellungen vom EEPROM-Sensoren.begin () laden; // DS18B20 starten temprMeas(); temprInit =tempr; Grafik (2); // init graph ledHandler(0);}void loop() { sysControl(); checkBtn(); checkConn(); RX(); u8g.firstPage(); tun {zeichnen(); } while(u8g.nextPage()); wenn (Rahmen ==0) { Verzögerung (3000); Rahmen =1; scrClr(); }} // ---- Speicherverwaltung // Param aufrufen // 2:beim Start lesen // 0, 1:an die richtige Adresse schreiben // Memo ungültig (byte op) { switch (op) { case 2:for (Byte i =0; i  tmrInt[2]) &&(!binFlags[5])) { if (binFlags[2]) { temprMeas(); if ((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; sensors.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); break; 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; Rückkehr; } } 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  

Schaltpläne


Herstellungsprozess

  1. Zutrittskontrolle mit QR, RFID und Temperaturüberprüfung
  2. Temperatur- und Feuchtigkeitsdatenlogger
  3. Arduino mit Bluetooth zur Steuerung einer LED!
  4. Smarte Schuhe (automatische Schnürung und Stromerzeugung)
  5. BME280 Temperatur, Luftfeuchtigkeit und Druck auf dem Nextion-Display
  6. Steuerung des Servomotors mit Arduino und MPU6050
  7. Sprachgesteuerte Bluetooth-Geräte mit OK Google
  8. u-blox LEA-6H 02 GPS-Modul mit Arduino und Python
  9. So liest man Temperatur und Luftfeuchtigkeit auf Blynk mit DHT11
  10. Einfacher und intelligenter Roboterarm mit Arduino