ArduinoNixie Tellen
Op de vorige pagina kun je lezen hoe je de nixie buiskunt eiken. Deze eik waarden staan in de variabel TUBEBOTTOM en TUBECEILING.
De buizen zijn aangesloten. En we gaan deze nu buizen gebruiken om te tellen. In de ene buis de een-tallen en in de andere buis de tien-tallen.
10 buis 1 buis Waarde 0 5 5 1 6 16 5 2 52 8 3 83
ArduinoRekenen
Maar voordat we de nixie buizen kunnen laten tellen, moeten we eerst zelf gaan tellen. In het vorige project hebben we de buisen geeikt. Nu moeten we die waarden gaan gebruiken.
Voor het tonen van de waarden 0 tot en met 9, waarbij de 0 op 21 brightness komt en de 9 op de 175 brightness, moeten we gaan rekenen.
Start waarde = 21 Eind waarde = 175 Stappen = 154 (eindwaarde - startwaarde ofwel 175-154=21) Waarden = 10 stuks (0/1/2/3/4/5/6/7/8/9) Factor = 15 (stappen / aantalwaarden = 154/10 = 15)
Factor is een heel getal (integer) en daar kunnen geen waarden achter de komma in, voor nu is dat niet erg. We zullen straks zien dat we door deze afronding een verschil krijgen van 4 puntjes. Te verwaarlozen.
Voor de waarde 0 moet de brightness 21 komen (21) Voor de waarde 1 moet de brightness 36 komen (21+15) Voor de waarde 2 moet de brightness 51 komen (21+15+15) Voor de waarde 3 moet de brightness 66 komen (21+15+15+15) Voor de waarde 4 moet de brightness 81 komen (21+15+15+15+15) ... Voor de waarde 10 moet de brightness 171 komen (21+(10 keer een 15)) In formule is de brigtness dus: brightness = startwaarde + (waarde *15)
In onderstaand script gebruiken we de 2 buizen los van elkaar. De ene buis telt van 0 tot en met 9. De andere buis telt de tientallen (0 tot en met 90).
Als deze buizen naast elkaar staat kun je op de linkerbuis aflezen 5 tientallen (=50) en op de rechterbuis 8. Samen dus 58.
ArduinoBreadboard
Zie beschrijving in het project De Nixie buis
ArduinoSource code
/* Nixie bargraph tubes (C) copyright www.punthooft.nl 2019 */ // Library #include <PWM.h> // Constants const int TUBE1 = 9; const int TUBE2 = 10; const int TUBEBOTTOM = 21; const int TUBECEILING = 175; // Variables int counter = 0; // Value of the counter int tubeMinValue = 0; // Minimal data value int tubeMaxValue = 9; // Maximum data value // Working variables int tubeSteps = 0; // Number of steps (see setup) int tubeFactor = 0; // Factor for calculation (see setup) int tube1Value = 0; // Calculated value (see loop) int tube2Value = 0; // Calculated value (see loop) int tube1Brightness = 0; // Calculated brightness (see loop) int tube2Brightness = 0; // Calculated brightness (see loop) int32_t frequency = 10000; //PWM frequency in Hz (10000 works fine) // Setup function runs once when powerup the board and on reset void setup() { Serial.begin(9600); // Initialize the timers InitTimersSafe(); // Initialise the PWM pins if(!SetPinFrequencySafe(TUBE1, frequency)) { Serial.println("Tube1 error"); while(1); } if(!SetPinFrequencySafe(TUBE2, frequency)) { Serial.println("Tube2 error"); while(1); } tubeSteps = tubeMaxValue - tubeMinValue; tubeFactor = (TUBECEILING - TUBEBOTTOM) / tubeSteps; paramprint("TUBEBOTTOM %d",TUBEBOTTOM); paramprint("TUBECEILING %d",TUBECEILING); paramprint("tubeSteps %d",tubeSteps); paramprint("tubeFactor %d",tubeFactor); } // The loop function runs over and over again forever void loop() { // Write the value to the monitor window in the IDE paramprint("counter %d", counter); // Calc the values for the tubes (0-9) tube1Value = counter / 10; tube2Value = counter % 10; // Calc the corresponding brightness for each tube tube1Brightness = TUBEBOTTOM + (tube1Value * tubeFactor); tube2Brightness = TUBEBOTTOM + (tube2Value * tubeFactor); // Write the values to the tube pwmWrite(TUBE1, tube1Brightness); pwmWrite(TUBE2, tube2Brightness); // Wait during the change delay(1000); // Add one and restart loop counter++; // Prevent overflow of brightness if (counter>99) { counter=0; } } void paramprint(char *formatString, int param) { char string[255]; sprintf(string, formatString,param); Serial.println(string); }
ArduinoOpmerkingen
Let op dat we hier niet tellen van 0 tot en met 10. Als we bij 9 zijn, dan gaan we immers verder door de waarde erboven een op te hogen en de telwaarde terug naar 0 te zetten! Om dezelfde reden tellen we in de code tot en met 99 en niet tot 100.
