Go Down

Topic: Afficheur 7 segments + variable (Read 236 times) previous topic - next topic

Ben4910

Bonjour,
Je sollicite vos connaissances. J'aimerais afficher le contenu d'une variable dans un afficheur 4digits 7 segments. Mais je ne vois pas trop comment réaliser le code à mettre en place.

J'ai déjà un code complet et fonctionnel pour la donnée de ma variable. Dois-je utiliser une librairie pour l'afficheur ?

manumanu

Bonjour;

L'afficheur 7 segments est composé de LED. Tu n'a pas besoins de librairie si tu souhaite le piloter directement avec les broches de l'Arduino.
Il t'en faudra évidemment 7 + GND.

https://eskimon.fr/tuto-arduino-205-afficheurs-7-segments

Salutations.
"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

Ben4910

J'ai réaliser un code pour l'afficheur, mais je ne vois pas comment intégrer ma variable. Ma variable est de type INT (ex: 78) comment je peux dire à l'afficheur de m'afficher le 78 ?

al1fch

#3
Jan 12, 2019, 11:43 am Last Edit: Jan 12, 2019, 11:46 am by al1fch
séparer le 7 et le 8 et les envoyer chacun sur un afficheur

un indice 78 / 10 = 7 et il reste 8  (cf division entière et le modulo)

kamill

#4
Jan 12, 2019, 11:44 am Last Edit: Jan 12, 2019, 11:46 am by kamill
Bonjour,

On ne sait rien sur l'afficheur et sa connexion (multiplexé ?) et rien sur le code.
Sans informations sur le hard et sans code, je ne vois pas bien comment on pourrait t'aider.

Ben4910

Donc l'afficheur est un HS420561K-32, le capteur lui est un DS18B20.

LE code ci-dessous est pour le capteur:

Code: [Select]
/**
 * Exemple de code pour lire un unique capteur DS18B20 sur un bus 1-Wire.
 */
 
/* Dépendance pour le bus 1-Wire */
#include <OneWire.h>
 
 
/* Broche du bus 1-Wire */
const byte BROCHE_ONEWIRE = 7;

/* Code de retour de la fonction getTemperature() */
enum DS18B20_RCODES {
  READ_OK,  // Lecture ok
  NO_SENSOR_FOUND,  // Pas de capteur
  INVALID_ADDRESS,  // Adresse reçue invalide
  INVALID_SENSOR  // Capteur invalide (pas un DS18B20)
};


/* Création de l'objet OneWire pour manipuler le bus 1-Wire */
OneWire ds(BROCHE_ONEWIRE);
 
 
/**
 * Fonction de lecture de la température via un capteur DS18B20.
 */
