La fonction showdigits comporte des delais (qui me paraissent très importants). Comme elle doit être appelée cycliquement, ça va bloquer complètement le programme.
Il faut afficher digit par digit. Chaque digit doit être affiché pendant environ 5ms.
Tu pourrais faire ça dans la loop avec millis(), mais c'est très difficile à faire si tu dois faire autre chose (en particulier lire les sondes de température).
Comme je te disais le plus simple est de le faire en interruption. Par exemple comme ceci:
//sonde
#include <OneWire.h>
#include <DallasTemperature.h>
#include <TimerOne.h>
// Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);
// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);
// Addresses of 3 DS18B20s
uint8_t sensor1[8] = { 0x28, 0xE8, 0xCB, 0x1E, 0x00, 0x00, 0x80, 0x65 };
uint8_t sensor2[8] = { 0x28, 0x06, 0xCD, 0x1E, 0x00, 0x00, 0x80, 0xC3 };
uint8_t sensor3[8] = { 0x28, 0x9B, 0xC7, 0x1E, 0x00, 0x00, 0x80, 0x85 };
unsigned displayValue; // valeur à afficher
// segment | Arduino board PIN number
#define segG 12
#define segF 11
#define segA 6
#define segB 7
#define segE 10
#define segD 9
#define segC 8
//#define DP 13
#define GND1 13
#define GND2 3
#define GND3 4
#define GND4 5
// functions to display digits
void digit0 () {
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, HIGH);
};
void digit1 () {
digitalWrite(segA, HIGH);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
};
void digit2 () {
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, LOW);
};
void digit3 () {
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, LOW);
};
void digit4 () {
digitalWrite(segA, HIGH);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
};
void digit5 () {
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, HIGH);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
};
void digit6 () {
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
};
void digit7 () {
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
};
void digit8 () {
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
};
void digit9 () {
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, HIGH);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
};
//function to display digit from inputed int
void showdigit (int digit)
{
switch (digit) {
case 0:
digit0 ();
break;
case 1:
digit1 ();
break;
case 2:
digit2 ();
break;
case 3:
digit3 ();
break;
case 4:
digit4 ();
break;
case 5:
digit5 ();
break;
case 6:
digit6 ();
break;
case 7:
digit7 ();
break;
case 8:
digit8 ();
break;
case 9:
digit9 ();
break;
default:
break;
};
};
// showing 4 digits
void showdigits (int number)
{
// e.g. we have "1234"
showdigit(number / 1000); // segments are set to display "1"
digitalWrite(GND1, HIGH); // first digit on,
digitalWrite(GND2, LOW); // other off
digitalWrite(GND3, LOW);
digitalWrite(GND4, LOW);
delay (60);
number = number % 1000; // remainder of 1234/1000 is 234
digitalWrite(GND1, LOW); // first digit is off
showdigit(number / 100); //// segments are set to display "2"
digitalWrite(GND2, HIGH); // second digit is on
delay (60); // and so on....
number = number % 100;
digitalWrite(GND2, LOW);
showdigit(number / 10);
digitalWrite(GND3, HIGH);
delay (60);
number = number % 10;
digitalWrite(GND3, LOW);
showdigit(number);
digitalWrite(GND4, HIGH);
delay (60);
// delay (1600);
};
void setup()
{
sensors.begin(); // Start up the library
Serial.begin(9600);
// locate devices on the bus
// Serial.print("Locating devices...");
// Serial.print("Found ");
//deviceCount = sensors.getDeviceCount();
//Serial.print(deviceCount, DEC);
// Serial.println(" devices.");
// Serial.println("");
//
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
// pinMode(DP, OUTPUT);
pinMode(GND1, OUTPUT);
pinMode(GND2, OUTPUT);
pinMode(GND3, OUTPUT);
pinMode(GND4, OUTPUT);
Timer1.initialize(5000); // appel toutes les 5ms
Timer1.attachInterrupt(timerIsr); // attache la routine d'interruption
};
void loop ()
{
sensors.requestTemperatures();
Serial.print("Sensor 1: ");
printTemperature(1, sensor1);
delay(1000);
Serial.print("Sensor 2: ");
printTemperature(2, sensor2);
delay(1000);
Serial.print("Sensor 3: ");
printTemperature(3, sensor3);
delay(1000);
Serial.println();
}
void printTemperature(byte nSensor, DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
Serial.print(tempC);
Serial.print((char)176);
Serial.print("C | ");
displayValue = 1000 * nSensor + tempC * 10; // cette valeur sera affichée en interruption
}
// affiche la valeur displayValue en interruption
void timerIsr()
{
static int ndigit = 0; // numéro du digit à afficher
byte val;
switch (ndigit)
{
case 0:
digitalWrite(GND1, HIGH); // first digit on,
digitalWrite(GND2, LOW); // other off
digitalWrite(GND3, LOW);
digitalWrite(GND4, LOW);
val = displayValue / 1000;
break;
case 1:
digitalWrite(GND1, LOW);
digitalWrite(GND2, HIGH);
val = displayValue / 100 % 10;
break;
case 2:
digitalWrite(GND2, LOW);
digitalWrite(GND3, HIGH);
val = displayValue / 10 % 10;
break;
case 3:
digitalWrite(GND3, LOW);
digitalWrite(GND4, HIGH);
val = displayValue % 10;
break;
}
showdigit(val);
ndigit++;
if (ndigit >= 4)
ndigit = 0;
}
//