Difference between revisions of "Fermento Modds Arduino Code"
(Created page with " == dusjagr's simple version 4-digit display == <syntaxhighlight lang="c"> /* * (c) Fakufaku 2013 * This is the code for the homebrew incubator 'Fermento' * This code is...") |
(→dusjagr's simple version 4-digit display) |
||
Line 294: | Line 294: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
== dusjagr's freq-measurement == | == dusjagr's freq-measurement == |
Revision as of 07:43, 27 March 2014
dusjagr's simple version 4-digit display
<syntaxhighlight lang="c">
/*
* (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);
}
</syntaxhighlight>
dusjagr's freq-measurement
Adding an oscillator 4093 circuit and measuring the frequency with the arduino, display the count on the 4-digit
<syntaxhighlight lang="c">
/*
* (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;
}
</syntaxhighlight>
* Routines to display on 7-segment *
<syntaxhighlight lang="c">
/************************************/
/* 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;
}
}
</syntaxhighlight>