Salut tout le monde ! Je viens vers vous pour vous demander conseils, j'ai récemment u l'idée de recyclé un ancien multimètre/pHmètre/Thermomètre (1987 !) car il a de super affichages numériques 7 segment. Je me suis donc donné l'objectif de le transformé en Horloge.
N'ayant que des bases en Electronique je me suis aidé d'une PCB faite par quelqu'un, et donc j'ai commencé a faire ma version en utilisant le maximum de ce que je pouvais m'inspirer mais en le changeant pour l'adapter a mon matériel car ces vieux affichages 7 segment que j'ai fonctionne sous du 12V mais son système sous du 5V. Donc les plus gros problème que j'ai est que je dois transformer les signaux 5v envoyé par l'ATMEGA328P-PU en 12v et changer la polarité car lui étant en anode commune et moi en cathode commune... Aidé par le fabuleux Chat GPT (qui commence a fatigué aussi),'ai commencé par changer le commun, Voici le schéma de base :Pièce jointe 506377 Vous pouvez voir que un transistor permet est contrôler par DIGIT_1 (qui est une sortie du microcontrôleur) et qu'il laisse passer ou non le 5V aux anodes communes de ses affichages. Moi j'ai du changer ça car j'ai des cathode communes, ça a été plutôt simple pour cette partie, Capture d’écran 2025-03-11 160801.jpg J'ai juste remplacer les transistor par des Mosfet N-Channel qui laissent passer le GND quand ils reçoivent les 5V du microcontrôleurs. Premier problème résolut !
Maintenant le plus complexe, Je vais vous expliquer ce qu'il se passe dans son cas : Capture d’écran 2025-03-11 161352.jpg Toutes les balises sont branchées au microcontrôleur, il envoie tout le temps du 5V quand les segments (A,B...,DP) doivent être éteint et dès qu'il veut alimenter un segment il envoie du GND pour que cela ferme le circuit (vu qu'il envoie du 5V sur ses anodes communes). Moi dans mon cas (c'est plus complexe...) : Capture d’écran 2025-03-11 160907.jpg Je dois rajouter deux étapes supplémentaires et aussi inversé le code pour qu'il envoi 5V si je veux allumer un segment, dans l'ordre nous avons : le microcontrolleur veut allumer un segment -> il envoie 5V -> Un Mosfet N-Channel reçoit ce 5V a sa Gate et envoie GND-> Un Mosfet P-Channel cette fois reçoit le GND a sa Gate et envoie finalement du 12V au affichages. Pour ceux qui se demande, je suis obligé de mettre un N-channel avant le P-Channel car si je n'en met pas et que je n'inverse pas le code on retrouve : GND si on veut allumer ->OK les affichages s'allume mais par contre si on les veux éteint le microcontrôleur envoie du 5V donc aux portes du P-Channel on aura 12V-5V=7V donc il ne sera pas fermé. Alors que si je rajoute un N-Channel il enverra soit GND pour allumer ou il restera flottant.
Voila donc pour cela j'aimerais que les pros me disent si jamais j'ai fait des erreurs ou que dois-je rajouter. Et ensuite je vous donne le code que m'a modifié Chat GPT (nous n'avons que modifié la fin "!bit" au lieu de "bit" sois disant pour l'inversé mais je n'y connais rien) donc c'est le seul flou qui fait que je ne sais pas si ça marchera, car après avoir fais des simulation ça ne marchais pas mais apparemment ça serait a cause de Tinkercad qui gérerais mal les multiplexage très rapide, donc c'est surtout pour ça que j'ai peur, je veux être sur que ça marcherais avec les changements que j'ai effectué avant de me lancé)
Merci a tout ceux qui se pencheront sur le sujet, n'hésitez surtout pas a me poser des questions si a des moments vous trouvez quelque chose bizarre car moi ça m'aiderait énormément !Code:#include <Wire.h> #include "RTClib.h" #define A 2 #define B 3 #define C 4 #define D 5 #define E 6 #define F 7 #define G 8 #define DP 9 #define CA1 10 #define CA2 11 #define CA3 12 #define CA4 13 int d = 2, first_h=0, second_h=0, first_m=0, second_m=0, sec_old=0, h, m, s; RTC_DS1307 rtc; const int segs[7] = { A, B, C, D, E, F, G}; const byte numbers[11] = {0b1000000, 0b1111001, 0b0100100, 0b0110000, 0b0011001, 0b0010010, 0b0000010, 0b1111000, 0b0000000, 0b0010000}; void setup() { Serial.begin(57600); #ifdef AVR Wire.begin(); #else Wire1.begin(); #endif rtc.begin(); for(int i=2;i<=13;i++) { pinMode(i, OUTPUT); } for(int i=2;i<=13;i++) { digitalWrite(i, LOW); } } void loop() { DateTime now = rtc.now(); h = now.hour(); m = now.minute(); s = now.second(); first_h = h / 10; second_h = h % 10; first_m = m / 10; second_m = m % 10; lightDigit1(numbers[first_h]); delay(d); lightDigit2(numbers[second_h]); delay(d); lightDigit3(numbers[first_m]); delay(d); lightDigit4(numbers[second_m]); delay(d); } void lightDigit1(byte number) { digitalWrite(DP, HIGH); digitalWrite(CA1, HIGH); digitalWrite(CA2, LOW); digitalWrite(CA3, LOW); digitalWrite(CA4, LOW); lightSegments(number); } void lightDigit2(byte number) { digitalWrite(CA1, LOW); digitalWrite(CA2, HIGH); digitalWrite(CA3, LOW); digitalWrite(CA4, LOW); if(s % 2 == 0) digitalWrite(DP, LOW); else digitalWrite(DP, HIGH); lightSegments(number); } void lightDigit3(byte number) { digitalWrite(DP, HIGH); digitalWrite(CA1, LOW); digitalWrite(CA2, LOW); digitalWrite(CA3, HIGH); digitalWrite(CA4, LOW); lightSegments(number); } void lightDigit4(byte number) { digitalWrite(DP, HIGH); digitalWrite(CA1, LOW); digitalWrite(CA2, LOW); digitalWrite(CA3, LOW); digitalWrite(CA4, HIGH); lightSegments(number); } void lightSegments(byte number) { for (int i = 0; i < 7; i++) { int bit = bitRead(number, i); digitalWrite(segs[i], !bit); //c'est ici qu'il a inversé } }
-----