Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Smart Coffee Machine met Arduino en Bluetooth

Componenten en benodigdheden

Arduino Nano R3
× 1
HC-05 Bluetooth-module
× 1
HARDWARIO DS18B20 Temperatuursensor 1m
× 1

Apps en online services

Seriële Bluetooth-terminal gemaakt door Kai Morich
Arduino IDE

Over dit project

Inleiding

Slim automatisch koffiezetapparaat met grafiek, kan worden bediend via Bluetooth... of laad gewoon vers water en het systeem start automatisch!

Alle onderdelen zijn handgemaakt en alle functies zijn mijn eigen ideeën.

Ik heb ook "Test Mode" gecodeerd, zodat de controller kan worden gebruikt als een multifunctionele temperatuurmeter met externe temperatuursensor.

Ontwikkeld op Arduino Nano / Uno, gebruikt ST7920 display , HC-05 Bluetooth adapter, Dallas DS18B20 temperatuursensor , relais om de verwarmingsspoel te regelen, knop met leds, zoemer en een CD4017BE-decenniumteller stuurt de LED-balk aan.

Hoe te beginnen

  • Automatisch starten :in de standby-modus meet het systeem cyclisch de temperatuur op de achtergrond. Laden zoet water veroorzaakt temperatuurdaling , en het systeem zal starten.
    Deze functie kan worden ingeschakeld / uitgeschakeld door "auto" te verzenden vanaf de smartphone, en de instelling wordt opgeslagen in het EEPROM-geheugen.
  • Druk op de knop :om het zetten van koffie te starten/onderbreken, of om de testmodus te verlaten.
  • Stuur een "start"-bericht vanaf uw smartphone, of "stop ".

Video

Toont alle werkende manieren.

Hoe het is gemaakt, hoe het eruit ziet... klik/tik hieronder!

Eenmalige analyse tijdens het koffiezetten

Na 60 seconden vanaf de start vergelijkt de MCU de opgeslagen initiële en de huidige temperatuurwaarden om conclusies te trekken die alleen zijn gebaseerd op temperatuur en verstreken tijd, wat kan zijn:

  • "Je bent het water vergeten. " - (temperatuur werd te hoog)
  • "Koffie voor Twee. " - (minder water - meer temperatuurverhoging)
  • "Koffie voor zes. " - (meer water - minder temperatuurverhoging)
  • "Fout met verwarmingsspiraal! " - (geen significante temperatuurverhoging)

Daarnaast de Detectie sensorfout werkt continu zolang de koffiemachine is ingeschakeld.

Zoals te zien is, had zes doses water meer tijd nodig om dezelfde temperatuur te bereiken die de kleine dosis veel eerder bereikte.

Starten zonder water resulteert in een zeer hoge temperatuur, maar de platte lijn geeft een ongewijzigde temperatuur aan, dus een fout in de verwarmingsbatterij.

Maateenheid wijzigen

De meeteenheid kan worden gewijzigd door "c . te sturen " of "f " van de smartphone, zelfs tijdens een koffiezetproces, en het laat geen sporen achter in de grafiek .

Opgeslagen initiële en vorige temperatuurwaarden worden geconverteerd door een programmafunctie-aanroep die ik heb gecodeerd - gebruikt voor statistieken en analyse. Deze instelling wordt ook opgeslagen in het EEPROM-geheugen.

Dynamische schermelementen

Als het scherm vol is, begint de grafiek naar links te rollen.

Afhankelijk van de gemeten waarde kan een schermelement in de weg zitten. Om botsingen te voorkomen, zijn hun plaatsen dynamisch.

Deze zes kleine geanimeerde afbeeldingen laat zien wat ik heb gecodeerd:

Nou, het was een leuk tijdverdrijf:

Testmodus

Tegen de tijd dat ik deze allemaal had gemaakt, kwam het idee op, waarom zou je de grafiek niet voor andere doeleinden gebruiken?

Dus heb ik de testmodus gecodeerd; bevestig gewoon een externe temperatuursensor en het systeem kan worden gebruikt als een multifunctionele temperatuurmeter met grafiek.

Op deze manier zijn de extreme waarden van de grafiek -20°C (-4°F) en +128°C (+262°F) .

Nummers verzenden vanaf de smartphone tussen 1 en 999999 wordt geaccepteerd als meetinterval in seconden, dus de breedte van de grafiek ligt tussen 128 seconden en 11,57 dagen .

Bluetooth-communicatie

