|
|
Line 3: |
Line 3: |
| == dusjagr's simple version 4-digit display == | | == dusjagr's simple version 4-digit display == |
| | | |
− | <syntaxhighlight lang="c">
| + | i put them on the moment [http://wiki.sgmk-ssam.ch/index.php/Fermento_Mods here] |
− | | |
− | /*
| |
− | * (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>
| |