Arduino : afficheur 7 segments et contrôle de la luminosité

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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!
  }

Réveil

Édité par Bruno

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte