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

Arduino kookwekker

Componenten en benodigdheden

Arduino UNO
× 1
Adafruit Standaard LCD - 16x2 Wit op Blauw
× 1
SparkFun Drukknopschakelaar 12 mm
× 4
Weerstand 10k ohm
× 4
Weerstand 221 ohm
Nou, 220 ohm...
× 2
Single Turn Potentiometer-100k ohm
× 1
Zoemer
× 1
Broodplank (algemeen)
× 1
Jumperdraden (algemeen)
× 1

Over dit project

In het begin schiep God de hemel en de aarde. En mensen. En mensen hebben digitale kookwekkers gemaakt, zoals deze.

En mensen zeiden:Cool maar een beetje somber. Laten we een betere maken!

En God zei, ik hoorde je roep, laat er Arduino's zijn:en er waren Arduino's over de hele aarde, en dat was goed.

En mensen namen een Arduino en creëerden een betere kookwekker, zoals deze.

En God zag de nieuwe kookwekker en zei:ik zag je nieuwe kookwekker en hij ziet er vreselijk uit , maar het lijkt te veel leuk ! En dat is goed . :-)

Wat je moet hebben

Nu je weet waar dit allemaal vandaan komt, gaan we er dieper op in.

Alle componenten die ik gebruikte kwamen uit de Arduino Starter Kit , inclusief het kleine breadboard dat je op de foto's en in de video ziet. Voel je vrij om het project onder te brengen in een groter , als je wilt.

Je hebt ook een stroombron nodig:tijdens het spelen zijn de USB-poort en kabel van de pc voldoende.

Wat u moet doen

Ten eerste:verzamel alle benodigde componenten uit de Starter Kit of de componentenbak van uw voorkeur; als je er geen hebt, geen paniek. Er is voldoende op het internet. U vindt de componentenlijst hieronder.

En, nou, je hebt de code ook nodig. Het zit in zijn doos, hieronder weer.

Hoe het werkt

Kortom, net als elk ander soortgelijk apparaat dat je voor een dollar kunt kopen in elke winkel bij jou in de buurt. Maar dit is van jou . En dit laat je zien hoe die kleine gadgets werken echt.

Het sleutelwoord hier is:huidige modus . De timer zelf kan slechts in één van de vier modi tegelijk lopen:

  • IDLE - de timer wacht op uw invoer en toont de momenteel ingestelde tijdsduur; dit is ook de beginmodus na het opstarten of resetten.
  • SETUP - u kunt naar deze modus gaan door S4 lang ingedrukt te houden (in de code wordt dit ook "resetknop" genoemd); hier kunt u met S3 ("start stop-knop") kiezen welke waarde u wilt wijzigen om de verstreken tijd in te stellen die later moet worden afgeteld; ten slotte kunt u met respectievelijk S2 ("knop omlaag") en S1 ("knop omhoog") de gekozen waarde (uren, minuten of seconden) verlagen of verhogen.
  • LOPEND - U kunt deze modus openen door op S3 te drukken, terwijl u voor het verlaten zowel S3 als S4 nodig heeft (wat u naar de IDLE-modus zal leiden).
  • BELLEN - Wanneer de gewenste hoeveelheid tijd is verstreken, wordt deze modus automatisch geactiveerd; je kunt het verlaten (d.w.z. de kleine jongen laten stoppen met rinkelen) door op een willekeurige schakelaar te drukken.

De code

Eerst moeten we opnemen de juiste bibliotheken:

#include 
#include

Als je ze nog niet hebt, moet je ze downloaden en installeren:

  • Paul Stoffregen's Tijd Bibliotheek (download a.u.b. de ZIP via de groene knop "Klonen of downloaden")
  • Arduino LiquidCrystal-bibliotheek

Laten we vervolgens initialiseren die mooie LCD-module:

LiquidCrystal lcd (12, 11, 5, 4, 3, 2); 

Aarzel niet om de pinnen naar believen door elkaar te halen om een ​​mooie bedradingslay-out te krijgen:volg me hierin niet, want ik heb een vreselijk bedradingsplan gemaakt! :D U kunt bijvoorbeeld de laatste vier pinnen in de bovenstaande verklaring omdraaien om te voorkomen dat de gele draden elkaar kruisen, zoals u in het onderstaande schema kunt zien (u moet uiteraard de pinconstanten van de knop dienovereenkomstig aanpassen, zie hieronder). Speel, veel plezier! Het leven met Arduino's begint direct na dat kopiëren/plakken!

