Sommario:
- Forniture
- Passaggio 1: collegare Digit Drive e Segment Drive per display multiplex
- Passaggio 2: testare le connessioni
- Passaggio 3: codice per visualizzare l'ora e PWM per controllare la luminosità
- Passaggio 4: effettuare una connessione Internet
- Passaggio 5: aggiungi il codice BASIC per analizzare il tempo dal Web
- Passaggio 6: aggiungi un sensore di luce e un codice per oscurare il display
- Passaggio 7: abbottona l'orologio e inizia a usarlo
2025 Autore: John Day | [email protected]. Ultima modifica: 2025-01-13 06:57
Ho trovato un orologio digitale da $ 10 su Amazon. Ora per personalizzarlo per ottenere l'ora da Internet.
Forniture
Timbro ARM programmabile in BASIC disponibile qui
Passaggio 1: collegare Digit Drive e Segment Drive per display multiplex
Ho iniziato con un orologio digitale a buon mercato con un grande numero di scaffale. Per prima cosa ho rimosso il chip dell'orologio esistente. Quindi ha fatto un po' di sondaggi e ha individuato le connessioni a 7 segmenti, che possono essere guidate direttamente dal microprocessore. Quindi ho trovato i driver a 4 cifre che erano transistor che il microprocessore può pilotare. E poi li ho cablati.
Passaggio 2: testare le connessioni
Per esperimento ho scritto un programma BASIC per pilotare tutte le linee, per controllare il cablaggio e misurare la corrente, che in questo caso era 82 mA
Successivamente è stato necessario scrivere il codice per scansionare le righe.
' unità di visualizzazione dell'orologio web
IO(7)=0 'Unità PMOS: un giorno sarà PWM
per y=45 a 48
IO(y)=0 ' unità di cifre
per x=8 a 15
IO(x)=0 'unità di segmento
attendere(500)
IO(x)=1
prossimo x
DIR(y)=0 'disabilita drive sul segmento
il prossimo sì
Passaggio 3: codice per visualizzare l'ora e PWM per controllare la luminosità
Successivamente ho aggiunto un transistor PMOS nell'alimentatore a tutti i driver delle cifre. Con quello pilotato dalla modulazione di larghezza d'impulso si controllerà la luminosità del display. Ecco il codice BASIC per visualizzare l'ora.
' unità di visualizzazione dell'orologio web #include "LPC11U3x.bas"
"globali"
hr = 0 'definire l'ora
min = 0 ' definisce minuto
#define SEG_0 &HBB00
#define SEG_1 &H1800
#define SEG_2 &HD300
#define SEG_3 &HD900
#define SEG_4 &H7800
#define SEG_5 &HE900
#define SEG_6 &HEB00
#define SEG_7 &H9800
#define SEG_8 &HFB00
#define SEG_9 &HF800
#define SEG_o &H4B00
#define SEG_f &HE200
const DIGarray = { SEG_0, SEG_1, SEG_2, SEG_3, SEG_4, SEG_5, SEG_6, SEG_7, SEG_8, SEG_9, SEG_o, SEG_f}
#define DIG_WAIT 1
#define US_TIME
sub display_time(err, hr, min)
dim hr10, hr1, min10, min1, i
#ifdef US_TIME
se h > 12 allora h -= 12
se h = 0 allora h = 12
#finisci se
h10 = h / 10
h1 = h MOD 10
min10 = minimo / 10
min1 = minimo MOD 10
per i=0 a 1
se hr10 allora
IO(45) = 0
finisci se
GPIO_DIR(0) = (GPIO_DIR(0) &HFFFF00FF) + DIGarray(hr10)
GPIO_CLR(0) = DIGarray(hr10)
aspetta (DIG_WAIT)
INGRESSO(45)
IO(46) = 0
GPIO_DIR(0) = (GPIO_DIR(0) &HFFFF00FF) + DIGarray(hr1) + IF(i, &H400, 0)
GPIO_CLR(0) = DIGarray(hr1) + IF(i, &H400, 0)
aspetta (DIG_WAIT)
INGRESSO(46)
IO(47) = 0
GPIO_DIR(0) = (GPIO_DIR(0) &HFFFF00FF) + DIGarray(min10)
GPIO_CLR(0) = DIGarray(min10)
aspetta (DIG_WAIT)
INGRESSO(47)
IO(48) = 0
GPIO_DIR(0) = (GPIO_DIR(0) &HFFFF00FF) + DIGarray(min1)
GPIO_CLR(0) = DIGarray(min1)
aspetta (DIG_WAIT)
INGRESSO(48)
prossimo io
endsub
' utente TIMER1 (32 bit) per interrompere ogni minuto
INTERRUZIONE SUB TIMER1IRQ
T1_IR = 1 ' Cancella interrupt
minimo += 1
se min > 59 allora
minimo = 0
ora += 1
se h > 23 allora
ora = 0
finisci se
finisci se
ENDSUB
SUB ON_TIMER (max_cnt, fai questo)
TIMER1_ISR = dothis + 1 'imposta la funzione di VIC - è necessario il +1 per il funzionamento del pollice
SYSCON_SYSAHBCLKCTRL OR= (1<<10) ' abilita TIMER1
T1_PR = 0 'nessuna prescala -- regolerà il valore per un tempo più preciso
VICIntEnable OR= (1<<TIMER1_IRQn) 'Abilita interrupt
T1_MR0 = max_cnt-1 ' imposta il numero di corrispondenza di ms
T1_MCR = 3 ' Interrupt e Reset on
MR0 T1_IR = 1 ' azzera l'interruzione
T1_TC = 0 'azzera contatore timer
T1_TCR = 1 ' Abilita TIMER1
ENDSUB
#define MINUT_PCLK 2880000000 '60 secondi a 48 MHz
principale:
ora = 9
minimo = 33
ON_TIMER(MINUT_PCLK, INDIRIZZO DI TIMER1IRQ)
IO(7) = 0 ' PWM un giorno - devi passare a P0_22 ??
mentre 1
display_time(0, h, min)
ciclo continuo
Passaggio 4: effettuare una connessione Internet
Usa un ESP8266 per una connessione WiFi. Dopo aver rovistato per un po' sul web, la soluzione migliore era nodemcu versione 0.9.6 e un esp8266_flasher precedente funzionava meglio.
www.electrodragon.com/w/File:Nodemcu_20150704_firmware.zip
Quindi una semplice pagina Web PHP per servire il tempo da Internet--
Coridium Time Server
<?php
$timezone = htmlspecialchars($_GET["zone"]); if ($fuso orario == "")
$timezone = 'America/Los_Angeles';
$tz_object = new DateTimeZone($timezone);
$datetime = new DateTime();
$datetime->setTimezone($tz_object);
echo "time is-", $datetime->format('H:i:s');
eco "";
echo "la data è-", $datetime->format('m/g/Y');
?>
Quella pagina web è così puoi richiedere
coridium.us/time.php - e ottieni bene il fuso orario degli Stati Uniti del Pacifico
o
coridium.us/time.php?zone=Europe/London
Nessun controllo degli errori e molto probabilmente non lo sarà mai
E il Lua a leggerlo…
wifi.sta.config("tuo_SSID", "tua_PASSWORD")> wifi.sta.connect() …
sk=net.createConnection(net. TCP, 0)
sk:on("ricevi", function(sck, c) print(c) end)
sk:connect(80, "coridium.us")
sk:send("GET /time.php HTTP/1.1\r\nHost: coridium.us\r\nConnessione: keep-alive\r\nAccept: */*\r\n\r\n")
E torni nel tempo come
l'ora è-09:38:49la data è il 31-12-2018
Passaggio 5: aggiungi il codice BASIC per analizzare il tempo dal Web
Questo è un sottoinsieme del programma BASIC completo, che il programma completo può essere visualizzato al link nel passaggio finale.
se strstr(build_gets, "time is-") = 0 then
hr = build_gets(8) - "0"
se build_gets(9) = ":" allora
min = (build_gets(10) - "0")*10
min += build_gets(11) - "0"
altro
ora = ora * 10 + build_gets(9) - "0"
min = (build_gets(11) - "0")*10
min += build_gets(12) - "0"
finisci se
finisci se
Passaggio 6: aggiungi un sensore di luce e un codice per oscurare il display
È stato aggiunto un fototransistor per rilevare la luce ambientale nella stanza. Senza di esso il display è abbastanza luminoso da svegliare i morti (me) di notte.
Viene letta la tensione analogica dell'uscita del fototransistor e la modulazione dell'ampiezza dell'impulso imposta la luminosità complessiva del display.
Passaggio 7: abbottona l'orologio e inizia a usarlo
La versione finale visualizza l'ora e verso le 3 del mattino esce sul web per leggere l'ora corrente. Questo gestisce anche l'ora legale.
La motivazione di questo progetto sono state le interruzioni di corrente che sperimentiamo qui in montagna e la necessità di azzerare gli orologi o sostituire le batterie per mantenerli in vita.
Questa è stata una rapida panoramica del progetto.
Tutti i dettagli di questo orologio connesso al web fai-da-te.