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-2024 
*/

// 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.



Categorie menu

Copyright 2024 www.punthooft.nl
We do not collect cookies for advertisement. Your data is never send to third parties.