Construire une horloge à tubes Nixie simple avec Arduino – Guide pas à pas
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| Composants électroniques UTSOURCE | 1 |
À propos de ce projet
Introduction
Après de longues heures de travail, j'ai réussi à réaliser une horloge Nixie avec Arduino et un circuit d'isolement optique, sans avoir besoin de driver Nixie dédié (difficile à trouver).
Regardez la vidéo pour les instructions complètes :
Liste du matériel
- Arduino UNO – lien Amazon
- Tubes Nixie (6 pièces) – lien Amazon
- Optocoupleur TLP627
- Module élévateur DC 12V vers 390V DC – lien Amazon
- Plaque d'essai (breadboard) – lien Amazon
- Module horloge temps réel DS3231 – lien Amazon
- Composants électroniques sur utsource.net
Étape 1 : Conception du circuit
Le circuit utilise un optocoupleur pour piloter les tubes Nixie (150 V DC) depuis l'Arduino (5 V DC). Grâce à une connexion en matrice, seulement 16 sorties Arduino suffisent pour contrôler les 60 cathodes des 6 tubes Nixie. Le module DS3231 maintient l'heure (même hors tension) via liaison I2C. L'Arduino lit l'heure, puis allume/éteint les cathodes en multiplexage à haute fréquence pour créer l'illusion d'un affichage continu des 6 chiffres.
Étape 2 : Code Arduino
// Chaîne Youtube : engineer2you
#include <Wire.h>
#include "DS3231.h"
RTClib RTC;
DS3231 Clock;
int hour;
int minute;
int second;
const int nixie_0 = 2;
const int nixie_1 = 3;
const int nixie_2 = 4;
const int nixie_3 = 5;
const int nixie_4 = 6;
const int nixie_5 = 7;
const int nixie_6 = 8;
const int nixie_7 = 9;
const int nixie_8 = 10;
const int nixie_9 = 11;
const int row_1 = 0;
const int row_2 = 1;
const int row_3 = 14;
const int row_4 = 15;
const int row_5 = 16;
const int row_6 = 17;
const int time_on = 2;
void setup() {
pinMode(nixie_0, OUTPUT);
pinMode(nixie_1, OUTPUT);
pinMode(nixie_2, OUTPUT);
pinMode(nixie_3, OUTPUT);
pinMode(nixie_4, OUTPUT);
pinMode(nixie_5, OUTPUT);
pinMode(nixie_6, OUTPUT);
pinMode(nixie_7, OUTPUT);
pinMode(nixie_8, OUTPUT);
pinMode(nixie_9, OUTPUT);
pinMode(row_1, OUTPUT);
pinMode(row_2, OUTPUT);
pinMode(row_3, OUTPUT);
pinMode(row_4, OUTPUT);
pinMode(row_5, OUTPUT);
pinMode(row_6, OUTPUT);
// Serial.begin(9600); // NE PAS utiliser Serial.print, cela perturbe les broches D0 et D1
Wire.begin();
}
void loop() {
// --- Récupération de l'heure ---
DateTime now = RTC.now();
hour = now.hour();
minute = now.minute();
second = now.second();
// --- Affichage des chiffres ---
int j; // chiffre des dizaines
int k; // chiffre des unités
// Secondes
j = second / 10;
k = second % 10;
off_all(); on_number(0, k + 2); delay(time_on);
off_all(); on_number(1, j + 2); delay(time_on);
// Minutes
j = minute / 10;
k = minute % 10;
off_all(); on_number(14, k + 2); delay(time_on);
off_all(); on_number(15, j + 2); delay(time_on);
// Heures
j = hour / 10;
k = hour % 10;
off_all(); on_number(16, k + 2); delay(time_on);
off_all(); on_number(17, j + 2); delay(time_on);
}
void on_number(int row, int nixie) {
digitalWrite(row, HIGH);
digitalWrite(nixie, HIGH);
}
void off_all() {
digitalWrite(row_1, LOW);
digitalWrite(row_2, LOW);
digitalWrite(row_3, LOW);
digitalWrite(row_4, LOW);
digitalWrite(row_5, LOW);
digitalWrite(row_6, LOW);
digitalWrite(nixie_0, LOW);
digitalWrite(nixie_1, LOW);
digitalWrite(nixie_2, LOW);
digitalWrite(nixie_3, LOW);
digitalWrite(nixie_4, LOW);
digitalWrite(nixie_5, LOW);
digitalWrite(nixie_6, LOW);
digitalWrite(nixie_7, LOW);
digitalWrite(nixie_8, LOW);
digitalWrite(nixie_9, LOW);
delayMicroseconds(400); // évite l'effet "fantôme" sur les autres tubes
}
Le code récupère l'heure du module DS3231 et l'affiche sur les 6 tubes Nixie via les optocoupleurs.
Étape 3 : Assemblage du circuit
Tout est monté sur breadboard pour l'expérimentation. Heureusement, cela a fonctionné du premier coup sans aucun problème.
Prochaine étape : réaliser un boîtier en MDF avec une finition soignée pour l'installer dans ma chambre.
Code
Extrait de code #1
//Youtube channel: engineer2you
#include <Wire.h>
#include "DS3231.h"
RTClib RTC;
DS3231 Clock;
int hour;
int minute;
int second;
const int nixie_0 = 2;
const int nixie_1 = 3;
const int nixie_2 = 4;
const int nixie_3 = 5;
const int nixie_4 = 6;
const int nixie_5 = 7;
const int nixie_6 = 8;
const int nixie_7 = 9;
const int nixie_8 = 10;
const int nixie_9 = 11;
const int row_1 = 0;
const int row_2 = 1;
const int row_3 = 14;
const int row_4 = 15;
const int row_5 = 16;
const int row_6 = 17;
const int time_on = 2;
void setup() {
pinMode(nixie_0, OUTPUT);
pinMode(nixie_1, OUTPUT);
pinMode(nixie_2, OUTPUT);
pinMode(nixie_3, OUTPUT);
pinMode(nixie_4, OUTPUT);
pinMode(nixie_5, OUTPUT);
pinMode(nixie_6, OUTPUT);
pinMode(nixie_7, OUTPUT);
pinMode(nixie_8, OUTPUT);
pinMode(nixie_9, OUTPUT);
pinMode(row_1, OUTPUT);
pinMode(row_2, OUTPUT);
pinMode(row_3, OUTPUT);
pinMode(row_4, OUTPUT);
pinMode(row_5, OUTPUT);
pinMode(row_6, OUTPUT);
//Serial.begin(9600); //should NOT use seiral println, it will effect to output pin D0 & D1
Wire.begin();
}
void loop() {
//-------------------get clock value---------------------------
DateTime now = RTC.now();
hour = now.hour();
minute = now.minute();
second = now.second();
//-------------------show clock number ----------------------
int j; //second number from right
int k; //first number from right
j = second/10;
k = second%10;
//-----------show first number of second
off_all();
on_number(0,k+2);
delay(time_on);
//-----------show second number of second
off_all();
on_number(1,j+2);
delay(time_on);
j = minute/10;
k = minute%10;
//-----------show first number of minute
off_all();
on_number(14,k+2);
delay(time_on);
//-----------show second number of minute
off_all();
on_number(15,j+2);
delay(time_on);
j = hour/10;
k = hour%10;
//-----------show first number of hour
off_all();
on_number(16,k+2);
delay(time_on);
//-----------show second number of hour
off_all();
on_number(17,j+2);
delay(time_on);
}
void on_number(int row, int nixie){
digitalWrite(row, HIGH);
digitalWrite(nixie, HIGH);
}
void off_all(){
digitalWrite(row_1, LOW);
digitalWrite(row_2, LOW);
digitalWrite(row_3, LOW);
digitalWrite(row_4, LOW);
digitalWrite(row_5, LOW);
digitalWrite(row_6, LOW);
digitalWrite(nixie_0, LOW);
digitalWrite(nixie_1, LOW);
digitalWrite(nixie_2, LOW);
digitalWrite(nixie_3, LOW);
digitalWrite(nixie_4, LOW);
digitalWrite(nixie_5, LOW);
digitalWrite(nixie_6, LOW);
digitalWrite(nixie_7, LOW);
digitalWrite(nixie_8, LOW);
digitalWrite(nixie_9, LOW);
delayMicroseconds(400); //to prevent "ghost" effect to other tube
}
Processus de fabrication
- Horloge POV Arduino : Construire un affichage LED à persistance rétinienne
- Construire une horloge Numitron rétro avec Arduino : simple, fiable et économe en énergie
- Optimiser la conception de faisceaux électriques avec E3.series
- Horloge à Mots DIY Arduino – Afficheur Temps Réel Élégant et Personnalisable
- Horloge Arduino temps réel pour les heures de prière islamiques
- Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
- Construire une Tirelire Intelligente : Contrôler un Accepteur de Pièces avec Arduino Nano
- Moniteur de Température et Horloge Temps Réel Arduino avec Écran TFT 3.2"
- Construire un Réveil Fiable avec RTC DS1302 et Arduino UNO