Accepteert opdrachten en verzendt rapporten, detecteert of een smartphone verbinding maakt of de verbinding verbreekt.

Verzonden berichten zijn blauw en de reactie-/rapportberichten zijn groen verzonden door het koffiezetapparaat.

Led-bediening

Een CD4027BE-decenniumteller stuurt de LED-balk aan, ontvangt CLK van de MCU bij elke temperatuurmeting en verhoogt de positie. Als een nieuwe koffiezetprocedure of de testmodus start, stuurt de Atmega 328P een RST-signaal om de standaardpositie in te stellen.

De knop heeft een tweekleurige LED met slechts twee pinnen, dus mijn eenvoudige en grappige oplossing is te zien in de code, hoe deze te bedienen.

  • Effen groen :stand-by of de koffie is klaar, de spoel is uit
  • Effen rood :koffie wordt gezet, de verwarmingsspiraal is aan
  • Rood/Groen om de beurt :Testmodus
  • Knipperend rood :er is een fout opgetreden, dat kan
    -Sensorfout,
    -Verwarmingsspoelfout, of
    -U bent het water vergeten, dus de koffiezetprocedure werd onderbroken door het systeem

Code

  • Slim koffiezetapparaat - Ősi Gyula
Slim koffiezetapparaat - Ősi GyulaArduino
// Programmacode - Smart Coffee Maker. Ontwikkeld op Arduino Nano, gebruikt ST7920-display, HC-05 Bluetooth-adapter,// Dallas DS18B20-temperatuursensor, relais, knop, leds, zoemer en een CD4017BE-decenniumteller.// // Kan worden bediend via Bluetooth door opdrachten en werkparameters te verzenden of gebruik de knop... of laad gewoon vers water!//// Functies:// -Grafiek:dynamische temperatuurgrafiek op het scherm// -Autostart:laden van vers water veroorzaakt temperatuurdaling en het systeem zal starten// Dit functie kan worden ingeschakeld / uitgeschakeld door "Auto" te verzenden en de instelling wordt opgeslagen in het EEPROM-geheugen// -Analyse tijdens het koffiezetten:60 seconden na het starten vergelijkt het systeem de huidige en initiële temperatuurwaarden// en trekt conclusies die kunnen be:// 1. Je bent het water vergeten (temperatuur is te hoog)// 2. Coffee for Two (minder water - meer temperatuurverhoging)// 3. Coffee for Six (meer water - minder temperatuurverhoging)// 4. Fout verwarmingsspiraal (geen significante temperatuurverhoging vanaf start)// -Detectie sensorfout (krijgen abnormale waarden)// -C elsius of Fahrenheit werken:kan worden omgeschakeld door C of F vanaf de smartphone te verzenden, zelfs tijdens een koffiezetprocedure.// De initiële en vorige temperatuurwaarden worden geconverteerd en gebruikt voor statistieken en analyse.// Deze instelling wordt opgeslagen in het EEPROM-geheugen .// -Testmodus:door een externe temperatuursensor aan te sluiten, kan het systeem worden gebruikt als een multifunctionele temperatuurmeter.// In deze modus ligt het grafiekinterval tussen -20C / -4F en +128C / +262F.// Verzenden van numerieke waarden tussen 1 en 999999 worden geaccepteerd als meetinterval in seconden, dus // de grafiekbreedte kan tussen 128 seconden en 11,57 dagen zijn.// -Bluetooth-communicatie:accepteert opdrachten en verzendt rapporten, detecteert of een smartphone verbinding maakt of verbreekt// - LED-balkcontrole:de MCU bestuurt een CD4027BE-decenniumteller en de LED-balk zal bij elke temperatuurmeetcyclus stappen // ------------------------- -------------------------------------------------- -------------------------------------------------- ---// // ontworpen, gebouwd t en geprogrammeerd // door Gyula Osi//// Alle rechten voorbehouden.// ---- Display #include "U8glib.h"//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // OLED-scherm I2C Bus, SDA (TX) A4, SCL (RX) A5U8GLIB_ST7920_128X64 u8g (11, 10, 9, U8G_PIN_NONE); // display constructor PIN6-D11, PIN5-D10, PIN4-D9byte frame =0; // start logo pointer // ---- Poorten &gecontroleerde randapparatuur// rode led op A0 // grn led op A1const int bright[2] ={0, 500};const byte buzzer =3;const byte cd4017beCLK =4; // control CD4017BE decade counterconst byte cd4017beRST =5;const byte btn =13;const byte relay =12;// ---- Systeemstrings#define strSize 3String str[strSize]; // systeemgebeurtenissen en rapporten printout#define reportSize 5const String reportStr[reportSize] ={"Begint...", "Binnenkort stand-by...", "Gestopt.", " *** TESTMODUS ***", "Normale modus."};//#define standbySize 5//const String standbyStr[standbySize] ={"Druk op de toets", ">", "of", "send", "start"};const String autostartStr[2 ] ={"Autostart uit.", "Autostart aan."};// ---- Structuur van systeemstatus Binaire vlagarray #define flagElements 6bool binFlags[flagElements] ={0, 1, 1, 0, 0, 0 }; // ---- elementen [i] doel init/standby-modus val // 0 aangevinkt 0 // 1 voltooid 1 // 2 stand-by 1 // 3 stand-by bericht verzonden 0 // 4 spoel/sensorfout 0 // 5 test mode 0// ---- Temperatuurmeting en gerelateerde functies#include "OneWire.h" #include "DallasTemperature.h"#define DS18B20 2 // stel de OneWire-bus in op D2OneWire temprWire(DS18B20); // stel DS18B20 in om te werken op de OneWire-busDallasTemperature-sensoren(&temprWire);float tempr; // meetwaarde float temprInit; // kopie meetwaarde voor eenmalige vergelijking float temprPrev; // kopie van gemeten waarde voor cyclische vergelijking#define mUnit 2float temprBottomLim[mUnit] ={0, 26}; // autostart onder tempr van EN eenmalige analyse onder tempr ofconst char unit [mUnit] ={'F', 'C'};const String unitStr[mUnit] ={"Fahrenheit-modus.", "Celsius-modus."};float trendSens[mUnit] ={ 0, 0.1}; // +/- bereik (F/C) dat wordt geëvalueerd als constante temperatuur // *** Fahrenheit-referentiewaarden worden berekend bij het opstarten!bool trend[2] ={1, 0}; // beschrijft temperatuurtrends zoals hieronder // ---- elementen [i] doel // 0 veranderen // 1 trend #define checkSize 7const String checkStr[checkSize] ={"Water gedetecteerd!", "Fout verwarmingsspiraal!", "Koffie voor zes", "Koffie voor twee", "Je bent het water vergeten!", "Sensorfout!", "Je koffie is klaar."};float temprCheck[mUnit][checkSize] ={{ }, {- 0,15, 5, 17, 28, 60, -127, 110}}; // |<-- REL -->|<--CONST-->| // [j] F / C // ---------------------------------------- ----- // ---- elementen [i] doel gebruikt als // 0 autostart rel-waarde // 1 spoelfoutdetectie rel-waarde // 2 water voor zes rel-waarde // 3 water voor twee rel-waarde // 4 geen waterdetectie rel waarde // 5 geen signaal op D2 const reference // 6 kookpunt const reference// ---- Grafiekverklaringen en variabelen#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, grafiekBereik[1][0][1]}}}; // [k] 0 1 0 1 // [j] | 0 | 1 // ---- elementen [i] | | | | // 0 minFnorm maxFnorm minFtest maxFtest // 1 minCnorm maxCnorm minCtest maxCtestfloat graphDiff[mUnit][mode]; // verticale stappen op temperatuur// ---- Systeemtimers, controle en analyse#include  elapsedMillis timer0; // 8-bit, PWM-timer, gebruikt door functie elapsedMillis () unsigned long tmrPrev =0; // de verstreken tijd is de vorige wanneer het interval upbool cyclisch =0;const long tmrInt[5] ={500, 2000, 60000, 640000, 800000}; // ---- elementen [i] doel // 0 meetinterval (testmodus), led ctrl // 1 meetinterval (normale modus) // 2 eenmalige analyses (normale modus, tijdens het koffiezetten) / cyclische analyse ( standby-modus) // 3 standby-bericht verzenden (normale modus, na het zetten van koffie) // 4 systeem-stand-by (normale modus, na het zetten van koffie)long copyof_tmrInt0 =tmrInt[0]; const String tmrInt0Str ="Interval gewijzigd."; // ---- Configuratie van seriële communicatieconstbyte btState =6;bool conn =0;const String connStr[2] ={"Verbinding verbroken.", "Smartphone verbonden."};#include  const int RX1 =7;const int TX1 =8;SoftwareSeriële SUART(RX1,TX1); #define exRXSize 6char exRX[exRXSize]; // variabele om gegevens van de seriële poort te ontvangen// ---- Geheugenbeheer#include #define occBytes 2const byte addr[occBytes] ={ 0, 1};bool sysSettings[occBytes]; // ---- Geheugenkaart adres [i] | gegevens | beschrijf | opgeslagen val // ---------------------------------------------- ------- // 0 | bool | automatisch starten | 0:geen autostart, 1:autostart // 1 | bool | meeteenheid | 0:Fahrenheit, 1:Celsius// ---- Terminators &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, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0xFF, 0x7F, 0xF0, 0x3F, 0x00, 0xFE,x 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0xFF, 0x7F, 0xF0, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 1, 0x 0x 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, 0x001 0xFE, , 0x00, 0x18, 0xC0, 0x8F, 0xFF, 0x1F, 0x7F, 0x8C, 0x3F, 0x1E, 0xFF, 0x00, 0xFE, 0x1F, 0xFF, 0xF1, 0x00, 0x18, 0xC0, 0x8F, 0xFF, 0,0x , 0x1E, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0x31, 0xFE, 0x7F, 0xFC, 0x8F, 0xFF, 0x1F, 0x1F, 0x0C, 0x3E, 0x1E, 0xFF, 0xFF, 0xF8, 0x1F,xF8, 0x1F, , 0xFC, 0x0F, 0x0E, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0xFC, 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0x7F, 0xF0, 0x0F, 0x0E,x1, 0x0, 0xC , 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0x7F, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F,x 0F, 0x7C,0xF8, 0x1F, 0x7C,0 , 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x00, 0x7E, 0xF0, 0x0F, 0xFE, 0x18, 0x1F,x1F,x 0x0C,0 , 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,x 0F,x 0F, 0x07C,078 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,x 0x1E,x 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 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, 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, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0x00, 0x7E,0x06, 0x , 0x06, 0xC6, 0x7F, 0xFE, 0xE7, 0x3F, 0x7E, 0xFE, 0xC7, 0x7F, 0x00, 0x00, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x 060, 0x60,x , 0x00, 0x00, 0x00, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x30, 0x1E, 0x66, 0x66, 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, 0x 0x3F, 0x00, 0x00, 0x3C, 0x7E, 0xE6, 0x61, 0x1E, 0xC7, 0x3F, 0x70, 0xE0, 0x3F, 0x3C, 0xFE, 0xC3, 0x3F, 0x00, 0x00, 0x3C, 0xDE,x 0xE, 0xDE, 0x70, 0x70, 0xE0, 0x1D, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE7, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x31, 0x3C, 0x1, 0x00, 0x3C, 0x1E, 0xE6, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE6, 0,x0,07x1, 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x7F, 0x1E, 0xE6, 0x3F, 0xFC, 0xE3, 0x3F, 0x70, 0xE0, 0x61, 0x7E, 0xFE,0xE7,0,00 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, 0x00, };const uint[8_GM 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 .beginnen(); fillArrays(); pinMode (cd4017beCLK, UITGANG); pinMode (cd4017beRST, UITGANG); CD4017BE(0); // stuur RESET naar Decade Counter IC pinMode (btState, INPUT); pinMode(btn, INPUT); pinMode (relais, UITGANG); sUART.begin(9600); notitie(2); // laad systeeminstellingen van EEPROM sensors.begin(); // start DS18B20 temprMeas(); temprInit =tempr; grafiek (2); // init grafiek ledHandler(0);}void loop() {sysControl(); checkBtn(); checkConn(); RX(); u8g.firstPage(); doe { tekenen(); } while(u8g.nextPage()); if (frame ==0) { vertraging (3000); kader =1; scrClr(); }} // ---- Geheugenbeheer // call param // 2:lezen bij opstarten // 0, 1:schrijf naar het juiste adres //void memo(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); pauze; 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; opbrengst; } } 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   

Schema's


Productieproces

  1. Toegangscontrole met QR, RFID en temperatuurverificatie
  2. Temperatuur- en vochtigheidsdatalogger
  3. Arduino met Bluetooth om een ​​LED te bedienen!
  4. Slimme schoenen (automatisch rijgen en elektriciteit opwekken)
  5. BME280 temperatuur, vochtigheid en druk op Nextion-display
  6. Besturing van servomotor met Arduino en MPU6050
  7. Bluetooth spraakgestuurde apparaten met OK Google
  8. u-blox LEA-6H 02 GPS-module met Arduino en Python
  9. De temperatuur en vochtigheid op Blynk aflezen met DHT11
  10. Eenvoudige en slimme robotarm met Arduino
  11. Spraakherkenning en synthese met Arduino