Fermento Mods
Jump to navigation
Jump to search
Back to HLab DIY labs
dusjagr's simple version 4-digit display
/*
* (c) Fakufaku 2013
* This is the code for the homebrew incubator 'Fermento'
* This code is released under the CC-BY-SA 3.0 License.
* The part of the code that's used for the display on the 7-segment was ripped off the BigTime code from Nathan Seidl. I owe him a beer then.
*/
#include <math.h>
#include <PID_v1.h>
#define TRUE 1
#define FALSE 0
//Careful messing with the system color, you can damage the display if
//you assign the wrong color. If you're in doubt, set it to red and load the code,
//then see what the color is.
#define RED 1
#define GREEN 2
#define BLUE 3
#define YELLOW 4
int systemColor = RED;
int display_brightness = 15000; //A larger number makes the display more dim. This is set correctly below.
// slow continuous PWM variables
#define PWM_MS 50 // this changes the update speed
#define PWM_MIN 100
#define RELAY_ON LOW
#define RELAY_OFF HIGH
// PID loop parameter
#define PID_KP 50
#define PID_KI 1
#define PID_KD 1
// Some display related parameters (time in seconds, temperature in degrees Celsius)
#define TIME_INCREMENT 1800
#define MAX_TIME 356459
#define TEMP_INCREMENT 1
#define MAX_TEMP 65
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Uncomment following line for the homebrew (1-sided) PCB version
//#define FERMENTO_1SIDE
#define FERMENTO_DUSJAGR
//Pin definitions
#ifdef FERMENTO_DUSJAGR
int digit1 = 13; //Display pin 12
int digit2 = 10; //Display pin 9
int digit3 = 9; //Display pin 8
int digit4 = 7; //Display pin 6
int segA = 12; //Display pin 11
int segB = 8; //Display pin 7
int segC = 5; //Display pin 4
int segD = 3; //Display pin 2
int segE = 2; //Display pin 1
int segF = 11; //Display pin 10
int segG = 6; //Display pin 5
int colons = 4; //Display pin 3
int temp_sen = A5; // to read the temperature sensor
int poti_sen = A4; // to read the temperature sensor
const static int buzz = A2;
const static int theButton = A1;
const static int theButton2 = A0;
const static int pwm_pin = A3; // Pin 4
// The interrupt of button1 is on external interrupt 0
// The interrupt of button2 is on external interrupt 1
#define BUTTON1_INT_VECT INT0_vect
#define BUTTON2_INT_VECT INT1_vect
#define BUTTONS_INT_SET() do \
{ \
EICRA = (1<<ISC11) + (1<<ISC01); /* falling edge */ \
EIMSK = (1<<INT1) + (1<<INT0); \
} \
while (0)
#else
// The interrupt of button1 is on external interrupt 0
// The interrupt of button2 is on PCINT13 (A5), on PCIE1.
#define BUTTON1_INT_VECT INT0_vect
#define BUTTON2_INT_VECT PCINT1_vect
#define BUTTONS_INT_SET() do \
{ \
EICRA = (1<<ISC01); /* falling edge */ \
EIMSK = (1<<INT0); \
PCICR = (1 << PCIE1); \
PCMSK1 = (1 << PCINT13); \
} \
while (0)
#endif
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Display status variable
#define TIME 1
#define TEMP 2
int display_status = TEMP;
int backoff = 0; // just a short backoff for when we switch the display between TIME/TEMP
#define BACKOFFTIME 2
char disp_str[4];
// Variable to keep track of PWM window
unsigned long windowStartTime;
// control variables for PID
double t_incub; // input to PID (temperature in incubator)
double t_incub_N; // number of samples in t_incub average
double pwm_duty; // output of PID
double t_set = 0; // set point (target temperature)
double a_Poti; // poti value
//Specify the links and initial tuning parameters
PID myPID(&t_incub, &pwm_duty, &t_set, PID_KP, PID_KI, PID_KD, DIRECT);
// display timer (freeze parameters to display for 2 seconds)
int t_incub_disp;
// Timer variables
unsigned long timer_seconds = 0;
//The very important 32.686kHz interrupt handler
SIGNAL(TIMER2_OVF_vect)
{
if (timer_seconds > 1)
{
timer_seconds--;
}
else if (timer_seconds == 1)
{
// reset timer
timer_seconds = 0;
// turn off by setting target temperature to zero
t_set = 0;
// Reset the PID
myPID.SetMode(MANUAL);
myPID.SetMode(AUTOMATIC);
}
// decrement backoff
if (backoff > 0)
backoff--;
}
//The interrupt occurs when you push the button
SIGNAL(BUTTON1_INT_VECT)
{
display_status = TEMP;
backoff = BACKOFFTIME;
}
SIGNAL(BUTTON2_INT_VECT)
{
display_status = TIME;
backoff = BACKOFFTIME;
}
void setup()
{
Serial.begin(57600);
// set ADC reference to 3.3V
analogReference(DEFAULT);
// initialize pwm drive pin, and turn it off
pinMode(pwm_pin, OUTPUT);
digitalWrite(pwm_pin, HIGH);
// initialize buzzer pin
pinMode(buzz, OUTPUT);
// initialize the buttons
pinMode(theButton, INPUT);
digitalWrite(theButton, HIGH); // pull-up
pinMode(theButton2, INPUT);
digitalWrite(theButton2, HIGH); // pull-up
BUTTONS_INT_SET();
//Setup TIMER2
TCCR2A = 0x00;
TCCR2B = (1<<CS22)|(1<<CS20); //Set CLK/128 or overflow interrupt every 1s
ASSR = (1<<AS2); //Enable asynchronous operation
TIMSK2 = (1<<TOIE2); //Enable the timer 2 interrupt
//These pins are used to control the display
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(digit1, OUTPUT);
pinMode(digit2, OUTPUT);
pinMode(digit3, OUTPUT);
pinMode(digit4, OUTPUT);
pinMode(colons, OUTPUT);
// setup PID stuff
myPID.SetOutputLimits(PWM_MIN-1, PWM_MS-PWM_MIN+1);
myPID.SetMode(AUTOMATIC);
myPID.SetSampleTime(PWM_MS);
windowStartTime = millis();
// initialize pwm
pwm_duty = 0; // off
t_incub = read_temperature();
t_incub_N = 1;
// initialize slow variables for display
t_incub_disp = t_incub;
}
void loop()
{
//displayLetters("UCOK");
//temperatureControl();
analogIn();
displayNumber(a_Poti, FALSE); //Each call takes about 8ms, display the colon
}
// Simple PWM based on millis directly
void temperatureControl()
{
unsigned long now = millis();
// averaging over the whole 5 seconds
t_incub += (read_temperature() - t_incub)/(++t_incub_N);
if(now - windowStartTime > PWM_MS)
{
// compute new pwm value for that window
if (t_set != 0)
myPID.Compute();
// start a new relay window
windowStartTime = now;
// restart averaging of temperature
t_incub_disp = t_incub;
t_incub = read_temperature();
t_incub_N = 1;
}
}
void analogIn()
{
a_Poti = read_AnalogIn();
}
float read_temperature()
{
float A = 0;
for (int i=0 ; i < 10 ; i++)
A += analogRead(temp_sen);
A /= 10;
return (A/1023.*3300 - 600)/10;
}
float read_AnalogIn()
{
float A = 0;
for (int i=0 ; i < 100 ; i++)
A += analogRead(poti_sen);
A /= 100;
return (A);
}
dusjagr's freq-measurement
Adding an oscillator 4093 circuit and measuring the frequency with the arduino, display the count on the 4-digit
/*
* (c) Fakufaku 2013
* This is the code for the homebrew incubator 'Fermento'
* This code is released under the CC-BY-SA 3.0 License.
* The part of the code that's used for the display on the 7-segment was ripped off the BigTime code from Nathan Seidl. I owe him a beer then.
*/
#include <math.h>
#include <PID_v1.h>
#define TRUE 1
#define FALSE 0
//Careful messing with the system color, you can damage the display if
//you assign the wrong color. If you're in doubt, set it to red and load the code,
//then see what the color is.
#define RED 1
#define GREEN 2
#define BLUE 3
#define YELLOW 4
int systemColor = RED;
int display_brightness = 15000; //A larger number makes the display more dim. This is set correctly below.
// slow continuous PWM variables
#define PWM_MS 50 // this changes the update speed
#define PWM_MIN 100
#define RELAY_ON LOW
#define RELAY_OFF HIGH
// PID loop parameter
#define PID_KP 50
#define PID_KI 1
#define PID_KD 1
// Some display related parameters (time in seconds, temperature in degrees Celsius)
#define TIME_INCREMENT 1800
#define MAX_TIME 356459
#define TEMP_INCREMENT 1
#define MAX_TEMP 65
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Uncomment following line for the homebrew (1-sided) PCB version
//#define FERMENTO_1SIDE
#define FERMENTO_DUSJAGR
//Pin definitions
#ifdef FERMENTO_DUSJAGR
int digit1 = 13; //Display pin 12
int digit2 = 10; //Display pin 9
int digit3 = 9; //Display pin 8
int digit4 = 7; //Display pin 6
int segA = 12; //Display pin 11
int segB = 8; //Display pin 7
int segC = 5; //Display pin 4
int segD = 3; //Display pin 2
int segE = 2; //Display pin 1
int segF = 11; //Display pin 10
int segG = 6; //Display pin 5
int colons = 4; //Display pin 3
int temp_sen = A5; // to read the temperature sensor
int poti_sen = A4; // to read the temperature sensor
int pinInt = A5;
uint8_t input = 0;
uint8_t inputNext = 0;
uint16_t count = 0;
uint16_t countTMP = 0;
uint8_t countHB = 0;
uint8_t countLB = 0;
uint16_t countSQ = 0;
int averaging = 1;
const static int buzz = A2;
const static int theButton = A1;
const static int theButton2 = A0;
const static int pwm_pin = A3; // Pin 4
// The interrupt of button1 is on external interrupt 0
// The interrupt of button2 is on external interrupt 1
#define BUTTON1_INT_VECT INT0_vect
#define BUTTON2_INT_VECT INT1_vect
#define BUTTONS_INT_SET() do \
{ \
EICRA = (1<<ISC11) + (1<<ISC01); /* falling edge */ \
EIMSK = (1<<INT1) + (1<<INT0); \
} \
while (0)
#else
// The interrupt of button1 is on external interrupt 0
// The interrupt of button2 is on PCINT13 (A5), on PCIE1.
#define BUTTON1_INT_VECT INT0_vect
#define BUTTON2_INT_VECT PCINT1_vect
#define BUTTONS_INT_SET() do \
{ \
EICRA = (1<<ISC01); /* falling edge */ \
EIMSK = (1<<INT0); \
PCICR = (1 << PCIE1); \
PCMSK1 = (1 << PCINT13); \
} \
while (0)
#endif
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Display status variable
#define TIME 1
#define TEMP 2
int display_status = TEMP;
int backoff = 0; // just a short backoff for when we switch the display between TIME/TEMP
#define BACKOFFTIME 2
char disp_str[4];
// Variable to keep track of PWM window
unsigned long windowStartTime;
// control variables for PID
double t_incub; // input to PID (temperature in incubator)
double t_incub_N; // number of samples in t_incub average
double pwm_duty; // output of PID
double t_set = 0; // set point (target temperature)
double a_Poti; // poti value
//Specify the links and initial tuning parameters
PID myPID(&t_incub, &pwm_duty, &t_set, PID_KP, PID_KI, PID_KD, DIRECT);
// display timer (freeze parameters to display for 2 seconds)
int t_incub_disp;
// Timer variables
unsigned long timer_seconds = 0;
//The very important 32.686kHz interrupt handler
SIGNAL(TIMER2_OVF_vect)
{
if (timer_seconds > 1)
{
timer_seconds--;
}
else if (timer_seconds == 1)
{
// reset timer
timer_seconds = 0;
// turn off by setting target temperature to zero
t_set = 0;
// Reset the PID
myPID.SetMode(MANUAL);
myPID.SetMode(AUTOMATIC);
}
// decrement backoff
if (backoff > 0)
backoff--;
}
//The interrupt occurs when you push the button
SIGNAL(BUTTON1_INT_VECT)
{
display_status = TEMP;
backoff = BACKOFFTIME;
}
SIGNAL(BUTTON2_INT_VECT)
{
display_status = TIME;
backoff = BACKOFFTIME;
}
void setup()
{
Serial.begin(9600);
// set ADC reference to 3.3V
analogReference(DEFAULT);
// initialize pwm drive pin, and turn it off
pinMode(pwm_pin, OUTPUT);
digitalWrite(pwm_pin, HIGH);
// initialize buzzer pin
pinMode(buzz, OUTPUT);
// initialize the buttons
pinMode(theButton, INPUT);
digitalWrite(theButton, HIGH); // pull-up
pinMode(theButton2, INPUT);
digitalWrite(theButton2, HIGH); // pull-up
BUTTONS_INT_SET();
//Setup TIMER2
TCCR2A = 0x00;
TCCR2B = (1<<CS22)|(1<<CS20); //Set CLK/128 or overflow interrupt every 1s
ASSR = (1<<AS2); //Enable asynchronous operation
TIMSK2 = (1<<TOIE2); //Enable the timer 2 interrupt
//These pins are used to control the display
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(digit1, OUTPUT);
pinMode(digit2, OUTPUT);
pinMode(digit3, OUTPUT);
pinMode(digit4, OUTPUT);
pinMode(colons, OUTPUT);
pinMode(pinInt, INPUT);
// setup PID stuff
myPID.SetOutputLimits(PWM_MIN-1, PWM_MS-PWM_MIN+1);
myPID.SetMode(AUTOMATIC);
myPID.SetSampleTime(PWM_MS);
windowStartTime = millis();
// initialize pwm
pwm_duty = 0; // off
t_incub = read_temperature();
t_incub_N = 1;
// initialize slow variables for display
t_incub_disp = t_incub;
}
void loop()
{
getFreq();
for(int c = 0 ; c < 1; c +=1) {
displayNumber(count, FALSE); //Each call takes about 8ms, display the colon
}
/*
Serial.print("sensor = " );
Serial.print(count);
Serial.print("\t output = ");
Serial.println(countSQ);
*/
}
// Simple PWM based on millis directly
void temperatureControl()
{
unsigned long now = millis();
// averaging over the whole 5 seconds
t_incub += (read_temperature() - t_incub)/(++t_incub_N);
if(now - windowStartTime > PWM_MS)
{
// compute new pwm value for that window
if (t_set != 0)
myPID.Compute();
// start a new relay window
windowStartTime = now;
// restart averaging of temperature
t_incub_disp = t_incub;
t_incub = read_temperature();
t_incub_N = 1;
}
}
void analogIn()
{
a_Poti = read_AnalogIn();
}
void getFreq()
{
countTMP = 0;
count = 0;
for(int c = 0 ; c < averaging; c +=1) {
countTMP = 0;
input = digitalRead(pinInt);
for (int16_t i = 0; i < 3000; i++){
inputNext = digitalRead(pinInt);
if(input != inputNext){
countTMP = countTMP + 1;
input=inputNext;
}
}
count = count + countTMP;
}
count = count / averaging;
}
* Routines to display on 7-segment *
/************************************/
/* Routines to display on 7-segment */
/************************************/
//Given 1022, we display "10:22"
//Each digit is displayed for ~2000us, and cycles through the 4 digits
//After running through the 4 numbers, the display is turned off
void displayNumber(int toDisplay, boolean displayColon)
{
#define DIGIT_ON LOW
#define DIGIT_OFF HIGH
for(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of time
switch(digit) {
case 1:
digitalWrite(digit1, DIGIT_ON);
digitalWrite(colons, LOW);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(colons, LOW);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
if(displayColon == TRUE)
digitalWrite(colons, HIGH); //When we update digit 2, let's turn on colons as well
else
digitalWrite(colons, LOW);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(colons, LOW);
break;
}
//Now display this digit
if (digit != 5)
{
if( (toDisplay/10 != 0) || (toDisplay % 10) != 0) // do not display leading zeros
lightNumber(toDisplay % 10); //Turn on the right segments for this digit
toDisplay /= 10;
}
else
{
// lightNumber(0);
}
delayMicroseconds(2000); //Display this digit for a fraction of a second (between 1us and 5000us, 500-2000 is pretty good)
//If you set this too long, the display will start to flicker. Set it to 25000 for some fun.
//Turn off all segments
lightNumber(10);
//Turn off all digits
digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
digitalWrite(colons, DIGIT_OFF);
//digitalWrite(ampm, DIGIT_OFF);
}
}
//Takes a string like "gren" and displays it, left justified
//We don't use the colons, or AMPM dot, so they are turned off
void displayLetters(char * colorName)
{
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
digitalWrite(digit4, DIGIT_ON);
digitalWrite(colons, DIGIT_OFF);
//digitalWrite(ampm, DIGIT_OFF);
for(int digit = 0 ; digit < 4 ; digit++) {
//Turn on a digit for a short amount of time
switch(digit) {
case 0:
digitalWrite(digit1, DIGIT_ON);
break;
case 1:
digitalWrite(digit2, DIGIT_ON);
break;
case 2:
digitalWrite(digit3, DIGIT_ON);
break;
case 3:
digitalWrite(digit4, DIGIT_ON);
break;
}
//Now display this letter
lightNumber(colorName[digit]); //Turn on the right segments for this letter
delayMicroseconds(2000); //Display this digit for a fraction of a second (between 1us and 5000us, 500-2000 is pretty good)
//If you set this too long, the display will start to flicker. Set it to 25000 for some fun.
//Turn off all segments
lightNumber(10);
//Turn off all digits
digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
}
}
//Given a number, turns on those segments
//If number == 10, then turn off all segments
void lightNumber(int numberToDisplay)
{
#define SEGMENT_ON HIGH
#define SEGMENT_OFF LOW
/*
Segments
- A
F / / B
- G
E / / C
- D
*/
switch (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);
break;
case 1:
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
break;
case 2:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 3:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 4:
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 5:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 6:
digitalWrite(segA, SEGMENT_ON);
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);
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(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 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;
/*
Segments
- A
F / / B
- G
E / / C
- D
*/
//Letters
case 'b': //cdefg
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 'L': //def
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
break;
case 'u': //cde
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
break;
case 'g': //abcdfg
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 'r': //eg
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 'n': //ceg
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
//case r
case 'e': //adefg
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 'd': //bcdeg
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case ' ': //None
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;
case 'y': //bcdfg
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 'U': //bcdfg
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
break;
case 'C': //bcdfg
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
break;
case 'O': //bcdfg
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
break;
case 'K': //bcdfg
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
//case e
//case L
case 'o': //cdeg
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 'º': // abfg
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
}
}