byte getTemperature(float *temperature, byte reset_search) {
  byte data[9], addr[8];
  // data[] : Données lues depuis le scratchpad
  // addr[] : Adresse du module 1-Wire détecté
 
  /* Reset le bus 1-Wire ci nécessaire (requis pour la lecture du premier capteur) */
  if (reset_search) {
    ds.reset_search();
  }
 
  /* Recherche le prochain capteur 1-Wire disponible */
  if (!ds.search(addr)) {
    // Pas de capteur
    return NO_SENSOR_FOUND;
  }
 
  /* Vérifie que l'adresse a été correctement reçue */
  if (OneWire::crc8(addr, 7) != addr[7]) {
    // Adresse invalide
    return INVALID_ADDRESS;
  }
 
  /* Vérifie qu'il s'agit bien d'un DS18B20 */
  if (addr[0] != 0x28) {
    // Mauvais type de capteur
    return INVALID_SENSOR;
  }
 
  /* Reset le bus 1-Wire et sélectionne le capteur */
  ds.reset();
  ds.select(addr);
 
  /* Lance une prise de mesure de température et attend la fin de la mesure */
  ds.write(0x44, 1);
  delay(800);
 
  /* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
 
 /* Lecture du scratchpad */
  for (byte i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
   
  /* Calcul de la température en degré Celsius */
  *temperature = (int16_t) ((data[1] << 8) | data[0]) * 0.0625;
 
  // Pas d'erreur
  return READ_OK;
}
 
 
/** Fonction setup() **/
void setup() {

  /* Initialisation du port série */
  Serial.begin(115200);
}
 
 
/** Fonction loop() **/
void loop() {
  float temperature;
   
  /* Lit la température ambiante à ~1Hz */
  if (getTemperature(&temperature, true) != READ_OK) {
    Serial.println(F("Erreur de lecture du capteur"));
    return;
  }

  /* Affiche la température */
  Serial.print(F("Temperature : "));
  Serial.print(temperature, 2);
  //Serial.write(176); // Caractère degré
  //Serial.write('C');
  Serial.print(" C°");
  Serial.println();
}


et ensuite pour l'afficheur :

Code: [Select]
int valCompteur = 0;
int nbrCompteur =20;

int pinA =2;
int pinB =3;
int pinC =4;
int pinD =5;
int pinE =6;
int pinF =7;
int pinG =8;
int digit1 =9;
int digit2 =10;
int digit3 =11;
int digit4 =12;

void setup() {

Serial.begin(9600);
 //dht.begin();
 
pinMode (pinA, OUTPUT);
pinMode (pinB, OUTPUT);
pinMode (pinC, OUTPUT);
pinMode (pinD, OUTPUT);
pinMode (pinE, OUTPUT);
pinMode (pinF, OUTPUT);
pinMode (pinG, OUTPUT);

pinMode (digit1, OUTPUT);
pinMode (digit2, OUTPUT);
pinMode (digit3, OUTPUT);
pinMode (digit4, OUTPUT);

//active les digits
digitalWrite(digit1,LOW);
digitalWrite(digit2,LOW);
digitalWrite(digit3,LOW);
digitalWrite(digit4,LOW);

// test de tout les segments
digitalWrite(pinA,HIGH);
digitalWrite(pinB,HIGH);
digitalWrite(pinC,HIGH);
digitalWrite(pinD,HIGH);
digitalWrite(pinE,HIGH);
digitalWrite(pinF,HIGH);
digitalWrite(pinG,HIGH);
delay(5000);
}

void loop()
{
//float temperature = dht.readTemperature();
//float humidite = dht.readHumidity();


digitalWrite(digit1,LOW); //ALLUMAGE 1 DIGIT
digitalWrite(digit2,LOW); //ALLUMAGE 2 DIGIT
digitalWrite(digit3,LOW); //ALLUMAGE 3 DIGIT
digitalWrite(digit4,LOW); //ALLUMAGE 4 DIGIT

  //0
digitalWrite(pinA,HIGH);
digitalWrite(pinB,HIGH);
digitalWrite(pinC,HIGH);
digitalWrite(pinD,HIGH);
digitalWrite(pinE,HIGH);
digitalWrite(pinF,HIGH);
digitalWrite(pinG,LOW);
delay(1000);

  //1
digitalWrite(pinA,LOW);//eteint
digitalWrite(pinB,HIGH);//allumé
digitalWrite(pinC,HIGH);
digitalWrite(pinD,LOW);
digitalWrite(pinE,LOW);
digitalWrite(pinF,LOW);
digitalWrite(pinG,LOW);
delay(1000);

  //2
digitalWrite(pinA,HIGH);
digitalWrite(pinB,HIGH);
digitalWrite(pinC,LOW);
digitalWrite(pinD,HIGH);
digitalWrite(pinE,HIGH);
digitalWrite(pinF,LOW);
digitalWrite(pinG,HIGH);
delay(1000);
}

kamill

La gestion d'un afficheur multiplexé n'est pas triviale. Il faut allumer les digits un par un suffisamment rapidement pour qu'on ait l'impression qu'ils sont tous allumés.
Tu peux utiliser une librairie qui se chargera de ça. Par exemple SevSeg

Ben4910

Je vais voir et faire quelque test avec cette librairie...

Ben4910

#8
Jan 12, 2019, 05:23 pm Last Edit: Jan 12, 2019, 05:35 pm by Ben4910
Je reviens avec un nouveau code incluant la librairie SevSeg. Mon afficheur à tout ses segments allumé, j'aurais voulu qu'il m'affiche ce que j'ai dans ma variable "valeurAfficher" Avez-vous une idée ?

config des pins de mon afficheur





Code: [Select]
#include "SevSeg.h"
SevSeg afficheur_temp;

void setup() {
  byte numDigits = 4;
  byte digitPins[] = {12, 11, 10, 9};
  byte segmentsPins[] = {8, 7, 6, 5, 4, 3, 2, 13};
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_ANODE;
  bool updateWithDelays = false; // Default. Recommended
  bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros


  afficheur_temp.begin(hardwareConfig, numDigits, digitPins, segmentsPins, resistorsOnSegments, updateWithDelays, leadingZeros);
  afficheur_temp.setBrightness(50);

}

void loop() {
  const int valeurAfficher = 1002;
  afficheur_temp.setNumber(valeurAfficher);

  afficheur_temp.refreshDisplay();

}

kamill

Il faut que tu adaptes à ta config hard. Ce qui donne (si je ne me suis pas trompé):
Code: [Select]
#include "SevSeg.h"
SevSeg afficheur_temp;

void setup() {
  byte numDigits = 4;
  byte digitPins[] = {9,10,11,12};
  byte segmentsPins[] = {2,3,4,5,6,7,8,13};
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_CATHODE;
  bool updateWithDelays = false; // Default. Recommended
  bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros


  afficheur_temp.begin(hardwareConfig, numDigits, digitPins, segmentsPins, resistorsOnSegments, updateWithDelays, leadingZeros);
  afficheur_temp.setBrightness(50);

}

void loop() {
  const int valeurAfficher = 1002;
  afficheur_temp.setNumber(valeurAfficher);

  afficheur_temp.refreshDisplay();

}

Ben4910

Effectivement j'ai remplacer " byte hardwareConfig = COMMON_CATHODE;", ca fonctionne bien :-),

MERCI

Go Up