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

Berlijnse klok

Componenten en benodigdheden

Arduino UNO
× 1
Maxim Integrated max7219
Alleen de IC die wordt gebruikt in de led-matrix breakouts...
× 1
Real Time Clock (RTC)
× 1
5 mm LED:geel
× 13
5 mm LED:rood
× 11
Weerstand 10k ohm
× 1

Over dit project

Allereerst...

Dit is een kopie/plak van een tutorial die ik op de Instructables-website heb geschreven. Ik moet nog uitzoeken hoe ik van de ene site naar de andere kom. Dus misschien is dit niet zo gelikt als het zou moeten zijn... Maar begin met een-niet-zo-dagelijkse-klok.

Intro:Berlijnse klok

De Berlin Clock, BerlinUhr of Mengenlehreuhr, was waarschijnlijk de allereerste digitale klok.

Het staat er al sinds 1975...

Veel info vind je hier:https://en.wikipedia.org/wiki/Mengenlehreuhr

Hoe wordt het gemaakt, hoe vertel je de tijd?

Kortom, er zijn vier rijen lampen. De bovenste rij geeft de uren x 5, de volgende de "enkele uren" van 1 tot 4. De derde rij geeft ons de "minuten x5", de onderste rij de minuten.

Op de getoonde foto (eigenlijk is één lamp kapot...) is de tijd:2x5 uur plus 3 uur + 6x5 minuten + 2 minuten.

Het is dus 13:32. OK, ik veronderstel dat wij Europeanen meer gewend zijn om de tijd in 24 uur te vertellen. formaat, de klok ook.

Het grootste lampje bovenop knippert elke seconde.

Ik dacht dat deze klok misschien wel leuk zou zijn om in Arduino te maken.

Stap 1:Sommige elektronica

Wat hebben we nodig voor dit project?

Allereerst (natuurlijk) onze Arduino.

Ik gebruik een van mijn Uno's die overal in de buurt van mijn computer liggen.

Omdat we het over een klok hebben, kunnen we een RTC gebruiken. Ik gebruikte een goedkope met een DS 1307.

Voor de "weergave" hebben we enkele LED's nodig. Ik gebruikte 13 gele, 5 mm en 11 rode. (Ik heb eigenlijk RGB's gebruikt voor de rode kleuren, omdat ik niet genoeg rode kleuren had...)

Een breadboard, een printboard met alleen gaatjes en "soldeereilanden". Ik heb zojuist een deel van het zogenaamde "Eurokaart-formaat" gebruikt.

2 weerstanden die ik heb gebruikt. Een van 220 Ohm (de seconden-LED) en een andere van 68K.

En een extra IC:MAX7219.

De MAX is een 8-cijferige LED-displaydriver. Velen van ons kennen het omdat het ook in LED-matrices wordt gebruikt.

Voor het gemak heb ik ook de Arduino-bibliotheek "LedControl" gebruikt. Als je het nog steeds niet hebt, kun je het hier downloaden:

https://github.com/wayoda/LedControl

Stap 2:Instellen.

U kunt een heel mooi gegevensblad voor die MAX 7219 op deze plaats vinden:

https://www.sparkfun.com/datasheets/Components/Gen...

COM-09622-MAX7219-MAX7221.pdf

Ik zal niet verder ingaan op dat gegevensblad, maar het is de moeite waard om het te gebruiken, het is een soort "leuke" IC.

Een sprong naar de Arduino.

Op dat schema zie je een heel eenvoudige constructie:ik gebruik SDA en SCL om de klok te gebruiken (A 1307 breakout), en nog vier uitgangen:DataIn, Clock en Chipselect die naar de MAX 7219 gaan, en OUT 13 die we gebruiken voor onze knipperende "seconden"-LED.

De meeste dingen gebeuren in de Arduino:hij leest de klok, converteert deze naar de verschillende soorten uitvoer en stuurt de gegevens vervolgens naar de 7219.

Als je de code leest, zie je dat ik daarvoor gewoon mijn eigen taal, het Nederlands, gebruik. Bijvoorbeeld:de int "vijfuren" die ik gebruik is de variabele die "Five-hours" telt, hetzelfde voor de "vijfminuten" en "vijfminuten1":die geven de "Five-minutes" output.

In de schets gebruik ik ook het jaar, de maand, de dag van de maand en de weekdag, in deze specifieke schets heb ik ze niet nodig, maar misschien kan ik er later een kalender aan toevoegen.

In de Fritzing(c)-lay-out is het IC niet bedraad:ik deed dat voor het gemak, omdat het veel uitgangen heeft.

Laten we ze samenvatten:

pin 4 en 9 zijn verbonden met de GND,

19 is VCC

18, ISet, is verbonden met VCC met een weerstand:deze begrenst de stroom die naar de uitgangen gaat. Eerst probeerde ik het met een weerstand van 20K, maar na ongeveer 10 minuten werd alles donker... Nu, met een weerstand van 68K, loopt de klok nog steeds (na meer dan 24 uur). Maar er is een verschil tussen de helderheid van rood en geel, ik denk dat het komt doordat de rode in feite RGB-leds zijn. Ik moet dat uitzoeken...

pin 1 is DataIn, deze komt van de Arduino, pin 12

pin 12 is Load, afkomstig van Arduino pin 10

pin 13 is Clk, afkomstig van Arduino 11.

Tot zover de ingangen van de 7219.

Bekijk de uitgangen:

De 7219 heeft de mogelijkheid om 8 7seg-schermen van stroom te voorzien.

