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

LCD-wekker met vele gezichten

Componenten en benodigdheden

Arduino UNO
Als je de meegeleverde PCB gebruikt, gebruik dan een ATmega328 DIL-microprocessor, 16MHz-kristal, 2x22pf-condensatoren, 7805-regelaar, 100uF 16V condensator, 3 x 0.1uF condensatoren en 1uF condensator.
× 1
Weerstand 10k ohm
× 4
Through Hole-weerstand, 470 ohm
× 1
Adafruit Standaard LCD - 16x2 Wit op Blauw
× 1
Zoemer
× 1
Condensator 10 µF
× 1
Real Time Clock (RTC)
DS1302 RTC
× 1
32.768 kHz kristal
× 1
Knoopcelbatterij CR2032
+ houder. Als u een PCB gebruikt, gebruik dan een CR1220-batterij en -houder
× 1
Kantelschakelaar, ingekapseld
Kwikschakelaar
× 1
Trimmerpotentiometer, 10 kohm
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)

Apps en online services

Arduino IDE

Over dit project

Er is een nieuwe versie met 10 wijzerplaten te vinden hier .


Op zoek naar iets om te bouwen, besloot ik op een LCD 1602-klok. Na het internet te hebben doorgenomen en veel verschillende implementaties te hebben gevonden, besloot ik waarom niet één klok maken die ze allemaal bevat.

Klokfuncties

  • Acht verschillende weergavestijlen
  • Stel tijd, huidige datum, geboortedatum en alarm in
  • Kwikschakelaar om alarm uit te schakelen
  • Achtergrondverlichting
  • DHT21 temperatuur- en vochtigheidssensor

Breadboard-versie

De eigenlijke elektronica is vrij eenvoudig.

Eenmaal bedraad, laadt u de schets in uw Arduino IDE en uploadt u deze naar de Arduino UNO. (Niet afgebeeld is dat de DHT21 is aangesloten op D9)

De klok gebruiken

De klok heeft drie knoppen - SETUP, INCREMENT, DECREMENT en een TILT-schakelaar.

Als de achtergrondverlichting uit is, kunt u door op een willekeurige knop te drukken de achtergrondverlichting inschakelen. Als er geen knoppen worden ingedrukt terwijl de achtergrondverlichting aan is, schakelt deze zichzelf na 5 seconden uit. Terwijl de achtergrondverlichting aan is, voeren de knoppen de volgende taken uit:

INSTELLEN - Hierdoor worden de SETUP-schermen weergegeven. Het teken met rechte haakjes is de cursor. Door op de INCREMENT- of DECREMENT-knoppen te drukken, wordt de waarde waar de cursor op staat respectievelijk verhoogd of verlaagd. Door nogmaals op de SETUP-knop te drukken, gaat de cursor tussen Uren, Minuten, Dag, Maand, Jaar, Geboortedag, Geboortemaand, Geboortejaar, Alarmuren, Alarmminuten en terug naar de KLOK-modus.

VERHOGING - Als u zich niet in de SETUP-schermen bevindt, schakelt deze knop tussen de verschillende klokstijlen.

VERMINDERING - Als u zich niet in de SETUP-schermen bevindt, schakelt deze knop het alarm in of uit.

KANTELSCHAKELAAR - Wanneer het alarm afgaat, wordt het alarm uitgeschakeld door de klok te kantelen of op een willekeurige knop te drukken.

Een volledig afgewerkte klok bouwen

Om je build van het breadboard naar een volledig afgewerkte klok te brengen, heb je een printplaat en wat extra componenten nodig. De Eagle-bestanden zijn bijgevoegd als u de PCB commercieel wilt laten maken of wilt doen zoals ik deed en het zelf zou maken. Ik heb de tonermethode gebruikt.

OPMERKING:Omdat het LCD 1602-display is aangesloten op de hoofdprintplaat met behulp van een haakse pin-header, kan het erg moeilijk zijn om het bord en het display in de behuizing te plaatsen als ze al aan elkaar zijn gesoldeerd. Met een dubbelzijdig bord met doorlopende beplating kunt u het display op zijn plaats op het bord solderen.

Met behulp van onderdelen die ik in de werkplaats had, werd de Arduino UNO vervangen door een ATMega328 DIL-chip, 16MHz kristal en twee 22pf keramische condensatoren. De 5V-regelaar is van het type 7805 TO-220 en een 100uF 16V-condensator voor afvlakking. De RTC is een DS1302 met een 32.768 KHz horlogeglas. De luidspreker is een passieve zoemer die DC geïsoleerd is met een 10uF 16V condensator. De 0.1uF en 1uF condensatoren zijn monolithische keramische condensatoren (5 mm gatafstand). Weerstanden zijn 5% 1/8 watt of je kunt 1/4 watt gebruiken als je dat wilt. De kwikschakelaar kan elke maat hebben. De mijne had een diameter van 5 mm, maar een kleinere is voldoende. De drie voelbare knoppen aan de achterkant van het bord zijn 6 mm x 6 mm met een schacht van 13 mm.

De behuizing is 3D-geprint met een laaghoogte van 0,2 mm en heeft geen steunen. Boor de montagegaten van de printplaat uit met een boor van 2,5 mm en maak een schroefdraad met een tap van 3 mm. Gebruik M3 6 mm schroeven om het bord op zijn plaats te bevestigen. Ik heb ook de vier montagegaten op de printplaat uitgeboord tot 4 mm om eventuele aanpassingen mogelijk te maken om te voorkomen dat de knoppen op de behuizing blijven plakken bij het bevestigen van het bord.

