In ai multe proiecte am folosit metoda multiplexarii, care pentru anumite persoane e ceva ciudat si de neinteles, asa ca o sa incerc sa va prezint aceasta metoda, cum am folosit-o eu la ceasuri sau la termostatele cu afisaj led din 7 segmente.
Metoda este folosita de foarte mult timp, in primul rand, pentru ca reduce mult namarul de pini ai afisajului: la afisajul multiplexat cu 4 cifre sunt doar 12 pini (4 cifre si 8 segmente), pe cand la un afisaj cu comanda separata sunt folositi 28 pini (4 grupe de cate 8 segmente).
Daca vreau sa afisez ora 12:34, sunt 2 cazuri:
- cu secundele aprinse (in cazul de fata, doar punctul zecimal de la cifra a 2-a)
- fara secunde
Bun, acum, pentru cazul afisarii orei cu secunda:
respectiv fara secunda
deci sunt 4 timpi:
- primul timp: se alimenteaza prima afisaj si se aprinde cifra 1
- al doilea timp: se alimenteaza al doilea afisaj si se aprinde cifra 2 ( cu sau fara punctul zecimal)
- al treilea timp: se alimenteaza al treilea afisaj si se aprinde cifra 3
- al patrulea timp: se alimenteaza al patrulea afisaj si se aprinde cifra 4
apoi se repeta de la timpul 1.
La afisajele cu anod comun, un fisaj se comanda prin alimentarea cu plus a pinului comun si conectarea minusului, cel putin printr-o rezistenta de limitare a curentului, la toate segmentele dorite a se aprinde, iar la afisajul cu catod comun, segmentele seconecteaza la plus prin rezistenta si la masa se conecteaza pinul comun. Cifrele si anumite litere sau simboluri se fac cum e prezentat in articolul 7-segment HEX decoder
Un ceas "caramida din lemn" (wood brick clock) are 4 afisaje cu 7 segmente de 30mm (inaltimea unei cifre), conectate multiplexat, iar al treilea afisaj este montat rotit la 180 grade pentru o prezentare mai frumoasa a secundelor.
Am folosit sketch-urile din articolul Afisaje LED cu 7 segmente si.. Arduino (II) pentru a afisa temperatura si umiditatea, conectand pe langa afisaj si senzorul DHT11, ca si un afisaj multiplexat normal:
In diferite stadii de testare am avut situatiile:
- umiditatea cu simbol universal "H"
- umiditatea, cu simbol "u"
- umiditatea cu un simbol apropiat de cel pentru procent (%)
- temperatura de 18 grade Celsius:
Am conectat si modulul de reac cu DS1307:
Am folosit sketch-urile (programelele) pentru combinatia senzor DHT11 si ceas de timp real cu DS1307, obtinand urmatoarele situatii neacceptabile:
- cifra 4 arata a "h"
- cifra 1 este in dreapta
- cifra 3 este litera "E"
Dupa ce am modificat programul prin adaugarea unor caractere noi am obtinut afisarea corecta:
/* 6-13-2011 Spark Fun Electronics 2011 Nathan Seidle This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license). 4 digit 7 segment display: http://www.sparkfun.com/products/9483 Datasheet: http://www.sparkfun.com/datasheets/Components/LED/7-Segment/YSD-439AR6B-35.pdf This is an example of how to drive a 7 segment LED display from an ATmega without the use of current limiting resistors. This technique is very common but requires some knowledge of electronics - you do run the risk of dumping too much current through the segments and burning out parts of the display. If you use the stock code you should be ok, but be careful editing the brightness values. This code should work with all colors (red, blue, yellow, green) but the brightness will vary from one color to the next because the forward voltage drop of each color is different. This code was written and calibrated for the red color. This code will work with most Arduinos but you may want to re-route some of the pins. 7 segments 4 digits 1 colon = 12 pins required for full control */// modified connexion by niq_ro from http://nicuflorica.blogspot.com// for my Luckylight KW4-563ASA// dataseet: http://www.tme.eu/ro/Document/dfc2efde2e22005fd28615e298ea2655/KW4-563XSA.pdfint digit1 = 11; //PWM Display pin 12 (digit1 is common anonds A1 from right side)int digit2 = 10; //PWM Display pin 9 (digit2 is common A2)int digit3 = 9; //PWM Display pin 8 (digit3 is common anods A3)int digit4 = 6; //PWM Display pin 6 (digit4 is common anods, from left side)//Pin mapping from Arduino to the ATmega DIP28 if you need it//http://www.arduino.cc/en/Hacking/PinMappingint segA = 2; //Display pin 11int segB = 3; //Display pin 7int segC = 4; //Display pin 4int segD = 5; //Display pin 2int segE = 12; //Display pin 1int segF = 7; //Display pin 10int segG = 8; //Display pin 5int segDP = 13; // Display pin 3
#include "DHT.h"
#define DHTPIN A2 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
#include <Wire.h>
#include "RTClib.h"RTC_DS1307RTC;
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib// original sketck from http://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit/// add part with SQW=1Hz from http://tronixstuff.wordpress.com/2010/10/20/tutorial-arduino-and-the-i2c-bus/voidsetup() {
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
// if you need set clock... just remove // from line above this// part code for flashing LEDWire.beginTransmission(0x68);
Wire.write(0x07); // move pointer to SQW address// Wire.write(0x00); // turns the SQW pin offWire.write(0x10); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave at 1Hz// Wire.write(0x13); // sends 0x13 (hex) 00010011 (binary) 32kHzWire.endTransmission();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiledRTC.adjust(DateTime(__DATE__, __TIME__));
}
dht.begin();
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(segDP, OUTPUT);
pinMode(digit1, OUTPUT);
pinMode(digit2, OUTPUT);
pinMode(digit3, OUTPUT);
pinMode(digit4, OUTPUT);
// pinMode(13, OUTPUT);Serial.begin(9600);
Serial.println("test for niq_ro");
}
voidloop()
{
digitalWrite(segDP, HIGH);
DateTimenow = RTC.now();
int timp = now.hour()*100+now.minute();
// int timp = (now.minute(), DEC);// displayNumber(12); // this is number to diplay// int timp = 1234;Serial.print(now.hour(), DEC);
Serial.print(":");
Serial.print(now.minute(), DEC);
Serial.print(" -> ");
Serial.print(timp);
Serial.println(" !");
/* for(int i = 1000 ; i >0 ; i--) { ora10(timp); } */int minutzi = now.minute()/10;
Serial.print(minutzi);
if (timp>999)
{
if (minutzi==3)
{
Serial.print(minutzi);
for(int i = 1000 ; i >0 ; i--) ora12(timp);
}
elseif (minutzi==1) {
Serial.print(minutzi);
for(int i = 1000 ; i >0 ; i--) ora11(timp);
}
elseif (minutzi==4) {
Serial.print(minutzi);
for(int i = 1000 ; i >0 ; i--) ora13(timp);
}
else
{
Serial.print(minutzi);
for(int i = 1000 ; i >0 ; i--) ora10(timp);
}
}
else// for(int i = 1000 ; i >0 ; i--) ora20(timp);
{
if (minutzi==3)
{
Serial.print(minutzi);
for(int i = 1000 ; i >0 ; i--) ora22(timp);
}
elseif (minutzi==1) {
Serial.print(minutzi);
for(int i = 1000 ; i >0 ; i--) ora21(timp);
}
elseif (minutzi==4) {
Serial.print(minutzi);
for(int i = 1000 ; i >0 ; i--) ora23(timp);
}
else
{
Serial.print(minutzi);
for(int i = 1000 ; i >0 ; i--) ora20(timp);
}
}
/* //for tests for(int i = 1000 ; i >0 ; i--) { displayNumber11(timp); } for(int i = 1000 ; i >0 ; i--) { displayNumber13(timp); } for(int i = 1000 ; i >0 ; i--) { displayNumber14(timp); }*//* for(int i = 1000 ; i >0 ; i--) { displayNumber01(timp); }*/int h = dht.readHumidity();
int t = dht.readTemperature();
// int t=6; // just for testif (t < 10)
{
for(int i = 1000 ; i >0 ; i--) {
temperatura2(t); // this is number to diplay
}
}
else
{for(int i = 1000 ; i >0 ; i--) {
temperatura1(t); // this is number to diplay
}
}
for(int i = 1000 ; i >0 ; i--) {
umidit(h); // this is number to diplay
}
}
//Given a number, we display 10:22//After running through the 4 numbers, the display is left turned off//Display brightness//Each digit is on for a certain amount of microseconds//Then it is off until we have reached a total of 20ms for the function call//Let's assume each digit is on for 1000us//Each digit is on for 1ms, there are 4 digits, so the display is off for 16ms.//That's a ratio of 1ms to 16ms or 6.25% on time (PWM).//Let's define a variable called brightness that varies from://5000 blindingly bright (15.7mA current draw per digit)//2000 shockingly bright (11.4mA current draw per digit)//1000 pretty bright (5.9mA)//500 normal (3mA)//200 dim but readable (1.4mA)//50 dim but readable (0.56mA)//5 dim but readable (0.31mA)//1 dim but readable in dark (0.28mA)// if temperature is >= 10 degree Celsiusvoid temperatura1(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOWfor(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of timeswitch(digit) {
case 1:
digitalWrite(digit1, DIGIT_ON);
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
lightNumber(11); // display degree symboldelayMicroseconds(DISPLAY_BRIGHTNESS);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
lightNumber(12); // display C letterdelayMicroseconds(DISPLAY_BRIGHTNESS);
break;
}
//Turn off all segments
lightNumber(10);
//Turn off all digitsdigitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
digitalWrite(segDP, HIGH);
}
}
// if temperature is < 10 degree Celsiusvoid temperatura2(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOWfor(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of timeswitch(digit) {
case 1:
digitalWrite(digit1, DIGIT_OFF);
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
lightNumber(11); // display degree symboldelayMicroseconds(DISPLAY_BRIGHTNESS);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
lightNumber(12); // display C letterdelayMicroseconds(DISPLAY_BRIGHTNESS);
break;
}
//Turn off all segments
lightNumber(10);
//Turn off all digitsdigitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
digitalWrite(segDP, HIGH);
}
}
// for humidityvoid umidit(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOWfor(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of timeswitch(digit) {
case 1:
digitalWrite(digit1, DIGIT_ON);
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
lightNumber(11); // display degree symboldelayMicroseconds(DISPLAY_BRIGHTNESS);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
lightNumber(13); // display "o" letterdelayMicroseconds(DISPLAY_BRIGHTNESS);
break;
}
//Turn off all segments
lightNumber(10);
//Turn off all digitsdigitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
digitalWrite(segDP, HIGH);
}
}
// clock for hour >=10void ora10(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOWfor(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of timeswitch(digit) {
case 1:
digitalWrite(digit1, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, LOW);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
//digitalWrite(segDP, HIGH);digitalWrite(segDP, LOW);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
}
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);
//Turn off all digitsdigitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
digitalWrite(segDP, HIGH);
}
}
// clock for hour >=10 and minutes is 1x// ora e din 2 cifre si minutele incep cu cifra 1...void ora11(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOWfor(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of timeswitch(digit) {
case 1:
digitalWrite(digit1, DIGIT_ON);
digitalWrite(segDP, HIGH);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, LOW);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
//digitalWrite(segDP, HIGH);
lightNumber(31); // display rotated 1 numberdigitalWrite(segDP, LOW);
// lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
}
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);
//Turn off all digitsdigitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
digitalWrite(segDP, HIGH);
}
}
// clock for hour >=10 and minutes is 3x// ora e din 2 cifre si minutele incep cu cifra 3...void ora12(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOWfor(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of timeswitch(digit) {
case 1:
digitalWrite(digit1, DIGIT_ON);
digitalWrite(segDP, HIGH);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, LOW);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
//digitalWrite(segDP, HIGH);
lightNumber(33); // display rotated 3digitalWrite(segDP, LOW);
// lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
}
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);
//Turn off all digitsdigitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
digitalWrite(segDP, HIGH);
}
}
// clock for hour >=10 and minutes is 4x// ora e din 2 cifre si minutele incep cu cifra 4...void ora13(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOWfor(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of timeswitch(digit) {
case 1:
digitalWrite(digit1, DIGIT_ON);
digitalWrite(segDP, HIGH);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, LOW);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
//digitalWrite(segDP, HIGH);
lightNumber(34); // display rotated 4digitalWrite(segDP, LOW);
// lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
}
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);
//Turn off all digitsdigitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
digitalWrite(segDP, HIGH);
}
}
// clock for hour <10void ora20(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOWfor(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of timeswitch(digit) {
case 1:
digitalWrite(digit1, DIGIT_OFF);
lightNumber(10); // off first valuedigitalWrite(segDP, HIGH);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, LOW);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
digitalWrite(segDP, LOW);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
}
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);
//Turn off all digitsdigitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
digitalWrite(segDP, HIGH);
}
}
// clock for hour <10 and minutes is 1x// ora e din 2 cifre si minutele incep cu cifra 1...void ora21(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOWfor(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of timeswitch(digit) {
case 1:
digitalWrite(digit1, DIGIT_OFF);
digitalWrite(segDP, HIGH);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, LOW);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
//digitalWrite(segDP, HIGH);
lightNumber(31); // display rotated 1 numberdigitalWrite(segDP, LOW);
// lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
}
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);
//Turn off all digitsdigitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
digitalWrite(segDP, HIGH);
}
}
// clock for hour <10 and minutes is 3x// ora e din 2 cifre si minutele incep cu cifra 3...void ora22(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOWfor(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of timeswitch(digit) {
case 1:
digitalWrite(digit1, DIGIT_OFF);
digitalWrite(segDP, HIGH);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, LOW);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
//digitalWrite(segDP, HIGH);
lightNumber(33); // display rotated 3digitalWrite(segDP, LOW);
// lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
}
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);
//Turn off all digitsdigitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
digitalWrite(segDP, HIGH);
}
}
// clock for hour <10 and minutes is 4x// ora e din 2 cifre si minutele incep cu cifra 4...void ora23(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOWfor(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of timeswitch(digit) {
case 1:
digitalWrite(digit1, DIGIT_OFF);
digitalWrite(segDP, HIGH);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, LOW);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
//digitalWrite(segDP, HIGH);
lightNumber(34); // display rotated 4digitalWrite(segDP, LOW);
// lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
lightNumber(toDisplay % 10);
toDisplay /= 10;
break;
}
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);
//Turn off all digitsdigitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
digitalWrite(segDP, HIGH);
}
}
//Given a number, turns on those segments//If number == 10, then turn off numbervoid lightNumber(int numberToDisplay) {
#define SEGMENT_ON LOW
#define SEGMENT_OFF HIGHswitch (numberToDisplay){
case 0:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_OFF);
break;
case 1:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
case 2:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
case 3:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
case 4:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 5:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 6:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 7:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
case 8:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 9:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
// all segment are ONcase 10:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
// degree symbol made by niq_rocase 11:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
// C letter made by niq_rocase 12:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_OFF);
break;
// "o mic" letter made by niq_rocase 13:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
// "rotated 3" made by niq_rocase 33:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
// "rotated 1" made by niq_rocase 31:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_OFF);
break;
// "rotated 4" made by niq_rocase 34:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
}
}