Variabel uit up/down counter gebruiken

blackdog

Golden Member

Hi,

Ik ben bezig met een stukje software die in een Arduino Pro Micro komt te zitten.
Het geheel is zeer simpel, een up/down counter die loopt van 1 tot 7 en terug met beperking zodat je niet buiten de 1 en de 7 kan komen.

Deze regel stuurd de 7 uitgangen aan en werkt goed: digitalWrite(i + 3, (i == count_a) ? HIGH : LOW);

In het laatste stukje van de code die ik nu laat zien staan 7 stuks if/els regels die nu tekst naar de serieele monitor brengen.
Maar uiteindelijk is het de bedoeling een bepaalde tekst op het display te zetten aan de hand van de 1 t/m 7 counter stand.

Deze regel is de laatste poging die ik heb gedaan om de counterstand uit de teller functie te krijgen, en dat werkt dus niet => display_a = i;

Kan een van jullie mij uitleggen hoe get goed te doen en waarom het gene wat ik probeer niet werkt, dank!

c code:

void loop() {
  int count_aVal = 0;

  currentUpState_a = digitalRead(A0);                     // Lees de A0 ingang voor de Up pushbutton voor Current Range
  if (currentUpState_a != lastUpButtonState_a) {
    if ( currentUpState_a == LOW )
      count_aVal = 1;
    lastUpButtonState_a = currentUpState_a;
  }

  lcurrentDownState_a = digitalRead(A1);                  // Lees de A1 ingang voor de Down pushbutton voor Current Range
  if (lcurrentDownState_a != lastDownButtonState_a) {
    if ( lcurrentDownState_a == LOW )
      count_aVal = -1;
    lastDownButtonState_a = lcurrentDownState_a;
  }

  if (count_aVal) {
    count_a += count_aVal;
    count_a = constrain(count_a, 1, 7);

    for (int i = 1; i <= 7; i++) {                        // count_a wordt door contstrain beperkt tussen de aangegeven waarden (1 en 7)
    display_a = i;
      digitalWrite(i + 3, (i == count_a) ? HIGH : LOW);   // telt "1" op bijvariabele i en plaatst deze in de variabel count_a welke weer gebruiktwordt om de uitgang aan te sturen
    }
  }

if (display_a == 1) {
  Serial.println("1");
} else if (display_a == 2) {
  Serial.println("2");
} else if (display_a == 3) {
  Serial.println("3");
} else if (display_a == 4) {
  Serial.println("4");
} else if (display_a == 5) {
  Serial.println("5");
} else if (display_a == 6) {
  Serial.println("6");
} else if (display_a == 7) {
  Serial.println("7");
}

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

code:


    for (int i = 1; i <= 7; i++) {                        // count_a wordt door contstrain beperkt tussen de aangegeven waarden (1 en 7)
    display_a = i;
      digitalWrite(i + 3, (i == count_a) ? HIGH : LOW);   // telt "1" op bijvariabele i en plaatst deze in de variabel count_a welke weer gebruiktwordt om de uitgang aan te sturen
    }

i loopt hier van 1 t/m 7. En display_a loopt mee. Dus na afloop van de for-loop staat display_a altijd op 7. En dat wil je niet denk ik.

Eigenlijk heb je display_a niet nodig en kun je direct count_a uitlezen. Die heeft wel de goede waarde.

code:


   if (count_aVal) 
   {
      count_a += count_aVal;
      count_a = constrain(count_a, 1, 7);
 
      for (int i = 1; i <= 7; i++) 
      {  // count_a wordt door constrain beperkt tussen de aangegeven waarden (1 en 7)
         digitalWrite(i + 3, (i == count_a) ? HIGH : LOW);   // telt "1" op bijvariabele i en plaatst deze in de variabel count_a welke weer gebruiktwordt om de uitgang aan te sturen
      }

      Serial.println(count_a);
   }

De hele if struktuur aan het eind kan dan weg.

Arco

Special Member

De hele if struktuur aan het eind kan dan weg.

Dat lijkt me niet. Er moet een tekst worden weergegeven behorende bij een bepaalde count_a waarde, niet count_a zelf...
Wel zal het waarschijnlijk eenvoudiger kunnen...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ok, Dan wordt het zoiets:

code:


   if (count_aVal) 
   {
      count_a += count_aVal;
      count_a = constrain(count_a, 1, 7);
 
      for (int i = 1; i <= 7; i++) 
      {  // count_a wordt door constrain beperkt tussen de aangegeven waarden (1 en 7)
         digitalWrite(i + 3, (i == count_a) ? HIGH : LOW);   // telt "1" op bijvariabele i en plaatst deze in de variabel count_a welke weer gebruiktwordt om de uitgang aan te sturen
      }

      switch(count_a)
      {  case 1:  Serial.println("Pin D4 is hoog"); break; 
         case 2:  Serial.println("Pin D5 is hoog"); break;
         case 3:  Serial.println("Pin D6 is hoog"); break;
         case 4:  Serial.println("Pin D7 is hoog"); break;
         case 5:  Serial.println("Pin D8 is hoog"); break;
         case 6:  Serial.println("Pin D9 is hoog"); break;
         case 7:  Serial.println("Pin D10 is hoog"); break;
      }  
   }

Al kan het ook wel met een if construktie.

Ik heb de code wat aangepast naar mijn smaak:

c code:

void loop() {
  int count_aVal = 0;

  currentUpState_a = digitalRead(A0);                     // Lees de A0 ingang voor de Up pushbutton voor Current Range
  if (currentUpState_a != lastUpButtonState_a) {
    if ( currentUpState_a == LOW )
      count_aVal = 1;
    lastUpButtonState_a = currentUpState_a;
  }

  lcurrentDownState_a = digitalRead(A1);                  // Lees de A1 ingang voor de Down pushbutton voor Current Range
  if (lcurrentDownState_a != lastDownButtonState_a) {
    if ( lcurrentDownState_a == LOW )
      count_aVal = -1;
    lastDownButtonState_a = lcurrentDownState_a;
  }

  if (count_aVal) {
  
    count_a += count_aVal;
    count_a = constrain(count_a, 1, 7);

    for (int i = 1; i <= 7; i++) {                    
      digitalWrite(i + 3, LOW);   // We zetten lekker alles uit....
    }

    // Alles is nu uit en alleen de juiste waarde moet nu aan. Klinkt
    // wat "rigoreus" maar deze manier van programmeren maakt
    // je code veel robuuster en overzichtelijker. En het spaart 3 µs ledstroom :)

    digitalWrite(count_a + 3, HIGH);   // En alleen de teller 
    
    Serial.println("counter is nu: " + count_a ); // gewoon de variable 'printen'
  }

 delay(20ms);   // bounce delay.
  
}

Als je durft heb ik ook een interruptversie, wel op digitale pinnen (D1 en D2):

c code:


void setup() {
  ... doe hier ook je output voor pinnen 4 tot 11 denk ik. 
  pinMode(D1, INPUT_PULLUP);
  pinMode(D2, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(D1), countUp, FALLING);
  attachInterrupt(digitalPinToInterrupt(D2), countDown, FALLING);
}

void loop() {

   delay(2000); 
   Serial.println("counter is nu: " + count_a ); // gewoon de variable 'printen'

}

void countUp() {

    count_a++; 
    updateDisplay();
}

void countDown() {

    count_a--; 
    updateDisplay();
}

void updateDisplay() { 

    for (int i = 1; i <= 7; i++) {                    
      digitalWrite(i + 3, LOW);   // We zetten lekker alles uit....
    }

    count_a = constrain(count_a, 1, 7);
    digitalWrite(count_a + 3, HIGH);   // En alleen de teller aan
    Serial.println("counter is nu: " + count_a ); // gewoon de variable 'printen'
}





blackdog

Golden Member

Hi,

Dank vast voor alle input!
Ik heb het nu grotendeels werkend, het display doet wat het moet doen en loopt mooi mee met de status LED's.
De uitgangen waar de LED's op zitten moeten nog worden aangepast.
Deze krijgen een "puls" functie want er moeten 7 bipolaire relais worden aangestuurd en 1x een reset uitgang.
Bij iedere verandering van het bereik volgt er een reset puls an daarna worden de relais gepulsd die aan gezet moeten worden.
De code hiervoor heb ik al eens gebruikt in een ander project.

Het gaat hier trouwens om een PT100 Kalibrator in een 4 draads uitvoering.
Ik heb waarden gekozen die voor mij zinnig zijn, en dat is "0C", "25C", "40C", "45C", "50C", "75C" en "100C"
Per bereik gebruik ik 2x een bipolair relais die wat spoelen betreft parallel staan.

De relais worden aangestuurd met een puls van rond de 5mSec.
Ik breng voor de energie die nodig is voor de relais een dikke buffer elco aan via een weerstand,
zodat ik bij het omschakelen van 14 relais geen "brownout" krijg.

K7Jz
Ik heb gekeken of ik bij de Pro Micro de TX en de RX aansluiting kon gebruiken omdat daar interrupts aan hangen,
zover ik het heb gelezen en begrijp, kan dit niet standaard.

De rede dat ik daar naar gekeken had van het uitlezen van de temperatuur en de lucht vochtigheid,
dit vertraagde de reactie snelheid van de erste code die ik had gemaakt flink, zodat de up/down toetjes niet soepel meer reageerde.
Door de metingen voor temperatuur en luchtvogtigheid maar af en toe te doen en op verschillende tijden heb ik dit probleem niet meer en is er ook geen noodzaak meer voot het gebruik van interrupts.

Onderop staat ook nog een plaatje van het display.

De code, natuurlijk nog niet af!

c code:

#include <Wire.h>
#include <Arduino.h>
#include <U8g2lib.h>
#include "Adafruit_HDC1000.h"

//#include <ADC.h>


U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

Adafruit_HDC1000 hdc = Adafruit_HDC1000();


// Variabelen voor Up/Down Counter PT100 Kalibrator
int count_a = 1;                                        // counter for the number of button presses
int currentUpState_a = 0;                               // current state of the up button
int lastUpButtonState_a = 0;                            // previous state of the up button
int lcurrentDownState_a = 0;                            // current state of the down button
int lastDownButtonState_a = 0;                          // previous state of the down button


// Setup variable for temperature
unsigned long now_Temp;
unsigned long loopTime_Temp;

// Setup variable for Humidity
unsigned long now_Humid;
unsigned long loopTime_Humid;



void setup() {
  Serial.begin(9600);

  Serial.println("HDC100x test");

  if (!hdc.begin()) {
    Serial.println("Couldn't find sensor!");
    while (1);
  }


  u8g2.begin();

  // initialize input/output:
  pinMode(A0, INPUT);                                   // Up push button current
  pinMode(A1, INPUT);                                   // Down push button current

  for (int i = 4; i <= 10; i++) {
    pinMode(i, OUTPUT);
  }
  digitalWrite(4, HIGH);                                //Preset Power On, "0C" setting

  // Set boot message
  u8g2.clearBuffer();                                   // clear the internal memory
  u8g2.setFont(u8g2_font_6x12_mf);                   // choose a suitable font
  u8g2.drawStr(2, 25, "    ** NoiseAmp **");            // write something to the internal memory
  u8g2.drawStr(2, 50, "** PT100 Calibrator **");        // write something to the internal memory

  u8g2.sendBuffer();
  delay (3000);
  // Set boot message

  // Vaste tekst op het scherm
  u8g2.clearBuffer();                                  // clear the internal memory
  u8g2.setFont(u8g2_font_6x12_mf);                    // choose a suitable font
  u8g2.drawStr(16, 10, "Cal. Temperature");            // write something to the internal memory

  u8g2.setFont(u8g2_font_6x12_mf);                    // choose a suitable font
//  u8g2.drawStr(25, 64, "°");
  u8g2.drawStr(27, 64, "C");
  u8g2.drawStr(73, 64, "%");

  // Vaste tekst "R" waarde PT100 Sensor
  u8g2.setFont(u8g2_font_6x12_mf);                     // choose a suitable font
  u8g2.drawStr(18, 47, "R =");
  u8g2.drawStr(94, 47, "Ohm");
  // Vaste tekst "U" waarde batterij spanning
  u8g2.drawStr(120, 64, "V");
  u8g2.drawStr(95, 64, "3.18");


  u8g2.drawLine(0, 53, 128, 53);
  
  u8g2.sendBuffer();
}



void loop() {
  int count_aVal = 0;

  currentUpState_a = digitalRead(A0);                     // Lees de A0 ingang voor de Up pushbutton voor Current Range
  if (currentUpState_a != lastUpButtonState_a) {
    if ( currentUpState_a == LOW )
      count_aVal = 1;
    lastUpButtonState_a = currentUpState_a;
  }

  lcurrentDownState_a = digitalRead(A1);                  // Lees de A1 ingang voor de Down pushbutton voor Current Range
  if (lcurrentDownState_a != lastDownButtonState_a) {
    if ( lcurrentDownState_a == LOW )
      count_aVal = -1;
    lastDownButtonState_a = lcurrentDownState_a;
  }

  if (count_aVal) {
    count_a += count_aVal;
    count_a = constrain(count_a, 1, 7);

    for (int i = 1; i <= 7; i++) {                        // count_a wordt door contstrain beperkt tussen de aangegeven waarden (1 en 7)
      digitalWrite(i + 3, (i == count_a) ? HIGH : LOW);   // telt "1" op bijvariabele i en plaatst deze in de variabel count_a welke weer gebruiktwordt om de uitgang aan te sturen
    }
  }

  u8g2.setFont(u8g2_font_profont17_mf);                   // choose a suitable font

if (count_a == 1) {

  u8g2.drawStr(5, 30, "   " );
  u8g2.drawStr(31, 31, "0 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "100.0000" );

} else if (count_a == 2) {
  u8g2.setFont(u8g2_font_profont17_mf);
  u8g2.drawStr(22, 31, "25 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "109.7346" );
  
} else if (count_a == 3) {
  u8g2.setFont(u8g2_font_profont17_mf);
  u8g2.drawStr(22, 31, "40 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "115.5408" );
  
} else if (count_a == 4) {
  u8g2.setFont(u8g2_font_profont17_mf);
  u8g2.drawStr(22, 31, "42 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "116.3729" );
   
} else if (count_a == 5) {
  u8g2.setFont(u8g2_font_profont17_mf);
  u8g2.drawStr(22, 31, "50 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "119.3971" );
  
} else if (count_a == 6) {
  u8g2.setFont(u8g2_font_profont17_mf);
  u8g2.drawStr(5, 31, "          " );
  u8g2.drawStr(22, 31, "75 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "128.9874" );
  
} else if (count_a == 7) {
  u8g2.setFont(u8g2_font_profont17_mf);
  u8g2.drawStr(5, 31, "        " );
  u8g2.drawStr(13, 31, "100 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "138.5055" );
}


  // Start to measure temperature
  now_Temp = millis();
  if ((now_Temp - loopTime_Temp) > 2000) {                // Every 17 second sample temperature
    loopTime_Temp += 2000;                                // Update loopTime
    u8g2.setFont(u8g2_font_6x12_mf);                     // choose a suitable font
    u8g2.setCursor(2, 64);
    u8g2.print(hdc.readTemperature(), 1);                 // write Tempearture to the internal display memory
  }
  else
    // End measure temperature



    // Start to measure Humidity
    now_Humid = millis();
  if ((now_Humid - loopTime_Humid) > 13000) {            // Every 13 second sample temperature
    loopTime_Humid += 13000;                               // Update loopTime

    u8g2.setFont(u8g2_font_6x12_mf);                   // choose a suitable font
    u8g2.setCursor(48, 64);
    u8g2.print(hdc.readHumidity(), 1);                     // write Humidity to the internal memory
  }
  else
    // End measure Humidity


    u8g2.sendBuffer();

  delay (1);
}

Dit zijn twee plaatjes van mijn setup, het programmeren van de Pro Micro op mijn werkstation gaat langzaam maar bijna altijd goed.
Dit is het breadboard waarop het geheel getest word.
http://www.bramcam.nl/NA/NA-PT100-Kalibrator/NA-PT100-Kalibrator-01.png

Een Close Up van het display.
De onderste regel geeft de status van de temperatuur, luchtvochtigheid en de batterijspanning aan.
Daar boven de 42°C stand en de weerstand die bij deze temperatuur hoort van een perfecte PT100 sensor.
Mijn meetweerstanden zijn 0,1% en net iets te hoog in waarde, waarna ik de goede waarde trim d.m.v. een 25 slagen trimpot en een serie weerstand.
De serie weerstand en de trimpot vertegenwoordigen maar een paar procent van de gewenste waarde, dit verhoogt de stabiliteit.
http://www.bramcam.nl/NA/NA-PT100-Kalibrator/NA-PT100-Kalibrator-02.png

Ik start hier nog een apart topic over, dit meetinstrumentje gaat tot mijn meetinstrumentatium behoren om ondermeer oventjes goed te kunnen meten
zoals de bij de Reisreferentie enz.

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
blackdog

Golden Member

Hi,

Nu het volgende...
In de vergelijkingen (if/els) heb ik nu de relais drivers aangebracht, zie de code hieronder.
Her resultaat is dat de relais iedere loop worden aangestuurd, wat natuurlijk flink zal ratelen maar ook veel van mijn batterij energie zal verstoken.

Mijn vraag...
Kan ik voor ik de relais aanstuur, nog een keer een vergelijking doen, zodat als de counterwaarde niet is veranderd de relais niet worden aangestuurd?

De code

c code:

#include <Wire.h>
#include <Arduino.h>
#include <U8g2lib.h>
#include "Adafruit_HDC1000.h"

//#include <ADC.h>


U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

Adafruit_HDC1000 hdc = Adafruit_HDC1000();


// Variabelen voor Up/Down Counter PT100 Kalibrator
int count_a = 1;                                        // counter for the number of button presses
int currentUpState_a = 0;                               // current state of the up button
int lastUpButtonState_a = 0;                            // previous state of the up button
int lcurrentDownState_a = 0;                            // current state of the down button
int lastDownButtonState_a = 0;                          // previous state of the down button


// Setup variable for temperature measurement
unsigned long now_Temp;
unsigned long loopTime_Temp;

// Setup variable for ADC conversion
unsigned long now_Humid;
unsigned long loopTime_Humid;

// Setup variable for timing relais driver puls
byte resetPuls = 5;                                    // Time in mSec for Reset Puls
byte wait_2 = 2;                                       // Get Stable, Delay
byte on_Puls_5 = 5;                                    // Relais timing 5mSec ("On" time for "Set" coil of the relais )



void setup() {

// Power On Preset relay
  digitalWrite(21, HIGH);                              // Start reset puls
  delay(resetPuls);                                    // "resetPulse" defines the time how long the relay "reset coil" gets drive current (here 5 mSec)
  digitalWrite(21, LOW);                               // Stop reset puls  


  Serial.println("HDC100x test");

  if (!hdc.begin()) {
    Serial.println("Couldn't find sensor!");
    while (1);
  }


  u8g2.begin();

  // initialize input/output:
  pinMode(A0, INPUT);                                   // Up push button current
  pinMode(A1, INPUT);                                   // Down push button current

  for (int i = 4; i <= 10; i++) {
    pinMode(i, OUTPUT);
  }
  digitalWrite(4, HIGH);                                //Preset Power On, "0C" setting

  // Set boot message
  u8g2.clearBuffer();                                   // clear the internal memory
  u8g2.setFont(u8g2_font_6x12_mf);                      // choose a suitable font
  u8g2.drawStr(2, 25, "    ** NoiseAmp **");            // write something to the internal memory
  u8g2.drawStr(2, 50, "** PT100 Calibrator **");        // write something to the internal memory

  u8g2.sendBuffer();
  delay (3000);
  // Set boot message

  // Vaste tekst op het scherm
  u8g2.clearBuffer();                                   // clear the internal memory
  u8g2.setFont(u8g2_font_6x12_mf);                      // choose a suitable font
  u8g2.drawStr(16, 10, "Cal. Temperature");             // write something to the internal memory

  u8g2.setFont(u8g2_font_6x12_mf);                      // choose a suitable font
//  u8g2.drawStr(25, 64, "°");
  u8g2.drawStr(27, 64, "C");
  u8g2.drawStr(73, 64, "%");

  // Vaste tekst "R" waarde PT100 Sensor
  u8g2.setFont(u8g2_font_6x12_mf);                      // choose a suitable font
  u8g2.drawStr(18, 47, "R =");
  u8g2.drawStr(94, 47, "Ohm");

  // Vaste tekst "U" waarde batterij spanning
  u8g2.drawStr(120, 64, "V");
  u8g2.drawStr(95, 64, "3.18");


  u8g2.drawLine(0, 53, 128, 53);
  
  u8g2.sendBuffer();
}



void loop() {
  int count_aVal = 0;

  currentUpState_a = digitalRead(A0);                     // Lees de A0 ingang voor de Up pushbutton voor Current Range
  if (currentUpState_a != lastUpButtonState_a) {
    if ( currentUpState_a == LOW )
      count_aVal = 1;
    lastUpButtonState_a = currentUpState_a;
  }

  lcurrentDownState_a = digitalRead(A1);                  // Lees de A1 ingang voor de Down pushbutton voor Current Range
  if (lcurrentDownState_a != lastDownButtonState_a) {
    if ( lcurrentDownState_a == LOW )
      count_aVal = -1;
    lastDownButtonState_a = lcurrentDownState_a;
  }

  if (count_aVal) {
    count_a += count_aVal;
    count_a = constrain(count_a, 1, 7);

    for (int i = 1; i <= 7; i++) {                          // count_a wordt door contstrain beperkt tussen de aangegeven waarden (1 en 7)
//      digitalWrite(i + 3, (i == count_a) ? HIGH : LOW);   // telt "1" op bijvariabele i en plaatst deze in de variabel count_a welke weer gebruiktwordt om de uitgang aan te sturen
    }
  }

  u8g2.setFont(u8g2_font_profont17_mf);                     // choose a suitable font

if (count_a == 1) {
  u8g2.drawStr(5, 30, "   " );
  u8g2.drawStr(31, 31, "0 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "100.0000" );

  // Relais driver "0" Degrees
  digitalWrite(21, HIGH);                                // Start reset puls
  delay(resetPuls);                                      // "resetPulse" defines the time how long the relay "reset coil" gets drive current (here 5 mSec)
  digitalWrite(21, LOW);                                 // Stop reset puls  
  delay(wait_2);  
  digitalWrite(4, HIGH);                                 // Start set puls
  delay(on_Puls_5);                                      // 5mSec timing for Setpuls Relais-1a and Relais-1b
  digitalWrite(4, LOW);                                  // End set puls

} else if (count_a == 2) {
  u8g2.setFont(u8g2_font_profont17_mf);
  u8g2.drawStr(22, 31, "25 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "109.7346" );

  // Relais driver "25" Degrees
  digitalWrite(21, HIGH);                             // Start reset puls
  delay(resetPuls);                                   // "resetPulse" defines the time how long the relay "reset coil" gets drive current (here 5 mSec)
  digitalWrite(21, LOW);                              // Stop reset puls  
  delay(wait_2);  
  digitalWrite(5, HIGH);                              // Start set puls
  delay(on_Puls_5);                                   // 5mSec timing for Setpuls Relais-2a and Relais-2b
  digitalWrite(5, LOW);                               // End set puls
  
} else if (count_a == 3) {
  u8g2.setFont(u8g2_font_profont17_mf);
  u8g2.drawStr(22, 31, "40 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "115.5408" );

  // Relais driver "40" Degrees
  digitalWrite(21, HIGH);                             // Start reset puls
  delay(resetPuls);                                   // "resetPulse" defines the time how long the relay "reset coil" gets drive current (here 5 mSec)
  digitalWrite(21, LOW);                              // Stop reset puls  
  delay(wait_2);  
  digitalWrite(6, HIGH);                              // Start set puls
  delay(on_Puls_5);                                   // 5mSec timing for Setpuls Relais-3a and Relais-3b
  digitalWrite(6, LOW);                               // End set puls
  
} else if (count_a == 4) {
  u8g2.setFont(u8g2_font_profont17_mf);
  u8g2.drawStr(22, 31, "42 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "116.3729" );

  // Relais driver "42" Degrees
  digitalWrite(21, HIGH);                             // Start reset puls
  delay(resetPuls);                                   // "resetPulse" defines the time how long the relay "reset coil" gets drive current (here 5 mSec)
  digitalWrite(21, LOW);                              // Stop reset puls  
  delay(wait_2);  
  digitalWrite(7, HIGH);                              // Start set puls
  delay(on_Puls_5);                                   // 5mSec timing for Setpuls Relais-4a and Relais-4b
  digitalWrite(7, LOW);                               // End set puls
   
} else if (count_a == 5) {
  u8g2.setFont(u8g2_font_profont17_mf);
  u8g2.drawStr(22, 31, "50 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "119.3971" );

  // Relais driver "50" Degrees
  digitalWrite(21, HIGH);                             // Start reset puls
  delay(resetPuls);                                   // "resetPulse" defines the time how long the relay "reset coil" gets drive current (here 5 mSec)
  digitalWrite(21, LOW);                              // Stop reset puls  
  delay(wait_2);  
  digitalWrite(8, HIGH);                              // Start set puls
  delay(on_Puls_5);                                   // 5mSec timing for Setpuls Relais-5a and Relais-5b
  digitalWrite(8, LOW);                               // End set puls

  
} else if (count_a == 6) {
  u8g2.setFont(u8g2_font_profont17_mf);
  u8g2.drawStr(5, 31, "          " );
  u8g2.drawStr(22, 31, "75 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "128.9874" );

  // Relais driver "75" Degrees
  digitalWrite(21, HIGH);                             // Start reset puls
  delay(resetPuls);                                   // "resetPulse" defines the time how long the relay "reset coil" gets drive current (here 5 mSec)
  digitalWrite(21, LOW);                              // Stop reset puls  
  delay(wait_2);  
  digitalWrite(9, HIGH);                              // Start set puls
  delay(on_Puls_5);                                   // 5mSec timing for Setpuls Relais-6a and Relais-6b
  digitalWrite(9, LOW);                               // End set puls
  
} else if (count_a == 7) {
  u8g2.setFont(u8g2_font_profont17_mf);
  u8g2.drawStr(5, 31, "        " );
  u8g2.drawStr(13, 31, "100 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "138.5055" );

  // Relais driver "100" Degrees
  digitalWrite(21, HIGH);                             // Start reset puls
  delay(resetPuls);                                   // "resetPulse" defines the time how long the relay "reset coil" gets drive current (here 5 mSec)
  digitalWrite(21, LOW);                              // Stop reset puls  
  delay(wait_2);  
  digitalWrite(10, HIGH);                             // Start set puls
  delay(on_Puls_5);                                   // 5mSec timing for Setpuls Relais-7a and Relais-7b
  digitalWrite(10, LOW);                              // End set puls
}


  // Start to measure temperature
  now_Temp = millis();
  if ((now_Temp - loopTime_Temp) > 2000) {             // Every 17 second sample temperature
    loopTime_Temp += 2000;                             // Update loopTime
    u8g2.setFont(u8g2_font_6x12_mf);                   // choose a suitable font
    u8g2.setCursor(2, 64);
    u8g2.print(hdc.readTemperature(), 1);              // write Tempearture to the internal display memory
  }
  else
    // End measure temperature



    // Start to measure Humidity
    now_Humid = millis();
  if ((now_Humid - loopTime_Humid) > 13000) {            // Every 13 second sample temperature
    loopTime_Humid += 13000;                             // Update loopTime

    u8g2.setFont(u8g2_font_6x12_mf);                     // choose a suitable font
    u8g2.setCursor(48, 64);
    u8g2.print(hdc.readHumidity(), 1);                   // write Humidity to the internal memory

  }
  else
    // End measure Humidity


    u8g2.sendBuffer();

  delay (1);
}

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Ja, geen probleem. count_aVal blijft zijn waarde houden totdat je er iets anders in schrijft. Die kun je testen zovaak je wilt.

bijv:

code:


if (count_a == 1) 
{
  u8g2.drawStr(5, 30, "   " );
  u8g2.drawStr(31, 31, "0 Degrees" );
  u8g2.setFont(u8g2_font_6x12_mf);
  u8g2.drawStr(41, 47, "100.0000" );

  if (count_aVal)
  {    
     // Relais driver "0" Degrees
     digitalWrite(21, HIGH);                                // Start reset puls
     delay(resetPuls);                                      // "resetPulse" defines the time how long the relay "reset coil" gets    drive current (here 5 mSec)
     digitalWrite(21, LOW);                                 // Stop reset puls  
     delay(wait_2);  
     digitalWrite(4, HIGH);                                 // Start set puls
     delay(on_Puls_5);                                      // 5mSec timing for Setpuls Relais-1a and Relais-1b
     digitalWrite(4, LOW);                                  // End set puls
   } 
   ...
}

Dan wordt wel telkens het display ververst maar gaat het relais niet ratelen.

blackdog

Golden Member

Hi deKees,

Dat werkt!
Alleen begrijp ik niet hoe de vergelijking werk...

Kan je dit voort mij uitleggen?

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Je bedoelt de test op count_aVal denk ik?

code:


   if(test)
   {  // Code 1
   }
   else
   {  // Code 2
   }

Je weet dat een if statement het eerste blok alleen uitvoert als de conditie "test" true oplevert.

Hier gebruiken we count_aVal als conditie, en dat is een integer. C heeft daar geen probleem mee. Een integer is false als die de waarde 0 heeft, en true in alle andere gevallen. Zo werkt C nu eenmaal.

Aan het begin van de loop() wordt count_aVal op 0 gezet, en die wordt dus 'false'. Maar als je op een knopje drukt dan wordt die 1 of -1, en dus true.

Feitelijk is

code:


   if(count_aVal)

dus een afkorting voor

code:


   if(count_aVal != 0)

Overigens krijg je zo het ° symbool:

const char DEGREE_SYMBOL[] = { 0xB0, '\0' };

u8g2.setFont(u8g2_font_ncenB14_tf);
u8g2.drawUTF8(63, 35, DEGREE_SYMBOL);

Misschien werkt dit ook wel:

u8g2.drawUTF8(63, 35, "Het wordt 10 \xb0 C");
of
u8g2.drawStr(63, 35, "Het wordt 10 \xb0 C");

Ik zie ook wel drawGlyph genoemd, volgens mij uitwisselbaar met drawUTF8:

u8g2.drawGlyph(100,20,0x03a9); // grote Ω
u8g2.drawGlyph(100,20,0x02126); // kleine Ω
u8g2.drawGlyph(100,20,0x02103); // ? °C in één character

blackdog

Golden Member

Hi,

deKees,
Ja dat bedoelde ik, dit is een mooi stukje dat ook in een ander topic over C-Salade werd aangetipt.
Als je dus te weinig kennis hebt zoals ik en je gebruikt "if(count_aVal)" i.p.v. "if(count_aVal != 0)"
Krijg je dus dat de code voor zo iemand als ik, onbegrijpelijk wordt.

Maakt niet uit, ik weet het nu :-), dank!

K7Jz,
Dat heb je goed geregistreerd :-)
Al aardig zitten worstelen met lettertypen die de voorgaande tekst goed overschrijven en die ook de speciale tekens kan weergeven.
Daar was ik even mee gestopt, om nog wat andere software zaken eerst netjes te maken.

Ik ga jou voorbeeldjes proberen en laat je de resultaten hier zien.

Dank en groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
blackdog

Golden Member

Hi,

Het Ω teken gaat het niet worden...
De rede is de beperkte geheugenruimte in de microcontroler die ik gebruik en de grote van de Font librarys.

Ik kan er geen font library meer bijplaatsen.
Ik heb ook nog wat meer code nodig voor mijn batterij meet systeem met bijbehorende library.

Dus het blijft bij "Ohm" voor het weergeven van de weerstandswaarde.

Het °C is wel gelukt met het Fonttype dat ik gebruik en dit staat nu ook in de code.

Er komt dus nog een stroom/spannings sensor bij gebasseerdop een INA219 die de LiIon batterij status gaat aangeven.

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.