Deze uitgangen, DIG 0 tot DIG 4 worden hier gebruikt om de "lijnen" van de LED's aan te sturen:aangezien de "vijf minuten"-lijn 11 LED's bevat, gebruik ik DIG 1 en DIG 2 om ze aan te sturen.

De andere uitgangen:Segmenten A tot G en DP (van een normaal 7Seg-display).

In dit geval (met LedControl), stuur ik binaire woorden naar hen (byteform, zoals B01010100).

En daar maakte ik een fout. Enige logica vertelde me dat SEG A de MSB zou zijn, B het op één na belangrijkste bit, enzovoort, tot DP, waarvan ik dacht dat het het minst significante bit (LSB) zou zijn. Fout... Om de een of andere reden dachten de makers van de IC dat DP de MSB zou zijn. Ik zie daar de logica niet van in...

Dat zorgde ervoor dat ik mijn codering veranderde, omdat ik de LED's al had gesoldeerd...

Stap 3:De LED's

Op dit schema zie je hoe de LED's met elkaar verbonden zijn. Ik heb alleen de eerste drie getekend, de andere gaan op dezelfde manier.

De seconden-LED is rechtstreeks aangesloten op Pin 13.

Op de foto is te zien "hoe het werkt". Het is 17:47 uur...

Ok, de onderste rij is niet zo duidelijk, het staat op een breadboard. Ik hoop dat je me gelooft dat het echt werkt. (dat doet het!).

Oh, nog een stap te komen...

Stap 4:Stap "laatste", de code.

#include  #include const int DS1307 =0x68;// A5 =SCL, A4 =SDA const char* dagen[] ={"zondag", "maandag" , "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"};const char* months[] ={"januari", "februari", "maart", "april", "mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"};byte seconde =0; byteminuut =0; byte-uur =0; byte weekdag =0; byte maanddag =0; byte maand =0; byte jaar =0; byte lastMinute =0; byte lastSecond =0; int-Led =13; byte nul =B0000000; byte een =B01000000; byte-twee =B01100000; byte drie =B01110000; byte vier =B01111000; byte vijf =B01111100; byteze =B01111110; byte zeven =B01111111; byte acht =B11111111; byte negen =B01000000; byte tien =B01100000;byte elf =B01110000; Int a=0; intb =0; intc =0; int vijfMinTwee=0;int uitgang =LAAG; /*pin 12 is verbonden met de DataIn pin 11 is verbonden met de CLK pin 10 is verbonden met LOAD */LedControl lc=LedControl(12, 11, 10, 1);unsigned long delaytime=100; void setup() { Wire.begin(); Serial.begin(9600);pinMode (Led, OUTPUT);lc.shutdown(0, false); /* Stel de helderheid in op gemiddelde waarden */ lc.setIntensity(0, 8); /* en wis het scherm */ lc.clearDisplay(0);}void loop() { readTime(); digitalWrite(Led, uitgang);if (second !=lastSecond){ if (uitgang ==LOW) uitgang =HIGH; anders uitgang =LAAG; digitalWrite (Led, uitgang); lastSecond =tweede; } if (minuut!=lastMinute) { printTime(); lastMinute =minuut;}}byte bcdToDec(byte val) {return ((val/16*10) + (val%16));}void printTime() { char buffer[3];lange minuten =minuut;lange uren =uur;int vijfmin =minuten /5; int eenminuut =minuten -(vijfmin * 5);int vijfuren =uren/5; int eenuren =uren - (vijfuren *5); a =vijf minuten; digitaal(); vijfmin =b; vijfMinTwee =c;a =eenminuut;digitaal(); eenminuut =b; a=vijfuren; digitaal();vijfuren =b;a =eenuren; digitaal();eenuren =b; lc.setRow(0, 4, vijfuren);lc.setRow(0, 3, eenuren); lc.setRow(0, 1, vijfmin);lc.setRow(0, 2, vijfMinTwee); lc.setRow(0, 0, eenminuut);}void readTime() { Wire.beginTransmission(DS1307); Wire.write(byte(0)); Wire.endTransmission();Wire.requestFrom(DS1307, 7); seconde =bcdToDec(Wire.read());minuut =bcdToDec(Wire.read());hour =bcdToDec(Wire.read()); weekdag =bcdToDec(Wire.read()); maanddag =bcdToDec(Wire.read());maand =bcdToDec(Wire.read()); jaar =bcdToDec(Wire.read()); }void digitaal(){switch (a){ geval 0:b=nul; c=nul; pauze; geval 1:b =een; c=nul; pauze; geval 2:b =twee; c=nul; pauze; geval 3:b =droog; c=nul; pauze; geval 4:b =vier; c=nul; pauze;geval 5:b =vijf; c=nul; pauze; geval 6:b =zes; c=nul; pauze; geval 7:b =zeven; c=nul; pauze; geval 8:b =acht; c=nul; pauze; geval 9:b =acht; c =negen; pauze; geval 10:b=acht; c =tien; pauze; geval 11:b=acht; c =elf; pauze; } } 

Vrij eenvoudig, geloof ik.

Nog een voordeel van deze schets:nu leer je tellen in het Nederlands... Van 0 tot 11...;-)

Ik hoop dat je hiervan geniet!

Marc

Code

Github
https://github.com/wayoda/LedControlhttps://github.com/wayoda/LedControl

Productieproces

  1. Tijdconstante vergelijkingen
  2. Koekoeksklok
  3. Zandloper
  4. Bekijken
  5. Python-slaap()
  6. Rpibot – Over het leren van robotica
  7. Arduino pov vision-klok
  8. Verilog-simulatie
  9. Verilog-klokgenerator
  10. Python - Datum en tijd
  11. Infinity spiegelklok