Graag feedback op een oplossing die ik gemaakt hebt voor een YT cursus

Wanneer je dat doet, ga je dus telkens de gehele zone wissen, en krijg je mogelijk weer een knipperende weergave.
Maar ook doe je dan meer dure handelingen naar je scherm dan noodzakelijk.
Kun je hier wat mee ?

Als je dit volgt, kun je dan bedenken wat elke actie moet zijn ?
Deze acties zijn zo goed als hetzelfde.

Dan denk ik aan dit :

#include "DHT.h"
#include "LiquidCrystal.h"

#define DHTPIN 2
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal LCD(12, 8, A5, A4, A3, A2);

float temp;
float humidity;

float oldTemp = NAN;
float oldHumidity = NAN;

unsigned long lastRead = 0;
const unsigned long interval = 2000;

void setup() {
  Serial.begin(9600);
  dht.begin();
  LCD.begin(16, 2);

  LCD.print("DHT22 Monitor");
  delay(1000);
  LCD.clear();

  // Colon aligned to column 8
  LCD.setCursor(0,0);
  LCD.print("Temp    :");   // Temp + 4 spaces + :

  LCD.setCursor(0,1);
  LCD.print("Humidity:");   // Already ends at colon in col 8
}

void loop() {
  if (millis() - lastRead >= interval) {
    lastRead = millis();
    readSensor();
    displayData();
  }
}

void readSensor() {
  temp = dht.readTemperature();
  humidity = dht.readHumidity();

  if (isnan(temp) || isnan(humidity)) {
    LCD.clear();
    LCD.setCursor(0,0);
    LCD.print("Sensor Error!");
  }
}

void displayData() {

  // ---- Temperature ----
  if (temp != oldTemp) {
    LCD.setCursor(10, 0);        // numbers aligned
    
    if (temp < 0) {
      if (temp < -10)
            LCD.print("     ");
      } else {
          LCD.print("    ");  
    }

  if (temp >= 10) {
      LCD.print("    "); 
 } 
 
if (temp < 10) {
   LCD.print("   "); 
}

  

     LCD.write(223);
    LCD.print("C");

    oldTemp = temp;
  }

}

of misschien deze oplossing waar ik probeer alleen spaces te zetten wanneer ik ze nodig heb,

#include "DHT.h"
#include "LiquidCrystal.h"

#define DHTPIN 2
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal LCD(12, 8, A5, A4, A3, A2);

float temp;
float humidity;

float oldTemp = NAN;
float oldHumidity = NAN;

unsigned long lastRead = 0;
const unsigned long interval = 2000;

void setup() {
  Serial.begin(9600);
  dht.begin();
  LCD.begin(16, 2);

  LCD.print("DHT22 Monitor");
  delay(1000);
  LCD.clear();

  // Colon aligned to column 8
  LCD.setCursor(0, 0);
  LCD.print("Temp    :");  // Temp + 4 spaces + :

  LCD.setCursor(0, 1);
  LCD.print("Humidity:");  // Already ends at colon in col 8
}

void loop() {
  if (millis() - lastRead >= interval) {
    lastRead = millis();
    readSensor();
    displayData();
  }
}

void readSensor() {
  temp = dht.readTemperature();
  humidity = dht.readHumidity();

  if (isnan(temp) || isnan(humidity)) {
    LCD.clear();
    LCD.setCursor(0, 0);
    LCD.print("Sensor Error!");
  }
}

int numberOfSpaces(float number) {

  if (number < 0) {
    if (number < -10)
      return 4;
  } else {
    return 3;
  }

  if (number >= 10) {
    return 4;
  }

  if (number < 10) {
    return 3;
  }

  return 0; 
}


void displayData() {

  int spaces; 
    // ---- Temperature ----
  if (temp != oldTemp) {
    LCD.setCursor(10, 0);  // numbers aligned

   // print getal 
    LCD.print(temp);

    spaces = 4 -  numberOfSpaces(temp);

    // display spaces to fill the rest in 
    for (uint8_t cnt = 0; cnt < spaces; cnt++) {
      LCD.print(" ");
    }

    LCD.write(223);
    LCD.print("C");

    oldTemp = temp;
  }
}

Jouw antwoorden zijn stukken code.
Ik vroeg om het eens te bekijken zonder er meteen code van te maken, en er dan over te vertellen wat je bedacht hebt.
Wat ik daarmee wil bereiken, is dat je langer (hopelijk beter) nadenkt voor je werkelijk iets gaat bouwen of coderen.
Wist je dat je ook codes kunt maken met behulp van flowcharts zoals die in mijn vorige post ?

De flowchart die daar staat is daarom ook al bijna de code die je zou kunnen maken, en dat is iets heel anders als wat je in jouw laatste 2 antwoorden hebt gemaakt.
Ik heb wel bewust niet alles uitgeschreven, weer om jou aan het denken te zetten.

In jouw laatst geplaatste antwoord, gaat volgens mij nog iets fout met negatieve getallen.
Verder sla je wel stappen over waardoor je geen rekening houdt met nog grotere getallen en/of te grote getallen, maar ik weet ook niet in welke orde van grootte die getallen kunnen zitten.
Ik zie ook dat je er een eigen functie van gemaakt hebt, maar ik vraag me af of dat noodzakelijk is.
Mijn persoonlijke voorkeur zou dat niet hebben.

ik heb de flowchart die jij gemaakt hebt ook als voorbeeld gebruikt , alleen de getallen verandert omdat sommige gevallen niet voorkomen.

IK heb er ook een aparte functie van gemaakt omdat ik zie dat de getallen voor de temperatuur en voor de luchtvochtigheid eigenlijk hetzelfde aantal spaties nodig hebben om weer te verdwijnen.

En om het flikkeren weg te halen, lijkt me een idee om wat overschreven gaat worden, niet te overschrijven met spaties en wel het gebied dat overblijft.

Wil je dan graag een flowchart van wat ik bedacht hebt.

Voor ik het vergeet,

De temperaturen van deze sensor gaan van -40 tot 80 graden en de luchtvochtigheid gaat van 0 tot 100.

Vindt het heel lastig om steeds te "gokken" wat jij of sterretje precies van me willen.

en ik had al dit schema gemaakt :

getal                            grootte           aantal spaties nodig 

-40.0                              5                         0
- 4.0                              4                         1 
0.0                                3                         2
4.0                                3                         2
10.0                               4                        1

dus dan wordt deze functie :

int numberOfSpaces(float number) {

  if (number < 0) {
    if (number < -10)
      return 0;
  } else {
    return 1;
  }

  if (number >= 10) {
    return 1;
  }

  if (number < 10) {
    return 2;
  }

  return 0; 
}

en deze code lijkt te doen wat ik verwacht :

#include "DHT.h"
#include "LiquidCrystal.h"

#define DHTPIN 2
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal LCD(12, 8, A5, A4, A3, A2);

float temp;
float humidity;

float oldTemp = NAN;
float oldHumidity = NAN;

unsigned long lastRead = 0;
const unsigned long interval = 2000;

void setup() {
  Serial.begin(9600);
  dht.begin();
  LCD.begin(16, 2);

  LCD.print("DHT22 Monitor");
  delay(1000);
  LCD.clear();

  // Colon aligned to column 8
  LCD.setCursor(0, 0);
  LCD.print("Temp    :");  // Temp + 4 spaces + :

  LCD.setCursor(0, 1);
  LCD.print("Humidity:");  // Already ends at colon in col 8
}

void loop() {
  if (millis() - lastRead >= interval) {
    lastRead = millis();
    readSensor();
    displayData();
  }
}

void readSensor() {
  temp = dht.readTemperature();
  humidity = dht.readHumidity();

  if (isnan(temp) || isnan(humidity)) {
    LCD.clear();
    LCD.setCursor(0, 0);
    LCD.print("Sensor Error!");
  }
}

int numberOfSpaces(float number) {

  if (number < 0) {
    if (number < -10)
      return 0 ;
  } else {
    return 1;
  }

  if (number >= 10) {
    return 1;
  }

  if (number < 10 && number > 0) {
    return 1;
  }

  return 0; 
}


void displayData() {

  int spaces; 
    // ---- Temperature ----
  if (temp != oldTemp) {
    LCD.setCursor(10, 0);  // numbers aligned

   // print getal 
    LCD.print(temp);

    spaces = numberOfSpaces(temp);

    LCD.write(223);
    LCD.print("C");

    // display spaces to fill the rest in 
    for (uint8_t cnt = 0; cnt <= spaces; cnt++) {
      LCD.print(" ");
    }


    oldTemp = temp;

    
  }
}

dus als het anders is dan jullie verwachten, graag uitleg waarom en geen 'losse` hints naar me toesturen omdat dat voor mij niet werkt.

Ik denk dat dat niet helemaal waar is. Ik heb dit topic slechts losjes gevolgd; als ik het goed begrijp wil je alleen de actuele data verversen en zat je vast met het feit dat er af een toe wat achterblijft. Dit probeer je op te lossen door het aantal benodigde spaties te tellen.

De tabel in bericht 26 geeft aan dat je 0, 1 of 2 spaties nodig hebt. Echter de code in bericht 27 geeft nooit het getal 2 terug.

Het onderstaande programma is een gemodificeerde versie van jouw programma om te demonstreren wat er fout gaat.

float temp = -50.3;
float oldTemp = NAN;

void setup()
{
  Serial.begin(115200);
  displayData();

  for (uint8_t cnt = 0; cnt < 10; cnt++)
  {
    temp += 10;
    displayData();
  }
}

void loop()
{
}



int numberOfSpaces(float number)
{

  if (number < 0)
  {
    if (number < -10)
      return 0;
  }
  else
  {
    return 1;
  }

  if (number >= 10)
  {
    return 1;
  }

  if (number < 10 && number > 0)
  {
    return 1;
  }

  return 0;
}


void displayData()
{

  int spaces;
  // ---- Temperature ----
  if (temp != oldTemp)
  {
    //LCD.setCursor(10, 0);  // numbers aligned

    Serial.print("'");

    // print getal
    Serial.print(temp, 1);

    spaces = numberOfSpaces(temp);

    Serial.print(" ");
    Serial.print("C");

    // display spaces to fill the rest in
    for (uint8_t cnt = 0; cnt <= spaces; cnt++)
    {
      Serial.print(" ");
    }
    Serial.println("'");
    oldTemp = temp;
  }
}

Het gebruikt de seriële monitor in plaats van een LCD en de temperatuur die geprint wordt staat tussen enkele aanhalingstekens zodat de spaties gezien kunnen worden. Verder is het graden symbool verwijderd omdat de seriële monitor dat niet aan kan (ik heb er een spatie voor in de plaats gezet).

Het resultaat is

'-50.3 C '
'-40.3 C '
'-30.3 C '
'-20.3 C '
'-10.3 C '
'-0.3 C '
'9.7 C  '
'19.7 C  '
'29.7 C  '
'39.7 C  '
'49.7 C  '

Zoals je kunt zien zijn -0.3 en 9.7 iets minder wijd dan de andere getallen; ze missen een spatie.

oke

dat is voor mij niet zon probleem

Maar als ik word uitgedaagd om dit ook op te lossen , moet ik er even over nadenken hoe ik als het getal kleiner is dan -10 of 10 bij een positief getal er een spatie voor moet.

eerste idee is om dit te doen :

void displayData() {

  int spaces; 
    // ---- Temperature ----
  if (temp != oldTemp) {
    LCD.setCursor(10, 0);  // numbers aligned

   // print getal 
    for (uint8_t cnt= 0; cnt <=spaces; cnt++) {
      print(" "); 
   }

    LCD.print(temp);

    spaces = numberOfSpaces(temp);



    LCD.write(223);
    LCD.print("C");

    // display spaces to fill the rest in 
    for (uint8_t cnt = 0; cnt <= spaces; cnt++) {
      LCD.print(" ");
    }


    oldTemp = temp;

    
  }
}

Als dit werkt, zou ik hier ook weer een aparte functie van kunnen maken, omdat die twee keer gebruikt wordt.

Het idee werkt helaas niet.
Dus terug naar de tekentafel

Ik zie dus nu dit :

23
2627
{  {    if (number < -10)
$
false false
GND SIG VCC

'  -50.3 C '

'  -40.3 C '

'  -30.3 C '

'  -20.3 C '

'  -10.3 C '

'  -0.3 C '

'  9.7 C  '

'  19.7 C  '

'  29.7 C  '

'  39.7 C  '

'  49.7 C  '

Het idee werkt wel. Maar de implementatie werkt niet omdat je nooit 2 teruggeeft wanneer dat zou moeten.

Ik weet niet zeker waarom er in jouw uitvoer spaties staan voor het nummer.

hmm

het lijkt erop dat ik twee aparte functie's moet schrijven.
Een ervoor voor de spaties en een erna.

Sorry. wat is ook verander als getallen in de spatie functie. er verandert niks.

Heb dus totaal geen idee meer hoe dit te verbeteren

De onderstaande functie berekent het aantal spaties volgens de tabel in bericht 26.

int numberOfSpaces(float number)
{

  if (number <= -10)
  {
    return 0;
  }
  if (number <= 0)
  {
    return 1;
  }
  if (number < 10)
  {
    return 2;
  }
  if(number >= 10)
  {
    return 1;
  }

  return 0;
}

Nadat ik het aantal decimalen veranderd had naar 2 (zoals ook in jouw programma) is dit de uitvoer

'-50.30 C'
'-40.30 C'
'-30.30 C'
'-20.30 C'
'-10.30 C'
'-0.30 C '
'9.70 C  '
'19.70 C '
'29.70 C '
'39.70 C '
'49.70 C '

Het visuele verschil op het LCD scherm in wokwi is nul.

precies

en ik heb geen idee meer hoe dat op te lossen.

Het lijkt erop dat de spaties helemaal niet geprint worden.

Laatste code :

float temp = -50.3;
float oldTemp = NAN;

void setup()
{
  Serial.begin(115200);
  displayData();

  for (uint8_t cnt = 0; cnt < 10; cnt++)
  {
    temp += 10;
    displayData();
  }
}

void loop()
{
}



int numberOfSpaces(float number)
{

  if (number < 0)
  {
    if (number < -10)
      return 0;
  }
  else
  {
    return 0;
  }

  if (number >= 10)
  {
    return 0;
  }

  if (number < 10 && number > 0)
  {
    return 2;
  }

  return 0;
}


void displayData()
{

  int spaces;
  // ---- Temperature ----
  if (temp != oldTemp)
  {
    //LCD.setCursor(10, 0);  // numbers aligned

    Serial.print("'");

    spaces = numberOfSpaces(temp);

    for (uint8_t cnt = 0; cnt <= spaces ; cnt++)
    {
      Serial.print(" ");
    }

    // print getal
    Serial.print(temp, 1);

    

    Serial.print(" ");
    Serial.print("C");

    // display spaces to fill the rest in
    for (uint8_t cnt = 0; cnt <= spaces; cnt++)
    {
      Serial.print(" ");
    }
    Serial.println("'");
    oldTemp = temp;
  }
}

Krijg je niet het effect dat ik eerder toonde?

De C van de eerste regel wordt overschreven door de spatie van de tweede regel als het getal minder decimalen heeft en de C van de tweede regel door de eerste spatie op de derde regel.

Ik heb het denk ik opgelost.
Er zat een } fout in de spatie function

float temp = -50.3;
float oldTemp = NAN;

void setup()
{
  Serial.begin(115200);
  displayData();

  for (uint8_t cnt = 0; cnt < 10; cnt++)
  {
    temp += 10;
    displayData();
  }

}

void loop()
{
}



int numberOfSpaces(float number)
{

  if (number < 0) {
    if (number < -10){
      return 0;
    }
   else 
   {
    return 1;
  }
}

  if (number >= 10)
  {
    return 1;
  }

  if (number < 10 && number > 0)
  {
    return 2;
  }

  return 0;
}



void displayData()
{

  int spaces;
  // ---- Temperature ----
  if (temp != oldTemp)
  {
    //LCD.setCursor(10, 0);  // numbers aligned

    Serial.print("'");

    spaces = numberOfSpaces(temp);

    for (uint8_t cnt = 0; cnt <= spaces ; cnt++)
    {
      Serial.print(" ");
    }

    // print getal
    Serial.print(temp, 1);

    

    Serial.print(" ");
    Serial.print("C");

    Serial.println("'");
    oldTemp = temp;
  }
}

Deze code lijkt te werken.

' -50.3 C'

' -40.3 C'

' -30.3 C'

' -20.3 C'

' -10.3 C'

'  -0.3 C'

'   9.7 C'

'  19.7 C'

'  29.7 C'

'  39.7 C'

'  49.7 C'
1 Like

oke,

Dus ik kan deze als opgelost beschouwen of is er meer te leren ?

Zoals gezegd heb ik dit onderwerp niet echt gevolgd.

Je kunt een keer kijken hoe je dtostrf() kunt gebruiken om je float variabelen om te zetten naar een geformatteerde tekst; op die manier hoef je geen spaties te tellen.

oke,

de oplossing met spaties is hier te vinden : https://wokwi.com/projects/447268238706550785

Ik kan ook een variant maken met dtostrf() maar kreeg meer en meer het idee dat @MAS3 wilde dat ik spaties ga tellen.

Denk dat met dtostrf() de code een hoop simpler wordt.

En hier een variatie met dtostrf() : https://wokwi.com/projects/447805751575508993

Je print één spatie meer dan berekend is; is dat de bedoeling?