Je m'appelle Dylan , j'ai 17 ans et j'adore l'électronique !
Aujourd'hui j'ai acheter un capteur de température TMP36 et des afficheurs 7 segments. Le problème c'est au niveau du code Arduino , je ne sais pas comment faire afficher la température sur l'afficheur 7 segments :S
j'utilise un afficheur 7 segments a 4 chiffres.
Si quelqu'un pouvez m'éclairer ou m'aider pour remédier a mon problème , ca serais très sympa de sa part.
// 7 segment
int ledSegment[] = {
2,3,4,5,6,7,8,9};
// Analog pin TMP36
int tempMonitor =0;
// encode the on/off state of the LED segments for the characters
// '0' to '9' and 'DP' into the bits of the bytes
const byte numDef[11] = {
63, 6, 91, 79, 102, 109, 124, 7, 127, 103,128 };
void setup()
{
Serial.begin (9600);
// Sets the pinMode for all LEDs
for (int x = 0; x<=7; x++)
{
pinMode (ledSegment[x],OUTPUT);
}
// enable on by one each LED to test them.
for (int x =0;x<=7;x++){
digitalWrite (ledSegment[x],HIGH);
delay (50);
}
// disable one by one to finish test of each LED
for (int x =0;x<=7;x++){
digitalWrite (ledSegment[x],LOW);
delay (50);
}
}
void loop(){
float temperature = getVoltage(tempMonitor); //getting the voltage reading from the temperature sensor
temperature = (temperature - .5) * 100; //converting from 10 mv per degree wit 500 mV offset
// Print temperature to serial for use in processing
Serial.println (temperature);
/*
* getVoltage() - returns the voltage on the analog input defined by
* pin
*/
// Check Temperature is over 30
int digit1 = temperature / 10;
int digit2 = int(temperature) % 10;
setSegments( numDef[digit1] );
// Delay to display the 10's digit of the temperature
delay (1000);
// now display unit of the temperature
setSegments( numDef[digit2] + numDef[10] );
// Delay to display the unit digit of the temperature
delay (2000);
}
void setSegments(byte segments)
{
// for each of the segments of the LED
for (int s = 0; s < 8; s++)
{
int bitVal = bitRead( segments, s ); // grab the bit
digitalWrite(s+2, bitVal); // set the segment
}
}
float getVoltage(int pin){
return (analogRead(pin) * .004882814); //converting from a 0 to 1024 digital range
// to 0 to 5 volts (each 1 reading equals ~ 5 millivolts
}
Mais je ne sais pas comment faire afficher cette température sur mon afficheur 7 segment a 4 chiffres :S
- Edité par tutoarduino 21 février 2013 à 11:45:21
//TMP36 Pin
int sensorPin = 0; //the analog pin the TMP36's Vout(sense) pin is connected to
//the resolution is 10 mV / degree centigrade with a
//500 mV offset to allow for negative temperatures
/*
* setup() - this function runs once when you turn your Arduino on
* We initialize the serial connection with the computer
*/
void setup()
{
Serial.begin(9600); //Start the serial connection with the computer
//to view the result open the serial monitor
}
void loop() // run over and over again
{
//getting the voltage reading from the temperature sensor
int reading = analogRead(sensorPin);
// converting that reading to voltage, for 3.3v arduino use 3.3
float voltage = reading * 5.0;
voltage /= 1024.0;
// print out the voltage
Serial.print(voltage); Serial.println(" volts");
// now print out the temperature
float temperatureC = (voltage - 0.5) * 100 ; //converting from 10 mv per degree wit 500 mV offset
//to degrees ((volatge - 500mV) times 100)
Serial.print(temperatureC); Serial.println(" degrees C");
// now convert to Fahrenheight
float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
Serial.print(temperatureF); Serial.println(" degrees F");
delay(1000); //waiting a second
}
pour l'afficheur 7 segment a 1 chiffre oui , mais pas celui que je vais utiliser a 4 chiffres non.
Et donc qu'a tu essayés comme branchement, où en es tu sur le problème de l'afficheur (parce que je vais pas m'embeter à taper un message de 10 lignes si c'est pour lire après "ca j'ai déja fait" )
oui j'ai suivit ce site pour le cablage - http://allaboutee.com/2011/07/09/arduino-4-digit-7-segment-display-tutorial/
Pour le code j'avais l'habitude (pour l'afficheur 7 segment a 1 chiffre) de declarer chaque lettre , Exemple : int A = 2; int B = 3; int C = 4; ect.....
Donc j'ai essayer de faire pareil ici pour les 4 chiffres , mais c'est long. Et apres pour mixer l'afficheur avec la temperature je ne sais pas du tout.
- Edité par tutoarduino 22 février 2013 à 14:53:08
Mais pour les 4 chiffres il n'y a qu'une seule fois les 7 segments (donc 7 fils) puis ensuite 1 seul fil par chiffre (pour l'activer ou non). On est d'accord ?
Tu peux télécharger le pdf du cours (en attendant que le tuto soit de nouveau en ligne :/ ) et à la partie sur les afficheurs 7 segments il est expliqué comment faire pour "multiplexer" tes afficheurs... En gros, 7 broches sont utilisés pour les segments, et ensuite on utilise un transistor sur la patte commune de chaque chiffre pour décider de si on l'affiche ou pas le chiffre en question. En commutant suffisamment rapidement entre les treansistors on a pas l'impression que les afficheurs s'allument et s'éteignent.
j'ai relus plusieurs fois le cours , mais je ne comprends pas comment cela fonctionne "multiplexer" avec les decodeurs et les transistors :S et dans l'exemple il utilise un afficheur 7 segment a 1 chiffre , hors je sais l'utiliser , mais l'afficheur a 4 chiffres est different et ne se branche pas de la meme maniere (je sais comment faire le cablage) , le probleme vient du code je ne sais pas quoi faire :S car d'un cote je dois faire en sorte de choisir le chiffre que je desir (exemple le 2 eme chiffre) et ensuit de choisir les segments que je veux allumer. Pour les segments je sais le faire , mais comment faire pour que ma carte arduino comprenne que je veux que ce soit le 2eme chiffre qu'il faut allumer ??? (le chiffre 2 est un exemple, ca pourrai etre les 4 chiffres en meme temps)
je cable comme ceci :
pin de l'afficheur / pin de l'arduino
1 9 ------- 1er chiffre
2 10 ------- 2eme chiffre
3 5
4 5volt
5 6
6 11 ------- 3eme chiffre
7 on utilise pas
8 12 ------- 4eme chiffre
9 on utilise pas
10 idem
11 7
12 GND
13 4
14 2
15 8
16 3
- Edité par tutoarduino 24 février 2013 à 15:44:20
Très bien alors schématiquement l'idée est la suivante :
Toutes les xx millisecondes, tu changes de chiffre affiché (unités puis dizaines puis centaine puis milliers).
Pour cela, il faut que toutes les xx millisecondes tu changes la valeur des segments pour correspondre au chiffre concerné et aussi que tu actives le segment concerné (en désactivant les autres).
Pour activer/désactiver les segments, on passe par l'intermediaire de transistors, qui nous permet de faire passer l'alimentation pour les 7 LEDs composant chaque afficheur.
Il suffit juste dans ta boucle principale de "surveiller" le temps qui passe pour changer régulièrement l'afficheur concerné.
Regarde ta datrasheet (en bas de la page 2), tout tes cathodes sont reliés entre elles, ,donc tout tes segments en fait. Afin de pouvoir allumer un afficheur ou un autre, il va falloir les alimenter via les broches DIG1, 2, 3 ou 4. Si tu alimentes les 4 broches DIG en meme temps, alors les 4 chiffres afficheront la meme chose. Si tu alimentes un seul chiffre (DIG pour digit) alors les 3 autres sont éteints.
L'idée est donc d'alimenté les chiffres un pa un assez rapidement en changeant les valeurs des segments allumés à chaque fois que tu changes de chiffres (et en le faisant suffisamment rapidement tu auras l'impression qu'ils sont tous allumé en meme temps).
Utiliser un décodeur n'est pas indispensable, mais te permettera d'économiser 3 sorties de l'Arduino (en passant de 7 sorties à 4)
En gros ce qu'il essaie de t'expliquer c'est que toutes les xx milisecondes tu va activé le chiffre suivant de l'afficheur. I faut donc que tu mettes à jour la valeur à afficher pour ce chiffre.
Un petit exemple : tu veux afficher 1486 sur ton afficheurs. En admettant que tu prennes une période d'affichage de 200 ms (c'est totalement aléatoire comme valeur)
de 0 à 200ms tu actives DIG1 et tu actives les segments correspondants à "1"
de 200 à 400ms tu actives DIG2 et tu actives les segments correspondants à "4"
de 400 à 600ms tu actives DIG3 et tu actives les segments correspondants à "8"
de 600 à 800ms tu actives DIG4 et tu actives les segments correspondants à "6"
Puis tu recommences comme ça à l'infini.
En règlant bien la période tu aurras l'impression que tous tes chiffres sont allumés en même temps.
alors voila j'ai connecter comme au dessus mon afficheur et j'ai trouver ce morceau de code que je voulais tester au tout debut , mais comme je ne savais pas comment le brancher je ne pouvais pas le uploader. mais maintenant que je sais cabler mon afficheur je l'ai lancer , je vois les chiffres defile , mais on ne les voit pas tres bien , la luminosite n'est pas assez forte , comment faire ?
Le code :
long n = 0;
int x = 100;
int del = 1;
void setup(){
// clearLEDs();
// testLEDs();
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
pinMode(2, OUTPUT);
pinMode(1, OUTPUT);
}
void loop(){
clearLEDs();
pickDigit(1);
pickNumber((n/x/1000)%10);
delayMicroseconds(del);
clearLEDs();
pickDigit(2);
pickNumber((n/x/100)%10);
delayMicroseconds(del);
clearLEDs();
pickDigit(3);
pickNumber((n/x/10)%10);
delayMicroseconds(del);
clearLEDs();
pickDigit(4);
pickNumber(n/x % 10);
delayMicroseconds(del);
if(n/x > 9999){
n = 0;
delay(5000);
}
else n++;
}
void pickDigit(int x){
digitalWrite(13, LOW); // dig 1
digitalWrite(12, LOW); // dig 2
digitalWrite( 9, LOW); // dig 3
digitalWrite( 8, LOW); // dig 4
switch(x){
case 1: digitalWrite(13, HIGH); break;
case 2: digitalWrite(12, HIGH); break;
case 3: digitalWrite(9, HIGH); break;
case 4: digitalWrite(8, HIGH); break;
}
}
void pickNumber(int x){
switch(x){
case 1: one(); break;
case 2: two(); break;
case 3: three(); break;
case 4: four(); break;
case 5: five(); break;
case 6: six(); break;
case 7: seven(); break;
case 8: eight(); break;
case 9: nine(); break;
default: zero(); break;
}
}
void clearLEDs(){
//digitalWrite(13, HIGH);
// digitalWrite(12, HIGH);
//digitalWrite(9, HIGH);
// digitalWrite(8, HIGH);
digitalWrite( 5, HIGH); // A
digitalWrite( 7, HIGH); // B
digitalWrite( 4, HIGH); // C
digitalWrite(11, HIGH); // D
digitalWrite(10, HIGH); // E
digitalWrite( 3, HIGH); // F
digitalWrite( 6, HIGH); // G
}
void one(){
digitalWrite( 5, HIGH); // A
digitalWrite( 7, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(11, HIGH); // D
digitalWrite(10, HIGH); // E
digitalWrite( 3, HIGH); // F
digitalWrite( 6, HIGH); // G
}
void two(){
digitalWrite( 5, LOW); // A
digitalWrite( 7, LOW); // B
digitalWrite( 4, HIGH); // C
digitalWrite(11, LOW); // D
digitalWrite(10, LOW); // E
digitalWrite( 3, HIGH); // F
digitalWrite( 6, LOW); // G
}
void three(){
digitalWrite( 5, LOW); // A
digitalWrite( 7, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(11, LOW); // D
digitalWrite(10, HIGH); // E
digitalWrite( 3, HIGH); // F
digitalWrite( 6, LOW); // G
}
void four(){
digitalWrite( 5, HIGH); // A
digitalWrite( 7, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(11, HIGH); // D
digitalWrite(10, HIGH); // E
digitalWrite( 3, LOW); // F
digitalWrite( 6, LOW); // G
}
void five(){
digitalWrite( 5, LOW); // A
digitalWrite( 7, HIGH); // B
digitalWrite( 4, LOW); // C
digitalWrite(11, LOW); // D
digitalWrite(10, HIGH); // E
digitalWrite( 3, LOW); // F
digitalWrite( 6, LOW); // G
}
void six(){
digitalWrite( 5, LOW); // A
digitalWrite( 7, HIGH); // B
digitalWrite( 4, LOW); // C
digitalWrite(11, LOW); // D
digitalWrite(10, LOW); // E
digitalWrite( 3, LOW); // F
digitalWrite( 6, LOW); // G
}
void seven(){
digitalWrite( 5, LOW); // A
digitalWrite( 7, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(11, HIGH); // D
digitalWrite(10, HIGH); // E
digitalWrite( 3, HIGH); // F
digitalWrite( 6, HIGH); // G
}
void eight(){
digitalWrite( 5, LOW); // A
digitalWrite( 7, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(11, LOW); // D
digitalWrite(10, LOW); // E
digitalWrite( 3, LOW); // F
digitalWrite( 6, LOW); // G
}
void nine(){
digitalWrite( 5, LOW); // A
digitalWrite( 7, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(11, LOW); // D
digitalWrite(10, HIGH); // E
digitalWrite( 3, LOW); // F
digitalWrite( 6, LOW); // G
}
void zero(){
digitalWrite( 5, LOW); // A
digitalWrite( 7, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite(11, LOW); // D
digitalWrite(10, LOW); // E
digitalWrite( 3, LOW); // F
digitalWrite( 6, HIGH); // G
}
Je ne suis pas un expert en programation sous Arduino mais je ne pense pas que tes étapes clearLed() à chaque changement soit utile. Si tu initialises bien au début.
Ensuite le problème de luminosité vient certainement du fait que tu vas trop vite pour faire le changement. En effet tu laisses allumé que pendant 1ms c'est très cour. Je te conseil de changer par 100 ms pour voir ce que ça donne. Tu pourras ensuite ajuster au mieux pour que l'affichage soit lisible tout en étant assez rapide pour ne pas manquer de changement.
il y a aussi les résistances (que j'espere que tu as mis entre les sorties arduino et les leds des 7 segments). Si la luminosité est trop faible tu peux diminuer la résistance.
il y a aussi les résistances (que j'espere que tu as mis entre les sorties arduino et les leds des 7 segments). Si la luminosité est trop faible tu peux diminuer la résistance.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !