ArduinoNixie Tellen
Op de vorige pagina kun je lezen hoe je de nixie buis moet aansluiten, inbranden en eiken. De eik waarden hebben we bewaard in de variabelen 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 ge-eikt. Nu moeten we die waarden gaan gebruiken.
Met een (1) buis gaan we de waarden van 0 tot en met 9 tonen. Als we immers de waarde 0 willen tonen, dan moet de brightness in de tube op brightness waarde 21 staan. Als we de waarde 9 willen tonen, dan moet de buis de maximale brightness waarde van 175 weergeven.
Als we getallen van 10 tot en met 99 willen tonen, dan moeten we ook de andere buis gebruiken. Daarin staan dan de 10-tallen. Dat laat ik in de uitleg even links liggen, de code gebruikt wel de 2e buis. Daar ga ik even vanuit dat beide dezelfde inbrandkenmerken hebben.
Start waarde = 21 (TUBEBOTTOM) Eind waarde = 175 (TUBECEILING) 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))
We hebben deze logica omgezet in een formule. Daarin zit de startwaarde van de brightness TUBEBOTTOM, de uitgerekende factor en natuurlijk de waarde die we willen tonen. In formule is de brigtness dus:
brightness = startwaarde + (te-tonen-waarde * factor) brightness = 21 + (te-tonen-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 staan 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-2023 */ // 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.