De volgende 51 coderegels bevatten de declaratie en initialisatie van statische variabelen. Blader gerust door ze, hun kristalheldere namen en enkele verspreide opmerkingen zullen u helpen het hele ding te begrijpen.

De functie setup() voert de gebruikelijke voorbereidende stappen uit die je al ontelbare keren hebt gezien in elke Arduino-schets die er is en tot nu toe. De enige opmerkelijke verklaring is de eerste, die de positie van de initiële cursor op het LCD-scherm zal bepalen. Want ja:deze module vereist dat je een positie instelt langs de rijen en kolommen en dan iets "afdrukt", dat vanaf die positie verschijnt.

Laten we nu naar de loop()-functie gaan.

Laten we eerst eens kijken naar de schakelstatussen. Om dit te bereiken wordt het volgende codeblok gebruikt voor bijna elk van hen:

/*
* Start/Stop-knopbeheer
*/
startStopButtonPressed =false;
startStopButtonState =digitalRead(startStopButtonPin);
if(startStopButtonState !=startStopButtonPrevState)
{
startStopButtonPressed =startStopButtonState ==HOOG;
startStopButtonPrevState =startStopButtonState;
}

Een digitalRead wordt uitgegeven tegen de gerelateerde pin en het resultaat wordt vergeleken met een eerder gelezen waarde:als er iets is veranderd, wordt de nieuwe waarde opgeslagen voor toekomstig gebruik en de bool "xxxButtonPressed" statische variabele wordt ingesteld op true als de knop wordt ingedrukt.

Als u naar het onderstaande schakelschema kijkt, zult u merken dat elke ingangspen door een weerstand van 10k naar LAAG wordt gedwongen, tenzij de overeenkomstige schakelaar wordt ingedrukt en de pen zelf rechtstreeks is aangesloten op +5V. Een redelijk klassiek scenario, hè?

Eerder zei ik "bijna elk van hen" omdat er één knop is die op een andere manier werkt dan de andere:S4. Het codeblok kan de bovengenoemde lange druk detecteren om naar de SETUP-modus te gaan.

Vervolgens komt de modusbeheerblokschakelaar:elk geval kijkt naar de triggers van de knopstatus ("xxxButtonPressed") en leidt de stroom om naar de juiste nieuwe status, of voert de juiste actie uit.

case MODE_IDLE:
if(resetButtonPressed)
{
Reset();
}
if(resetButtonLongPressed)
{
currentMode =MODE_SETUP;
}
if(startStopButtonPressed)
{
currentMode =currentMode ==MODE_IDLE ? MODE_RUNNING:MODE_IDLE;
if(currentMode ==MODE_RUNNING)
{
// STARTTIMER!
startTime =now();
}
}
breken;

Het vorige codefragment laat zien hoe de IDLE-modus wordt beheerd, en het is vrij duidelijk. Een ander voorbeeld laat zien hoe een druk op de knop tijdens het rinkelen deze stopt:

case MODE_RINGING:
if(resetButtonPressed || startStopButtonPressed || downButtonPressed || upButtonPressed)
{
currentMode =MODE_IDLE;
}
break;

Ziet er makkelijk uit, niet? :-) Dat is zo.

Het volgende blok - "Tijdbeheer" - voert de werkelijke tijdsverschilberekening uit, activeert de RINGING-modus en belt feitelijk de buzz wanneer het tijd is om dit te doen.

Het laatste blok - "LCD-beheer" - beheert het LCD-scherm voor elke modus door de juiste strings op hun juiste locaties af te drukken.

Dat is het.

Afsluiten en actie!

Nu deze kleine puppy geen geheimen meer voor je heeft, laten we hem in actie zien. Bedankt voor het kijken en veel plezier!


Code

  • ArduinoSketch