Credits

Deze klok is een mash-up van een aantal klokken die verschillende makers in de loop der jaren hebben gemaakt.

De basis van deze klok is Arduino Digital Clock With Alarm Function (custom PCB). Ik heb de hoes aangepast zodat deze in twee delen werd afgedrukt en niet in vier.

  • Standaard schermontwerp door Michalis Vasilakis
  • Dual Thick-lettertype van Arduino World
  • Dual Beveled lettertype door Arduino Forum
  • Dual Trek-lettertype door Carrie Sundra
  • Dual Thin-lettertype van Arduino World
  • Woordconcept door LAGSILVA
  • Bioritme klok door John Bradnam
  • Weerklok van ARDUinoautoMOTIVE

Updates

29/06/20

- Spelfouten in WORD-klok opgelost
- #defines toegevoegd om achtergrondverlichting te regelen
- Time-out van achtergrondverlichting verhoogd van 5 naar 10 seconden

23/11/20

- Geboortedatum-instelling en EEPROM-opslag toegevoegd
- Bioritme-wijzerplaat toegevoegd
- Opgeschoond Setup-schermcodering

Er wordt verondersteld dat op basis van onze geboortedatum, bioritmen de hoogte- en dieptepunten van ons leven kunnen bepalen. Bioritme bestaat uit drie cycli:een fysieke cyclus van 23 dagen, een emotionele cyclus van 28 dagen en een intellectuele cyclus van 33 dagen. De bioritmeklok toont elke toestand als een balk.

De balk geeft aan dat het bioritme zich ofwel in een positieve cyclus (bovenste balk) of in een negatieve cyclus (onderste balk) bevindt. De lengte van de balk geeft aan hoe positief of negatief deze in de cyclus is.

06/12/20

- DHT21-ondersteuning toegevoegd
- Thermometer- en vochtigheidswijzerplaat toegevoegd

Er is een nieuwe weer-wijzerplaat toegevoegd. Het leest een DHT21 temperatuur- en vochtigheidssensor die aan de achterkant van de behuizing is toegevoegd. De printplaat is bijgewerkt met een 3-pins connector voor de DHT21-sensor.


Code

  • DigitalClockAlarmV7.ino
