/* SevSeg Counter Example
Copyright 2017 Dean Reading
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
This example demonstrates a very simple use of the SevSeg library with a 4
digit display. It displays a counter that counts up, showing deci-seconds.
#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object
void setup() {
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_ANODE; // See README.md for options
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected
//SetupES();
Serial.begin(115200);
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
}
void loop() {
static unsigned long timer = millis();
static int deciSeconds = 0;
static unsigned int Val=0;//ajoute
if (millis() - timer >= 100) {
timer += 100;
deciSeconds++; // 100 milliSeconds is equal to 1 deciSecond
if (deciSeconds == 10000) { // Reset to 0 after counting for 1000 seconds.
deciSeconds=0;
}
//sevseg.setNumber(deciSeconds, 1);//enleve
Val = analogRead(A0);//ajoute
sevseg.setNumber(Val, 0);//ajoute
Serial.println(Val);//ajoute
}
sevseg.refreshDisplay(); // Must run repeatedly
}
/// END ///
*/ //code début
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte numSegments = 8;
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
byte tabDeco7seg[]={0x3f,0x06,0x5b,0x4F,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned int i = 0;
byte digits[4] = {0,0,0,0};
byte dots = 0x02;
unsigned int Number = 0;
void setDigit(unsigned char nDigitActif,unsigned char nSegsActif)
{
unsigned int i = 0;
//unsigned int TAB[8];
//désactiver tous les digits avant de changer les segments:
/*for(i=2;i<6;i++)
{
pinMode(i, OUTPUT);
digitalWrite(i, HIGH);//desactivation des digits
}
*/
for(i=digitPins[0];i<=digitPins[numDigits-1];i++)
{
pinMode(i, OUTPUT);
digitalWrite(i, HIGH);//desactivation des digits
}
//piloter les segments en utilisant les valeurs des bits de nSegsActif:
/*
for(i = 0;i<numSegments;i++)
{
TAB[i] = (nSegsActif>>i) & 0b00000001;
}
//activer le bon digit:
for(i = 0; i<numSegments; i++)
{
if(TAB[i] == 1)
{
digitalWrite((i+6),HIGH);
}
else
{
digitalWrite((i+6),LOW);
}
}
*/
for(i = 0;i<numSegments;i++)
{
if(((nSegsActif>>i) & 0b00000001) == 1)
{
digitalWrite((segmentPins[i]),HIGH);
}
else
{
digitalWrite((segmentPins[i]),LOW);
}
}
//activer le bon digit:
/*
for(i = 0; i<numSegments; i++)
{
if(TAB[i] == 1)
{
digitalWrite((i+6),HIGH);
}
else
{
digitalWrite((i+6),LOW);
}
}
*/
for(i = 0; i<numSegments; i++)
{
if(((nSegsActif>>i) & 0b00000001) == 1)
{
digitalWrite((segmentPins[i]),HIGH);
}
else
{
digitalWrite((segmentPins[i]),LOW);
}
}
//nDigitActif = nDigitActif+2;
//digitalWrite(nDigitActif, LOW);
/* if(nDigitActif == 0)
{
nDigitActif = 5;
digitalWrite(nDigitActif, LOW);
}
if(nDigitActif == 1)
{
nDigitActif = 4;
digitalWrite(nDigitActif, LOW);
}
if(nDigitActif == 2)
{
nDigitActif = 3;
digitalWrite(nDigitActif, LOW);
}
if(nDigitActif == 3)
{
nDigitActif = 2;
digitalWrite(nDigitActif, LOW);
}*/
/*
switch(nDigitActif)
{
case 0:
nDigitActif = 5;
digitalWrite(nDigitActif, LOW);
break;
case 1:
nDigitActif = 4;
digitalWrite(nDigitActif, LOW);
break;
case 2:
nDigitActif = 3;
digitalWrite(nDigitActif, LOW);
break;
case 3:
nDigitActif = 2;
digitalWrite(nDigitActif, LOW);
break;
default: nDigitActif=0;
}
*/
digitalWrite(digitPins[(numDigits-1)-nDigitActif], LOW);
}
void setNumber(unsigned int val)
{
digits[0] = val%10; //unité
digits[1] = (val/10)%10;//dizaines
digits[2] = (val/100)%10;//centaines
digits[3] = (val/1000)%10;//miliers
}
/*
void setNumber(unsigned int val)
{
float mil;
float cent;
float diz;
float unite;
unsigned int reste;
unsigned int val_mil;
unsigned int val_cent;
unsigned int val_diz;
unsigned int val_unite;
val_mil = val;
if(val_mil >= 1000)
{
reste = (val_mil % 1000);
mil = ( (float)(val_mil - reste) ) / 1000.0;
}
else
{
mil = 0;
}
val_cent = val_mil - ( ((unsigned int) mil) * 1000);
if( val_cent >= 100)
{
reste = (val_cent % 100);
cent = ( (float)(val_cent - reste) ) / 100.0;
}
else
{
cent = 0;
}
val_diz = val_cent - ( ((unsigned int) cent) * 100);
if( val_diz >= 10)
{
reste = (val_diz % 10);
diz = (float)(val_diz - reste) / 10.0;
}
else
{
diz = 0;
}
val_unite = val_diz - ( ((unsigned int) diz) * 10);
unite = (float)(val_unite);
digits[0] = (unsigned int) unite;
digits[1] = (unsigned int) diz;
digits[2] = (unsigned int) cent;
digits[3] = (unsigned int) mil;
}
*/
void tache1()
{
setNumber(Number);
Number = Number + 1;
if(Number == 10000)
{
Number = 0;
}
}
void tache2()
{
static unsigned int Nombre_Appels = 0;
setDigit(Nombre_Appels, (tabDeco7seg[digits[Nombre_Appels]]) | ( ( (dots >> Nombre_Appels) & 0x01 ) << 7 ) );
Nombre_Appels = Nombre_Appels + 1;
if(Nombre_Appels == numDigits)
{
Nombre_Appels = 0;
}
//Nombre_Appels=(Nombre_Appels+1)%numDigits;
}
void setup() {
Serial.begin(115200);
Serial.println("debut");
for(i=2;i<6;i++)
{
pinMode(i, OUTPUT);
digitalWrite(i, HIGH);//digits actif a 0
}
for(i=6;i<14;i++)
{
pinMode(i, OUTPUT);
digitalWrite(i, LOW);//segments actif a 1
}
// on eteint tous les segments et les digits
}
void loop() {
/*digitalWrite(2, LOW);
digitalWrite(6, HIGH);
digitalWrite(10, HIGH);
*/
//setDigit(0,0b01110111); //affiche la lettre A majuscule
/*
setDigit(0,0x10);
setDigit(1,0x20);
setDigit(2,0x40);
setDigit(3,0x80);
*/
/*
setDigit(0,1);
setDigit(1,2);
setDigit(2,3);
setDigit(3,4);
*/
/*
if( (digits[0] < 10) && (digits[1] < 10) && (digits[2] < 10) && (digits[3] < 10) )
{
setDigit(0,tabDeco7seg[digits[0]]);
setDigit(1,tabDeco7seg[digits[1]]);
setDigit(2,tabDeco7seg[digits[2]]);
setDigit(3,tabDeco7seg[digits[3]]);
}
*/
//Afficher un nombre avec gestion du point décimal :
/*
setNumber(7895);
dots = 2;
if( (digits[0] < 10) && (digits[1] < 10) && (digits[2] < 10) && (digits[3] < 10) )
{
setDigit(0, (tabDeco7seg[digits[0]]) | ( ( (dots >> 0) & 0x01 ) << 7 ) );//gestion du point décimal fait
setDigit(1, (tabDeco7seg[digits[1]]) | ( ( (dots >> 1) & 0x01 ) << 7 ) );//par la partie droite du OU logique
setDigit(2, (tabDeco7seg[digits[2]]) | ( ( (dots >> 2) & 0x01 ) << 7 ) );
setDigit(3, (tabDeco7seg[digits[3]]) | ( ( (dots >> 3) & 0x01 ) << 7 ) );
}
*/
//Compteur:
unsigned int periodiciteTache1=100; //100ms entre chaque incrémentation de la valeur à afficher
unsigned int periodiciteTache2=4; //4ms pour l'affichage de chaque digit
static unsigned long timerTache1 = millis();
static unsigned long timerTache2 = millis();
if (millis() - timerTache1 >= periodiciteTache1)
{
timerTache1 += periodiciteTache1;
tache1();
}
if (millis() - timerTache2 >= periodiciteTache2)
{
timerTache2 += periodiciteTache2;
tache2();
}
}