ArduinoSketchArduino
/************************************************** **** * Arduino Kitchen Timer v1.0 - 2016/01/27 * Door Angelo Fiorillo (Rome, IT) * Dit werk wordt gedistribueerd onder de GNU General * Public License versie 3 of later (GPL3+) * Voeg dit tegoed toe let op als je * enig deel van deze schets wilt hergebruiken. Respecteer mijn werk * ​​zoals ik met het uwe zal doen. * Neem gerust contact met mij op:[email protected] * ***************************************** ***********/#include #include  // FIX 2018-08-12 Dit herstelt «'nu' is niet gedeclareerd in dit bereik» errorLiquidCrystal lcd( 12, 11, 5, 4, 3, 2);const int buzzerPin =10;const int resetButtonPin =6;const int startStopButtonPin =7;const int downButtonPin =8;const int upButtonPin =9;int setupHours =0; // Hoeveel uur wordt er afgeteld bij het starten in setupMinutes =0; // Hoeveel minuten wordt er afgeteld bij het starten int setupSeconds =0; // Hoeveel seconden wordt er afgeteld wanneer startstime_t setupTime =0;int currentHours =0;int currentMinutes =0;int currentSeconds =0;time_t currentTime =0;time_t startTime =0;time_t elapsedTime =0;int resetButtonState =LAAG;lang resetButtonLongPressCounter =0;int startStopButtonState =LAAG;int upButtonState =LAAG;int downButtonState =LAAG;int resetButtonPrevState =LAAG;int startStopButtonPrevState =LAAG;int upButtonPrevState =LAAG;int downButtonPrevState =LOW =Button reset; startStopButtonPressed =false;bool upButtonPressed =false;bool downButtonPressed =false;const int MODE_IDLE =0;const int MODE_SETUP =1;const int MODE_RUNNING =2;const int MODE_RINGING =3;int huidigeMode =MODE_IDLE; // 0=inactief 1=setup 2=in bedrijf 3=bellen // Opstarten --> inactief // Reset --> inactief // Start/Stop --> start of stop teller // Omhoog / Omlaag --> NOP // Reset (lang indrukken) --> setup openen // Start/Stop --> data select // Up --> huidige datawaarde verhogen // Down --> huidige datawaarde verlagen // Reset --> setup afsluiten (idle)int dataSelection =0; // Momenteel geselecteerde gegevens voor bewerking (setup-modus, wijzigingen met Start/Stop) // 0=uren (00-99) 1=minuten (00-59) 2=seconden (00-59) ongeldige setup() { // plaats hier uw setup-code om een ​​keer uit te voeren:lcd.begin (16, 2); pinMode (resetButtonPin, INPUT); pinMode (startStopKnopPin, INPUT); pinMode (omhoogKnopPin, INPUT); pinMode(downButtonPin, INPUT); pinMode (zoemerPin, UITGANG); Serial.begin(9600);}void loop() { // plaats hier uw hoofdcode om herhaaldelijk uit te voeren:startStopButtonPressed =false; upButtonPressed =onwaar; downButtonPressed =onwaar; /* * Beheer van resetknop */ resetButtonPressed =false; resetButtonLongPressed =onwaar; resetButtonState =digitalRead (resetButtonPin); if (resetButtonState! =resetButtonPrevState) { resetButtonPressed =resetButtonState ==HOOG; resetButtonPrevState =resetButtonState; } else // Lang indrukken beheer... {if(resetButtonState ==HOOG) { resetButtonLongPressCounter++; if (resetButtonLongPressCounter ==100) { resetButtonPressed =false; resetButtonLongPressed =waar; resetButtonLongPressCounter =0; } } else { resetButtonLongPressCounter =0; resetButtonPressed =onwaar; resetButtonLongPressed =onwaar; } } /* * Start/Stop-knopbeheer */ startStopButtonPressed =false; startStopButtonState =digitalRead (startStopButtonPin); if (startStopButtonState! =startStopButtonPrevState) { startStopButtonPressed =startStopButtonState ==HOOG; startStopButtonPrevState =startStopButtonState; } /* * Beheer van knop omlaag */ downButtonPressed =false; downButtonState =digitalRead (downButtonPin); if (downButtonState! =downButtonPrevState) { downButtonPressed =downButtonState ==HOOG; downButtonPrevState =downButtonState; } /* * Beheer van knoppen omhoog */ upButtonPressed =false; upButtonState =digitalRead (upButtonPin); if (upButtonState! =upButtonPrevState) { upButtonPressed =upButtonState ==HOOG; upButtonPrevState =upButtonState; } /* * Modusbeheer */ switch(currentMode) { case MODE_IDLE:if(resetButtonPressed) { Reset(); } if (resetButtonLongPressed) { currentMode =MODE_SETUP; } if (startStopButtonPressed) { currentMode =currentMode ==MODE_IDLE ? MODE_RUNNING:MODE_IDLE; if (currentMode ==MODE_RUNNING) { // START TIMER! startTime =nu(); } } pauze; case MODE_SETUP:if (resetButtonPressed) {// Exit setup-modus setupTime =setupSeconds + (60 * setupMinuten) + (3600 * setupHours); currentHours =setupHours; currentMinutes =setupMinuten; currentSeconds =setupSeconds; dataSelectie =0; huidigeMode =MODE_IDLE; } if (startStopButtonPressed) { // Selecteer de volgende gegevens om dataSelection++ aan te passen; if(dataSelection ==3) { dataSelection =0; } } if (downButtonPressed) { switch (dataSelection) { case 0:// hours setupHours--; if (setupHours ==-1) { setupHours =99; } pauze; geval 1:// minuten setupMinutes--; if (setupMinutes ==-1) { setupMinuten =59; } pauze; geval 2:// seconden setupSeconds--; if (setupSeconds ==-1) { setupSeconds =59; } pauze; } } if(upButtonPressed) { switch(dataSelection) { case 0:// hours setupHours++; if (setupHours ==100) { setupHours =0; } pauze; geval 1:// minuten setupMinutes++; if (setupMinutes ==60) { setupMinuten =0; } pauze; geval 2:// seconden setupSeconds++; if (setupSeconds ==60) { setupSeconds =0; } pauze; } } pauze; case MODE_RUNNING:if (startStopButtonPressed) { currentMode =MODE_IDLE; } if(resetButtonPressed) { Reset(); huidigeMode =MODE_IDLE; } pauze; case MODE_RINGING:if(resetButtonPressed || startStopButtonPressed || downButtonPressed || upButtonPressed) { currentMode =MODE_IDLE; } pauze; } /* * Tijdbeheer */ switch (currentMode) { case MODE_IDLE:case MODE_SETUP:// NOP pauze; case MODE_RUNNING:currentTime =setupTime - (now() - startTime); if (currentTime <=0) { currentMode =MODE_RINGING; } pauze; case MODE_RINGING:analogWrite(buzzerPin, 20); vertraging(20); analogWrite(buzzerPin, 0); vertraging (40); pauze; } /* * LCD-beheer */ //lcd.clear(); lcd.setCursor(0, 0); switch (currentMode) { case MODE_IDLE:lcd.print ("Timer ready"); lcd.setCursor(0, 1); lcd.print(currentHours); lcd.print(" "); lcd.print(currentMinutes); lcd.print(" "); lcd.print (huidige seconden); lcd.print(" "); pauze; case MODE_SETUP:lcd.print ("Instelmodus:"); switch(dataSelection) { case 0:lcd.print("HRS"); pauze; geval 1:lcd.print ("MINS"); pauze; geval 2:lcd.print ("SECS"); pauze; } lcd.setCursor(0, 1); lcd.print(insteluren); lcd.print(" "); lcd.print(setupMinuten); lcd.print(" "); lcd.print(setupSeconden); lcd.print(" "); pauze; case MODE_RUNNING:lcd.print("Aftellen..."); lcd.setCursor(0, 1); if(uur(currentTime) <10) lcd.print("0"); lcd.print(uur(currentTime)); lcd.print(":"); if(minuut(currentTime) <10) lcd.print("0"); lcd.print(minuut(currentTime)); lcd.print(":"); if(second(currentTime) <10) lcd.print("0"); lcd.print(seconde(currentTime)); pauze; case MODE_RINGING:lcd.print(" RING-RING! "); lcd.setCursor(0, 1); lcd.print(" "); pauze; } delay(10);}void Reset(){ currentMode =MODE_IDLE; currentHours =setupHours; currentMinutes =setupMinuten; currentSeconds =setupSeconds;}

Schema's

Je kunt elk breadboard voor algemeen gebruik gebruiken, inclusief de Starter Kit die kleiner is dan de hier afgebeelde (de zoemer kan onder de gele draden worden geplaatst, zie de video en de foto's).

Productieproces

  1. Dorstalarm plantalarm
  2. DIY Eenvoudige 20 kHz Arduino-oscilloscoop op Nokia 5110 LCD
  3. Slimme jaloezieën
  4. Italiaanse Word Clock
  5. Arduino Countdown Timer
  6. Sigfox kWh-meter
  7. Bluetooth-temperatuurmeter
  8. Gebarengestuurd slot
  9. The Companion IC
  10. Een geïsoleerde analoge ingang voor Arduino
  11. Meet je reactietijd