Bonjour,
J’ai fait un montage avec un afficheur 7 segments à 4 digits qui sont allumés alternativement en utilisant 4 sorties de l’Arduino mais sans transistors. J’ai une petite question concernant le contrôle de la luminosité d’un afficheur 7 segments : je souhaite contrôler la luminosité de l’afficheur en lien avec une photoresistance (plus la pièce est sombre, moins l’afficheur sera lumineux) et pour ce faire j’utilise les sorties PWM. Cela fonctionne bien à pleine luminosité mais plus elle diminue, plus un scintillement apparaît avec parfois un digit qui s’allume plus intensément une fraction de seconde (je suppose la durée d’un cycle). J’ai essayé d’ajouter des transistors sans que cela change le résultat. Auriez-vous une idée du problème ? Merci !
Voici le code utilisé :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; //Classe RTC_DS1307 const int SER = 7; // DS: Serial data input (Data) const int RCLK = 12; // SH_CP: Shift register clock pin (Clock) const int SRCLK = 8; // ST_CP: Storage register clock pin (latch pin) (Latch) const int D1 = 9; const int D2 = 6; const int D3 = 11; const int D4 = 10; const int pinphotoresistance = A3; byte uniheure; byte dizheure; byte unimins; byte dizmins; // Describe each digit in terms of display segments // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F const byte numbers[10] = { 0b00000011, 0b10011111, 0b00100101, 0b00001101, 0b10011001, 0b01001001, 0b01000001, 0b00011111, 0b00000001, 0b00001001, /* 0b00010001, 0b11000001, 0b01100011, 0b10000101, 0b01100001, 0b01110001 lettres A à F */ }; void setup() { Serial.begin(9600); Wire.begin(); //Démarrage de la librairie wire.h RTC.begin(); //Démarrage de la librairie RTClib.h if (! RTC.isrunning()) { //RTC.adjust(DateTime(__DATE__, __TIME__)); //Cela fonctionne également : //RTC.adjust(DateTime("Dec 5 2012","12:00:00")); //RTC.adjust(DateTime(2015, 4, 17, 18, 15, 0)); } pinMode(SER, OUTPUT); pinMode(RCLK, OUTPUT); pinMode(SRCLK, OUTPUT); pinMode(D1, OUTPUT); pinMode(D2, OUTPUT); pinMode(D3, OUTPUT); pinMode(D4, OUTPUT); } void loop() { byte valphotoresistance = analogRead(pinphotoresistance)/4 + 1; Serial.println(valphotoresistance); DateTime now = RTC.now(); dizmins = now.minute()/10; //récupère les dizaines de minutes unimins = now.minute() - dizmins*10; //récupère les unités de minutes dizheure = now.hour()/10; //récupère les dizaines des heures uniheure = now.hour() - dizheure*10; //récupère les unités des heures shiftIt(numbers[dizheure]); analogWrite(D1, valphotoresistance); delay(2); analogWrite(D1, 0); shiftIt(numbers[uniheure]); analogWrite(D2, valphotoresistance); delay(2); analogWrite(D2, 0); shiftIt(numbers[dizmins]); analogWrite(D3, valphotoresistance); delay(2); analogWrite(D3, 0); shiftIt(numbers[unimins]); analogWrite(D4, valphotoresistance); delay(2); analogWrite(D4, 0); } void shiftIt (byte data) { // Set latchPin LOW while clocking these 8 bits in to the register digitalWrite(RCLK, LOW); for (int k = 0; k <= 7; k++) { // clockPin LOW prior to sending a bit digitalWrite(SRCLK, LOW); if ( data & (1 << k) ) { digitalWrite(SER, HIGH); // turn “On” } else { digitalWrite(SER, LOW); // turn “Off” } // and clock the bit in digitalWrite(SRCLK, HIGH); } //set latchPin to high to lock and send data digitalWrite(RCLK, HIGH); // put delay here if you want to see the multiplexing in action! } |