DigitalClockAlarmV7.inoC/C++
/* 1602 LCD-wekker * door John Bradnam ([email protected]) * * Display 16x2:Setup:Setup Alarm * +----------------+ +- ---------------+ +----------------+ * |UU:MM:SS | UU:MM| |>UU :>MM | | Alarm instellen | * |DD/MM/JJ | ALARM| |>DD />MM />JJJJ | |>UU :>MM | * +----------------+ +----------------+ +------------ ----+ * * 25/06/2020 * - Nam de klok van Michalis Vasilakis als codebasis (https://www.instructables.com/id/Arduino-Digital-Clock-With-Alarm-Function-custom-P/ ) * - Aangepast aan hardware - DS1302 RTC en LCD-achtergrondverlichting * - Ondersteuning toegevoegd voor verschillende weergavestijlen * - Standaard schermontwerp door Michalis Vasilakis * - Dubbel dik lettertype door Arduino World (https://www.hackster.io/tharduinoworld/ arduino-digital-clock-version-1-b1a328) * - Dual Bevelled-lettertype door Arduino Forum (https://forum.arduino.cc/index.php/topic,8882.0.html) * - Dual Trek-lettertype door Carrie Sundra ( https://www.alpenglowindustries.com/blog/the-big-numbers-go-marching-2x2) * - Dual Thin-lettertype van Arduino World (https://www.hackster.io/tharduinoworld/arduino-digital-clock -version-2-5bab65) * - Woordconcept door LAGSILVA (https://www.hackster.io/lagsilva/text-clock-bilingual-en-pt-with-arduino-881a6e) * 29/06/20 * - Spelfouten in WORD-klok opgelost * - #defines toegevoegd aan vervolg rol achtergrondverlichting * - Time-out achtergrondverlichting verhoogd van 5 naar 10 seconden * 22/11/20 * - Geboortedatum instellen en EEPROM-opslag toegevoegd * - Bioritme-wijzerplaat toegevoegd * - Opgeschoond Setup schermcodering * xx/xx/21 * - DHT21 toegevoegd Ondersteuning * - Thermometer- en vochtigheidswijzerplaat toegevoegd *///Libraries#include #include #include #include #include # voeg //uncomment toe als u wilt dat de variant met dubbel dik of dun display 12-uursformaat weergeeft//#define DUAL_THICK_12HR//#define DUAL_THIN_12HR//uncomment om achtergrondverlichting te regelen//#define NO_BACKLIGHT//#define BACKLIGHT_ALWAYS_ON# definieer BACKLIGHT_TIMEOUT 10000//uncomment om bioritmegrafieken te testen//#define TEST_BIO_GRAPHS#define LIGHT 2 //PD2#define LCD_D7 3 //PD3#define LCD_D6 4 //PD4#define LCD_D5 5 //PD5#define LCD_D4 6 //PD6 #define LCD_E 7 //PD7#define LCD_RS 8 //PB0#define BTN_SET A0 //PC0#define BTN_ADJUST A1 //PC1#define BTN_ALARM A2 //PC2#define BTN_TILT A3 //PC3#define SPEAKER 11 //PB3# definieer DHT 21 9 //PB1#define RTC_CE 10 //PB2#define RTC_IO 12 //PB4#define RTC_SCLK 13 //PB5//Verbindingen en constanten LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);DS1302RTC rtc( RTC_CE, RTC_IO, RTC_SCLK);dht DHT;char daysOfTheWeek[7][12] ={"zondag","maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"};const int maandDagen[12] ={ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; lang interval =300; int melodie [] ={600, 800, 1000,1200};//Variabelenint DD, MM, YY, H, M, S, temp, brom, set_state, adjust_state, alarm_state, AH, AM, shake_state, BY, BM, BD;int shakeTimes =0;int i =0;String sDD;String sMM;String sYY;String sH;String sM;String sS;String sBD;String sBM;String sBY;String aH="12";String aM=" 00";String sTMP;String sHUM;//String alarm =" ";long prevAlarmMillis =0;long prevDhtMillis =0;//Boolean flagsboolean setupScreen =false;boolean alarmON=false;boolean turnItOn =false;enum STYLE { STANDARD, DUAL_THICK, DUAL_BEVEL, DUAL_TREK, DUAL_THIN, WORD, BIO, THERMO };STYLE currentStyle =STANDARD;enum SETUP { CLOCK, TIME_HOUR, TIME_MIN, TIME_DAY, TIME_MONTH, TIME_YEAR, BIRTH_DAY, BIRTH_MAAND;;bool backlightOn =false;long backlightTimeout =0;byte customChar[8];//--------------------- EEPROM --------- ---------------------------------#define EEPROM_AH 0 //Alarm Hours#define EEPROM_AM 1 //Alarm Minutes# definieer EEPROM_AO 2 //Alarm aan/uit#define EEPROM_CS 3 //Huidige stijl#define EEPROM_BY 4 //Geboortejaar#define EEPROM_BM 6 //Geboortemaand#define EEPROM_BD 7 //Geboortedag//--------- ------------ Woordklok ------------------------------------ --String units[] ={"HUNDRED", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"};String teens[] ={"TIEN", "ELEVEN", "TWELVE", "DIRTEEN", "FOURTEEN", "FIFTEEN", "ZEXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"};String tienen[] ={"", "", "TWINTIG", "DERTIG", "VERENIGD", "VIJFTIG"};//---------------------- Zandloper animatie ----------------------------#define HOURGLASS_FRAMES 8#define HOURGLASS_CHAR 0#define FRAME_TIMEOUT 200;int nextFrame =0;long frameTimeout =0;const byte zandloper [HOURGLASS_FRAMES][8] PROGMEM ={ { B11111, B11111, B01010, B01010, B01010, B01010, B10001, B11111 }, { B11111, B11011, B01110, B01010, B01010, B01010, B10001, B11111 }, { B11111, B10001, B01110, B01110, B01010, B01010, B10001, B11111 }, { B11111, B10001, B01010, B01110, B01110 , B01010, B10001, B11111 }, { B11111, B10001, B01010, B01010, B01110, B01110, B10001, B11111 }, { B11111, B10001, B01010, B01010, B01010, B01110, B10101, B11111 }, { B11111, B10001, B01010 , B01010, B01010, B01110, B11011, B11111 }, { B11111, B10001, B01010, B01010, B01010, B01010, B11111, B11111 }, //{ B11111, B10001, B01010, B01010, B01010, B01010, B10001, B11111 }};//---------------------- Alarm, klok en DHT aangepaste tekens ------------------ ----------#define BELL_CHAR 1#define CLOCK_CHAR 2#define THERMOMETER_CHAR 3#define DROPLET_CHAR 4const byte bell [8] PROGMEM ={0x4, 0xe, 0xe, 0xe, 0x1f, 0x0, 0x4};const byte klok[8] PROGMEM ={0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0};const byte thermometer[8] PROGMEM ={0x4, 0xa, 0xa, 0xe, 0xe, 0x1f, 0x1f, 0xe};const byte druppel [8] PROGMEM ={0x4, 0x4, 0xa, 0xa, 0x11, 0x11, 0x11, 0xe};#define DHT_UPDATE_INTERVAL 6000//------------------ --- BioRhythm Clock ----------------------------//Aangepaste karakterconstanten (M is MSB of bovenste staafkarakter r, L is LSB of teken met een onderste balk#define PHYSICAL_M 3#define PHYSICAL_L 4#define EMOTIONAL_M 5#define EMOTIONAL_L 6#define INTELLECTUAL_M 7#define INTELLECTUAL_L 8//--------------- ------- Dik vierkant lettertype ----------------------------#define C0 3#define C1 4#define C2 5 #define C3 6const byte C_0[8] PROGMEM ={0x1F,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00};const byte C_1[8] PROGMEM ={0x1F,0x1F,0x1F,0x00,0x00,0x1 0x1F,0x1F};const byte C_2[8] PROGMEM ={0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F};const byte C_3[8] PROGMEM ={0x00,0x00,0x0E,0x0A,0x0A,0x0A,0x0A 0x0E,0x00.0x00};const byte blockChar[11][2][3] ={{ 255, C0, 255}, {255, C2, 255}}, //0 {{ C0, 255, 32} , {C2, 255, C2}}, //1 {{ C0, C0, 255}, {255, C1, C2}}, //2 {{ C1, C1, 255}, {C1, C1, 255} }, //3 {{ 255, C2, 255}, {32, 32, 255}}, //4 {{ 255, C1, C1}, {C2, C2, 255}}, //5 {{ 255 , C0, C0}, {255, C1, 255}}, //6 {{ C0, C1, 255}, {32, C0, 255}}, //7 {{ 255, C1, 255}, {255 , C1, 255}}, //8 {{ 255, C1, 255}, {C2, C2, 255}}, //9 {{ 32, 32, 32}, {32, 32, 32}}, //Blanco};//---------------------- Dik schuin lettertype -------------- --------------#define LT 0#define UB 1#define RT 2#define LL 3#define LB 4#define LR 5#define UMB 6#define LMB 7const byte _LT[8 ] PROGMEM ={ B00111, B01111, B11111, B11111, B11111, B11111, B11111, B11111};const byte _UB[8] PROGMEM ={ B11111, B11111, B11111, B00000, B00000, B00000, B00000, B00000};const byte _RT [8] PROGMEM ={ B11100, B11110, B11111, B11111, B11111, B11111, B11111, B11111};const byte _LL[8] PROGMEM ={ B11111, B11111, B11111, B11111, B11111, B11111, B01111, B00111};const byte _LB[8] PROGMEM ={ B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111};const byte _LR[8] PROGMEM ={ B11111, B11111, B11111, B11111, B11111, B11111, B11110, B11100};const byte _UMB[8] PROGMEM ={ B11111, B11111, B11111, B00000, B00000, B00000, B11111, B11111};const byte _LMB[8] PROGMEM ={ B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111};const byte bevelChar[11][2][3] ={{{LT, UB, RT}, {LL, LB, LR} }, //0 {{UB, RT, 32}, {LB, LMB, LB}}, //1 {{UMB, UMB, RT}, {LL, LB, LB}}, //2 {{UMB , UMB, RT}, {LB, LB, LR}}, //3 {{LL, LB, LMB}, {32, 32, LMB}}, //4 {{LT, UMB, UMB}, {LB , LB, LR}}, //5 {{LT, UMB, UMB}, {LL, LB, LR}}, //6 {{UB, UB, RT}, {32, 32, LT}}, / /7 {{LT, UMB, RT}, {LL, LB, LR}}, //8 {{LT, UMB, RT}, {32, 32, LR}}, //9 {{ 32, 32, 32}, {32, 32, 32}} //Leeg};//---------------------- Trek-lettertype -------- --------------------#definieer K0 0#definieer K1 1#definieer K2 2#definieer K3 3#definieer K4 4#definieer K5 5#definieer K6 6#definieer K7 7const-byte K_0[8] PROGMEM ={0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00};const-byte K_1[8] PROGMEM ={0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x18};const-byte K_2[8] PROGMEM ={0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F};const-byte K_3[8] PROGMEM ={0x1F,0x1F,0x03,0x03,0x03,0x03, 0x1F,0x1F};const byte K_4[8] PROGMEM ={0x1F,0x1F,0x18,0x18,0x18,0x18,0x1F,0x1F};const byte K_5[8] PROGMEM ={0x1F,0x1F,0x18,0x18,0x18,0x18,0x18,0x 0x18,0x18,0x18};const byte K_6[8] PROGMEM ={0x03,0x03,0x03,0x03, 0x03,0x03,0x1F,0x1F};const byte K_7[8] PROGMEM ={0x1F,0x1F,0x03,0x03,0x03,0x03,0x03,0x03};const byte trekChar[11][2][2] ={ { { K5, K7}, {255, K6}}, //0 {{ K0, K1}, {K2, 255}}, //1 {{ K0, K3}, {255, K2}}, //2 {{ K0, K3}, {K2, 255}}, //3 {{ K1, 255}, {K0, K1}}, //4 {{ K4, K0}, {K2, 255}}, // 5 {{ K5, K0}, {K4, 255}}, //6 {{ K0, 255}, {32, K1}}, //7 {{ 255, K3}, {K4, 255}}, / /8 {{ 255, K3}, {K2, K6}}, //9 {{ 32, 32}, {32, 32}}, //Leeg};//---------- ------------ Dun lettertype ----------------------------#define T0 0#define T1 1 #define T2 2#define T3 3#define T4 4#define T5 5#define T6 6#define T7 7const byte T_0[8] PROGMEM ={0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02};const byte T_1[8] PROGMEM ={0x0E,0x02,0x02,0x02,0x02,0x02,0x02,0x0E};const byte T_2[8] PROGMEM ={0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x0E};const byte T_3[8] PROGMEM ={0x0E,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0E};const byte T_5[8] PROGMEM ={0x0A,0x0A,0x0A,0x0A,0A0A,0 0x0E};const byte T_4[8] PROGMEM ={0x0E,0x0A,0x0A,0x0A,0x0 A,0x0A,0x0A,0x0A};const byte T_6[8] PROGMEM ={0x0E,0x02,0x02,0x02,0x02,0x02,0x02,0x02};const byte T_7[8] PROGMEM ={0x18,0x18,0x18, 0x18,0x18,0x1E,0x1F,0x1F};//lcd tekenfuncties const byte thinChar[11][2] ={ {T4, T5}, //0 {T0, T0}, //1 {T1, T2} , //2 {T1, T1}, //3 {T5, T6}, //4 {T2, T1}, //5 {T2, T3}, //6 {T6, T0}, //7 { T3, T3}, //8 {T3, T1}, //9 {32, 32} //blanco}; //---------------------- Algemene initialisatie ------------------------ ----void setup() { Serial.begin(115200); //Set uitgangen/ingangen pinMode (BTN_SET,INPUT); pinMode (BTN_ADJUST, INPUT); pinMode (BTN_ALARM, INGANG); pinMode (BTN_TILT, INPUT); pinMode (LUIDSPREKER, UITGANG); pinMode (LICHT, UITGANG); //Controleer of RTC een geldige tijd/datum heeft, zo niet, stel deze in op 00:00:00 01/01/2018. //Dit werkt alleen bij de eerste keer of als de knoopbatterij bijna leeg is. //setSyncProvider() zorgt ervoor dat de Time-bibliotheek synchroniseert met de //externe RTC door standaard elke vijf minuten RTC.get() aan te roepen. setSyncProvider(rtc.get); if (timeStatus() !=timeSet) { Serial.println("Standaard tijd instellen"); // Stel RTC tmElements_t tm in; tm.Jaar =KalenderYrToTm(2020); tm.Maand =06; tm.Dag =26; tm.Uur =7; tm.Minuut =52; tm.Tweede =0; time_t t =makeTime(tm); // gebruik de time_t-waarde om ervoor te zorgen dat de juiste weekdag is ingesteld als (rtc.set(t) ==0) { // Success setTime(t); } else { Serial.println ("RTC-set mislukt!"); } } vertraging (100); // Lees alarmtijd van EEPROM-geheugen AH =EEPROM.read (EEPROM_AH); AM =EEPROM.lezen (EEPROM_AM); byte oa =EEPROM.lezen (EEPROM_AO); alarmAAN =(oa !=0); byte cs =EEPROM.lezen (EEPROM_CS); //Controleer of de nummers die u leest geldig zijn. (Uren:0-23 en minuten:0-59) als (AH> 23) { AH =0; } als (AM> 59){ AM =0; } //Lees de geboortedatum van EEPROM BY =(EEPROM.read(EEPROM_BY + 0) <<8) | EEPROM.lezen (EEPROM_BY + 1); als (DOOR <1900 || DOOR> 2099) { DOOR =2000; } BM =EEPROM.lezen (EEPROM_BM); als (BM <0 || BM> 12) { BM =1; } BD =EEPROM.lezen (EEPROM_BD); als (BD <0 || BD> 31) { BD =1; } //Setup huidige stijl lcd.begin (16,2); currentStyle =(cs> (uint8_t)THERMO) ? STANDAARD :(STIJL)cs; switch (currentStyle) { case STANDARD:lcdStandardSetup(); pauze; geval DUAL_THICK:lcdDualThickSetup(); pauze; geval DUAL_BEVEL:lcdDualBevelSetup(); pauze; geval DUAL_TREK:lcdDualTrekSetup(); pauze; geval DUAL_THIN:lcdDualThinSetup(); pauze; hoofdletter WOORD:lcdWordSetup(); pauze; geval BIO:lcdBioRhythmSetup(); pauze; geval THERMO:lcdThermometerSetup(); pauze; } #ifdef BACKLIGHT_ALWAYS_ON switchBacklight(true);#endif}//---------------------- Hoofdprogrammalus ----------- ----------------- ongeldige lus() { readBtns(); //Leesknoppen getTimeDate(); // Lees tijd en datum van RTC getTempHum (); // Lees temperatuur en vochtigheid af als (!setupScreen) { lcdPrint(); // Druk normaal gesproken de huidige tijd / datum / alarm af op het LCD-scherm als (alarmON) { callAlarm (); // en controleer het alarm indien ingeschakeld if (turnItOn) { switchBacklight (true); } } //Serial.println("backlightTimeout=" + String(backlightTimeout) + ", millis()=" + String(millis()) + ", backlightOn=" + String(backlightOn));#ifdef BACKLIGHT_TIMEOUT if ( backlightOn &&(millis()> backlightTimeout)) { switchBacklight(false); }#endif } else { timeSetup(); // Als de knop is ingedrukt, bel dan de tijdinstellingsfunctie switchBacklight (true); }}//---------------------------------------------- ----//Leesknoppen statevoid readBtns(){ set_state =digitalRead(BTN_SET); Adjust_state =digitalRead (BTN_ADJUST); alarm_state =digitalRead (BTN_ALARM); if (!backlightOn &&!setupScreen) {if (set_state ==LAAG || adjust_state ==LAAG || alarm_state ==LAAG) { // Schakel achtergrondverlichting in Achtergrondverlichting (true); // moet de knop minstens een halve seconde ingedrukt houden (500); } } else { if(!setupScreen) { if (alarm_state ==LAAG) { alarmON =!alarmON; EEPROM.schrijven (EEPROM_AO, (alarmAAN) ? 1 :0); vertraging (500); schakelaar Achtergrondverlichting (waar); } else if (adjust_state ==LAAG) { currentStyle =(currentStyle ==THERMO)? STANDAARD :(STIJL)((int)currentStyle + 1); EEPROM.write (EEPROM_CS, (byte) huidige stijl); switch (currentStyle) { case STANDARD:lcdStandardSetup(); pauze; geval DUAL_THICK:lcdDualThickSetup(); pauze; geval DUAL_BEVEL:lcdDualBevelSetup(); pauze; geval DUAL_TREK:lcdDualTrekSetup(); pauze; geval DUAL_THIN:lcdDualThinSetup(); pauze; hoofdletter WOORD:lcdWordSetup(); pauze; geval BIO:lcdBioRhythmSetup(); pauze; geval THERMO:lcdThermometerSetup(); pauze; } lcd.clear(); lcdPrint(); vertraging (500); schakelaar Achtergrondverlichting (waar); } } if (set_state ==LAAG) { setupMode =(setupMode ==ALARM_MIN) ? KLOK :(SETUP)((int)setupMode + 1); if (setupMode! =KLOK) { setupScreen =waar; if (setupMode ==TIME_HOUR) { lcd.clear(); lcd.setCursor(0,0); lcd.print("------SET------"); lcd.setCursor(0,1); lcd.print("-TIJD en DATUM-"); vertraging (2000); lcd.wissen(); } } else { lcd.clear(); // Stel RTC tmElements_t tm in; tm.Jaar =KalenderJrToTm(JJ); tm.Maand =MM; tm.Dag =DD; tm.Uur =H; tm.Minuut =M; tm.Tweede =0; time_t t =makeTime(tm); // gebruik de time_t-waarde om ervoor te zorgen dat de juiste weekdag is ingesteld als (rtc.set(t) ==0) { // Success setTime(t); } else { Serial.println ("RTC-set mislukt!"); } //rtc.adjust(DateTime(JJ, MM, DD, H, M, 0)); // Bespaar tijd en datum op RTC IC EEPROM.write (EEPROM_AH, AH); // Sla de alarmuren op in EEPROM EEPROM.write (EEPROM_AM, AM); // Sla het alarm op in EEPROM EEPROM.write (EEPROM_BY + 0, BY>> 8); // Bewaar het geboortejaar in EEPROM EEPROM.write (EEPROM_BY + 1, BY &0xFF); // Bewaar het geboortejaar in EEPROM EEPROM.write (EEPROM_BM, BM); // Bewaar de geboortemaand in EEPROM EEPROM.write (EEPROM_BD, BD); //Sla de geboortedag op in EEPROM lcd.print ("Opslaan...."); vertraging (2000); lcd.wissen(); setupScreen =onwaar; setupMode =KLOK; schakelaar Achtergrondverlichting (waar); } vertraging (500); } }}//--------------------------------------------- -----//Lees tijd en datum van rtc icvoid getTimeDate(){ if (!setupScreen) { //DateTime now =rtc.now(); time_t t =nu(); DD =dag(t); MM =maand(t); JJ =jaar(t); H =uur(t); M =minuut (t); S =seconde(t); } //Maak wat aanpassingen... sDD =((DD <10) ? "0" :"") + String (DD); sMM =((MM <10) ? "0" :"") + String (MM); sYY =String (YY-2000); sH =((H <10) ? "0" :"") + String (H); sM =((M <10) ? "0" :"") + String (M); sS =((S <10) ? "0" :"") + String (S); sBD =((BD <10) ? "0" :"") + String (BD); sBM =((BM <10) ? "0" :"") + String (BM); sBY =String (BY); aH =((AH <10) ? "0" :"") + String (AH); aM =((AM <10) ? "0" :"") + String (AM);}//------------------------- -------------------------// Lees temperatuur en vochtigheid elke 6 seconden van DHT sensorvoid getTempHum(){ unsigned long currentMillis =millis(); if (currentMillis - prevDhtMillis>=DHT_UPDATE_INTERVAL) {int chk =DHT.read21(DHT21); prevDhtMillis =huidigeMillis; brom =min (rond (DHT.vochtigheid), 99); temp =min(rond(DHT.temperatuur),99); sTMP =((temp>
 9) ? "":" ") + String (temp); sHUM =((hum> 9) ? "" :" ") + String (hum); }}//---------------------------------------------- ----// Schakel backlightvoid switchBacklight (bool on) in of uit { #ifdef NO_BACKLIGHT digitalWrite (LIGHT, LOW); achtergrondverlichting Aan =waar; // Laat software denken dat het aan staat, ook al is het niet #else #ifdef BACKLIGHT_ALWAYS_ON digitalWrite(LIGHT, HIGH); achtergrondverlichting Aan =waar; #else digitalWrite(LIGHT, (aan) ? HIGH :LOW); achtergrondverlichting Aan =aan; backlightTimeout =millis() + BACKLIGHT_TIMEOUT; #endif #endif}//------------------------------------------- -------//Print waarden naar de displayvoid lcdPrint(){ switch (currentStyle) { case STANDARD:lcdStandardLayout(); pauze; geval DUAL_THICK:lcdDualThickLayout(); pauze; geval DUAL_BEVEL:lcdDualBevelLayout(); pauze; geval DUAL_TREK:lcdDualTrekLayout(); pauze; geval DUAL_THIN:lcdDualThinLayout(); pauze; hoofdletter WOORD:lcdWordLayout(); pauze; geval BIO:lcdBioRhythmLayout(); pauze; behuizing THERMO:lcdThermometerLayout(); pauze; }}//---------------------------------------------- -- Standaard opmaak ---------------------------------------------- -----------------------void lcdStandardSetup(){}void lcdStandardLayout(){ String line1 =sH+":"+sM+":"+sS+" | "+aH+":"+aM; String line2 =sDD+"/"+sMM+"/"+sYY +" | " + ((alarmON &&(S &0x01)) ? "ALARM" :" "); lcd.setCursor(0,0); //Eerste rij lcd.print(line1); lcd.setCursor(0,1); // Tweede rij lcd.print (regel 2); }//Maak een aangepast teken uit het programmageheugen ongeldig createCharP(byte slot, byte* p){ for (int i =0; i <8; i++) { customChar[i] =pgm_read_byte(p++); } lcd.createChar(slot, customChar);}//------------------------------------- ----------- Dubbele dikke lay-out ------------------------------------ ---------------------------------void lcdDualThickSetup(){ createCharP(C0, C_0); createCharP(C1, C_1); createCharP(C2, C_2); createCharP(C3, C_3); createCharP(BELL_CHAR, bel);}void lcdDualThickLayout(){#ifdef DUAL_THICK_12HR int h =(H>=12) ? H-12:H; als (h ==0) {h =12; } lcdDualThickPrintNumber (8, M, waar); lcdDualThickPrintNumber(0, h, false); lcd.setCursor(15,0); lcd.print((H>=12) ? "p" :"a"); lcd.setCursor(15,1); lcd.print("m"); #else lcdDualThickPrintNumber(8, M, true); lcdDualThickPrintNumber (0, H, waar); bool-alarm =(S &0x01); lcdWordShowBell (15, 0, alarm, BELL_CHAR); // rechtsonder lcdWordShowBell (15, 1, !alarm, BELL_CHAR); // rechter benedenhoek #endif byte c =(S &1) ? C3:32; lcd.setCursor(7,0); lcd.schrijven(c); lcd.setCursor(7,1); lcd.write(c);}// Teken een nummer van 2 regels// pos - x positie om nummer te tekenen// nummer - waarde om te tekenen// leadingZero - of voorloopnullen moeten worden weergegevenvoid lcdDualThickPrintNumber(int pos, int number, int leadingZero){ int t =getal / 10; int u =aantal % 10; if (t ==0 &&!leadingZero) { t =11; } lcdDualThickPrintDigit(pos, t); lcdDualThickPrintDigit (pos + 4, u);}// Teken een cijfer van 2 regels// pos - x positie om nummer te tekenen// nummer - waarde om te tekenen lcdDualThickPrintDigit (int pos, int nummer){ for (int y =0; y <2; y++) { lcd.setCursor(pos, y); for (int x =0; x <3; x++) { lcd.write(blockChar[getal][y][x]); } }}//--------------------------------------------- --- Lay-out met dubbele schuine rand -------------------------------------------- -------------------------void lcdDualBevelSetup(){ createCharP(LT, _LT); createCharP(UB, _UB); createCharP(RT, _RT); createCharP(LL, _LL); createCharP(LB, _LB); createCharP(LR, _LR); createCharP(UMB, _UMB); createCharP(LMB, _LMB);}void lcdDualBevelLayout(){#ifdef DUAL_THICK_12HR int h =(H>=12) ? H-12:H; als (h ==0) {h =12; } lcdDualBevelPrintNumber (8, M, waar); lcdDualBevelPrintNumber(0, h, false); lcd.setCursor(15,0); lcd.print((H>=12) ? "p" :"a"); lcd.setCursor(15,1); lcd.print("m"); #else lcdDualBevelPrintNumber(8, M, true); lcdDualBevelPrintNumber (0, H, waar); bool-alarm =(S &0x01); lcdWordShowBell (15, 0, alarm, 65); // rechtsonder lcdWordShowBell (15, 1, ! alarm, 65); // rechter benedenhoek #endif byte c =(S &1) ? 58:32; lcd.setCursor(7,0); lcd.schrijven(c); lcd.setCursor(7,1); lcd.write(c);}// Teken een nummer van 2 regels// pos - x positie om nummer te tekenen// nummer - waarde om te tekenen// leadingZero - of voorloopnullen moeten worden weergegevenvoid lcdDualBevelPrintNumber(int pos, int number, int leadingZero){ int t =getal / 10; int u =aantal % 10; if (t ==0 &&!leadingZero) { t =11; } lcdDualBevelPrintDigit(pos, t); lcdDualBevelPrintDigit (pos + 4, u);}// Teken een cijfer van 2 regels// pos - x positie om nummer te tekenen// nummer - waarde om te tekenen lcdDualBevelPrintDigit (int pos, int nummer){ for (int y =0; y <2; y++) { lcd.setCursor(pos, y); for (int x =0; x <3; x++) { lcd.write(bevelChar[getal][y][x]); } }}//--------------------------------------------- --- Dubbele Trek-indeling -------------------------------------------- -------------------------void lcdDualTrekSetup(){ createCharP(K0, K_0); createCharP(K1, K_1); createCharP(K2, K_2); createCharP(K3, K_3); createCharP(K4, K_4); createCharP(K5, K_5); createCharP(K6, K_6); createCharP(K7, K_7);}void lcdDualTrekLayout(){ lcdDualTrekPrintNumber(10, S, true); lcdDualTrekPrintNumber(5, M, true); lcdDualTrekPrintNumber(0, H, true); byte c =(S &1) ? 165 :32; lcd.setCursor(4,0); lcd.write(c); lcd.setCursor(4,1); lcd.write(c); lcd.setCursor(9,0); lcd.write(c); lcd.setCursor(9,1); lcd.write(c); bool alarm =(S &0x01); lcdWordShowBell(15, 0, alarm, 65); //bottonm right corner lcdWordShowBell(15, 1, !alarm, 65); //bottonm right corner}//Draw a 2 line number// pos - x position to draw number// number - value to draw// leadingZero - whether leading zeros should be displayedvoid lcdDualTrekPrintNumber(int pos, int number, int leadingZero){ int t =number / 10; int u =number % 10; if (t ==0 &&!leadingZero) { t =11; } lcdDualTrekPrintDigit(pos, t); lcdDualTrekPrintDigit(pos + 2, u);}//Draw a 2 line digit// pos - x position to draw number// number - value to drawvoid lcdDualTrekPrintDigit(int pos, int number){ for (int y =0; y <2; y++) { lcd.setCursor(pos, y); for (int x =0; x <2; x++) { lcd.write(trekChar[number][y][x]); } }}//------------------------------------------------ Dual Thin layout ---------------------------------------------------------------------void lcdDualThinSetup(){ createCharP(T0, T_0); createCharP(T1, T_1); createCharP(T2, T_2); createCharP(T3, T_3); createCharP(T4, T_4); createCharP(T5, T_5); createCharP(T6, T_6); createCharP(T7, T_7);}void lcdDualThinLayout(){ #ifdef DUAL_THIN_12HR int h =(H>=12) ? H - 12 :H; if (h ==0) { h =12; } lcdDualThinPrintNumber(6, S, true); lcdDualThinPrintNumber(3, M, true); lcdDualThinPrintNumber(0, h, false); lcd.setCursor(9,0); lcd.print((H>=12) ? "p" :"a"); lcd.setCursor(9,1); lcd.print("m"); #else lcdDualThinPrintNumber(6, S, true); lcdDualThinPrintNumber(3, M, true); lcdDualThinPrintNumber(0, H, true);#endif byte c =(S &1) ? 165 :32; lcd.setCursor(2,0); lcd.write(c); lcd.setCursor(2,1); lcd.write(c); lcd.setCursor(5,0); lcd.write(c); lcd.setCursor(5,1); lcd.write(c); String line1 =aH+":"+aM; String line2 =(alarmON &&(S &0x01)) ? "ALARM" :" "; lcd.setCursor(11,0); //First row lcd.print(line1); lcd.setCursor(11,1); //Second row lcd.print(line2); }//Draw a 2 line number// pos - x position to draw number// number - value to draw// leadingZero - whether leading zeros should be displayedvoid lcdDualThinPrintNumber(int pos, int number, int leadingZero){ int t =number / 10; int u =number % 10; if (t ==0 &&!leadingZero) { t =11; } lcdDualThinPrintDigit(pos, t); lcdDualThinPrintDigit(pos + 1, u);}//Draw a 2 line digit// pos - x position to draw number// number - value to drawvoid lcdDualThinPrintDigit(int pos, int number){ for (int y =0; y <2; y++) { lcd.setCursor(pos, y); lcd.write(thinChar[number][y]); }}//------------------------------------------------ Word layout ---------------------------------------------------------------------void lcdWordSetup(){ createCharP(BELL_CHAR, &bell[0]);}void lcdWordLayout(){ String line1 =numberToWord(H, false); String line2 =numberToWord(M, true); lcd.setCursor(0,0); //First row printClear(line1, 13); lcd.setCursor(0,1); //Second row printClear(line2, 14); if (millis()> frameTimeout) { frameTimeout =millis() + FRAME_TIMEOUT; //lcd.createChar(HOURGLASS_CHAR, &hourglass[nextFrame][0]); createCharP(HOURGLASS_CHAR, &hourglass[nextFrame][0]); nextFrame =(nextFrame + 1) % HOURGLASS_FRAMES; lcd.setCursor(13,0); //First row lcd.write((int)HOURGLASS_CHAR); lcd.print(sS); } bool alarm =(S &0x01); lcdWordShowBell(14, 1, alarm, BELL_CHAR); //Second row lcdWordShowBell(15, 1, !alarm, BELL_CHAR); //Second row}//Display the bell symbol if alarm is on// x - x position (0..15)// y - y position (0..1)// show - true to showvoid lcdWordShowBell(int x, int y, bool show, byte chr) { lcd.setCursor(x,y); lcd.print(" "); if (alarmON &&show) { lcd.setCursor(x,y); lcd.write(chr); }}//Print character string and clear to right// s - String to print...This file has been truncated, please download it to see its full contents.

Aangepaste onderdelen en behuizingen

stl_files_ZuDXHCHZCl.zip

Schema's

Schematic and PCB in Eagle files eagle_files_ZN59zdeNf5.zip

Productieproces

  1. Raspberry pi 2 wateralarm met t cobbler plus
  2. LCD-paneel met Arduino voor Flight Simulator
  3. Wekker waar je 's ochtends echt je bed voor uit komt
  4. DIY eenvoudigste IV9 Numitron-klok met Arduino
  5. Arduino klok met islamitische gebedstijden
  6. Word Clock met minutenresolutie van tijd in woorden
  7. Arduino Temp. Monitor en realtimeklok met 3.2-weergave
  8. TM1637 digitale klok met tijdinstelling en alarmfunctie
  9. Een afbeelding weergeven op een LCD TFT-scherm met Arduino UNO!
  10. Arduino OLED-temperatuurweergave met realtime klok
  11. Eenvoudige wekker met DS1302 RTC