Hi,
Wat info voor een redelijk beeld waarmee ik bezig ben
Er lopen hier nog twee projectjes waar ik al lang geleden al eens mee was gestart maar door problemen was ik er mee gestopt.
Het gaat om twee meetkastjes waarop meerdere NTC kunen worden aangesloten, één kastje zal 8 aansluitingen hebben en de tweede vier NTC thermistors.
Het gebruik zal onderling wat anders zijn, de gene met 4x een NTC thermistor zal wneller moeten reageren dan de gene waar ik uiteindelijk de vraag over ga stelen, die doet alleen trage metingen.
Hieronder staat een plaatje dat ik gisteren en vandaag aan het indelen ben geweest, deze heeft dus acht meet ingangen en datum en tijd notatie, maar ook Lucht vochtigheid en luchtdruk.
Alle aangegeven waarde gaan uiteindelijk op een manier het lokale netwerk op en/of op een geheugen kaartje.
Misschien ook via USB naar een meetcomputer, Miedema wees mij vorige week op wat software die via USB kan loggen.
Nu het plaatje en dan de vraag, de indeling is nog niet optimaal, maar zeg 90% is al OK.
Een deel van de tekst wordt in de setup op het scherm geschreven, maar ik heb nog niet alles wat statisch, is naar het setup stukje verplaatst.
Het op het plaatje is het wegvallen de oorzaak van aliassing.
.
Op dit plaatje is goed te zien dat vooral de onderste twee regels het een en ander niet goed gaat.
Om Ghosting tegen te gaan overschrijf ik de variabe waarden zoals de tijd met een zwart kader die de oude waarde wist, dat werkt verder goed om Ghosting te onderdrukken.
Als we de LAB temepratuur nemen die hier als 20.91 wordt aangegeven dan kan ik vrij makkelijk controleren of deze variabel is veranderd, zo ja, dan kan deze waarde worden ververst.
Nemen we nu de datum en de tijd waarde, die variabelen kan ik volgens mij niet zomaar vergelijken ondat deze variabeleen speciale karakters in zich hebben, dit zijn het streepje - en de dubbele punt :
De Hum en de hPa kan ik zonder problemen oplossen en die veranderen ook niet zo veel, dit net als de uiteindelijke waarde die van de NTC thermistors komen voor de acht kanalen.
Nog wat info, de controler wordt een Teense of een b.v. een ESP32, moet ik nog beslissen, vooral om het deel van het loggen, via WiFi doen of geheugenkaartje.
De ADC die ik ga gebruikej heb ik wel al bepaald en dat wordt de ADS1115, ik leg nu nog even niet uit waarom, dat komt in een apart topic voor deze meetkastjes.
Hier de code, zeg versie V0.1 de hele ADC zit er nog niet in verwerkt en ook het loggen nog niet.
c code:
/***************************************************
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
MIT license, all text above must be included in any redistribution
****************************************************/
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>
#include "RTClib.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
RTC_DS3231 rtc;
Adafruit_BME280 bme; // I2C
unsigned long delayTime;
// Extra SPI pin configuratie
#define TFT_CS 10
#define TFT_RST 8
#define TFT_DC 9
// For 1.44" and 1.8" TFT with ST7735 (including HalloWing) use:
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
void setup(void) {
Serial.begin(9600);
bme.begin(0x76, &Wire);
rtc.begin();
tft.initR(INITR_144GREENTAB); // initialize a ST7735S chip, green tab
tft.setTextWrap(false); // Allow text to run off right edge
tft.fillScreen(ST77XX_BLACK);
tft.setSPISpeed(40000000);
tft.setRotation(3);
// BME280 Sensor settings
bme.setSampling(Adafruit_BME280::MODE_NORMAL,
Adafruit_BME280::SAMPLING_X2, // temperature
Adafruit_BME280::SAMPLING_X16, // pressure
Adafruit_BME280::SAMPLING_X1, // humidity
Adafruit_BME280::FILTER_X16,
Adafruit_BME280::STANDBY_MS_0_5 );
// vaste waarden op het display
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(5, 3);
tft.setTextSize(1);
tft.setTextColor(ST77XX_CYAN);
tft.print("Sensor-1 = ");
tft.setCursor(5, 14);
tft.setTextSize(1);
tft.setTextColor(ST77XX_RED);
tft.print("Sensor-2 = ");
tft.setCursor(5, 25);
tft.setTextSize(1);
tft.setTextColor(ST77XX_GREEN);
tft.print("Sensor-3 = ");
tft.setCursor(5, 36);
tft.setTextSize(1);
tft.setTextColor(ST77XX_YELLOW);
tft.print("Sensor-4 = ");
tft.setCursor(5, 47);
tft.setTextSize(1);
tft.setTextColor(ST77XX_CYAN);
tft.print("Sensor-5 = ");
tft.setCursor(5, 58);
tft.setTextSize(1);
tft.setTextColor(ST77XX_RED);
tft.print("Sensor-6 = ");
// Plaats het C karakter met punt op het display
tft.fillRect(103, 56, 2, 2, ST77XX_RED); // Graden circeltje
tft.setCursor(107, 56);
tft.print("C"); // "C" van de graden eenheid
tft.setCursor(5, 69);
tft.setTextSize(1);
tft.setTextColor(ST77XX_GREEN);
tft.print("Sensor-7 = ");
tft.setCursor(5, 80);
tft.setTextSize(1);
tft.setTextColor(ST77XX_YELLOW);
tft.print("Sensor-8 = ");
tft.setCursor(5, 92);
tft.setTextSize(1);
tft.setTextColor(ST77XX_GREEN);
tft.print("Hum:100%");
tft.setCursor(65, 92);
tft.setTextSize(1);
tft.setTextColor(ST77XX_GREEN);
tft.print("hPa: 1004");
tft.setCursor(5, 118);
tft.setTextSize(1);
tft.setTextColor(ST77XX_GREEN);
tft.print("LAB Temp = ");
tft.setCursor(1, 111);
// Plaats het C karakter met punt op het display
tft.fillRect(107, 118, 2, 2, ST77XX_GREEN); // Graden circeltje
tft.setCursor(110, 118);
tft.print("C"); // "C" van de graden eenheid
// Teken kader en lijnen
tft.drawRect(0, 0, 128, 128, ST77XX_CYAN);
tft.drawFastHLine(0, 89, 128, ST77XX_CYAN);
tft.drawFastHLine(0, 101, 128, ST77XX_CYAN);
tft.drawFastHLine(0, 115, 128, ST77XX_CYAN);
}
void loop(void) {
DateTime time = rtc.now();
tft.setCursor(70, 56);
tft.setTextSize(1);
tft.setTextColor(ST77XX_RED);
tft.print("103,2");
tft.setCursor(70, 67);
tft.setTextSize(1);
tft.setTextColor(ST77XX_GREEN);
tft.print("Blah");
tft.setCursor(70, 78);
tft.setTextSize(1);
tft.setTextColor(ST77XX_YELLOW);
tft.print("xxxxxxx");
// Overschrijf met zwart vierkant de oude datum en daarna de nieuwe datum op het scherm vanuit de DS3231 klok
tft.fillRect(4, 104, 60, 9, ST77XX_BLACK);
tft.setCursor(5, 105);
tft.setTextSize(1);
tft.setTextColor(ST77XX_GREEN);
tft.print(time.timestamp(DateTime::TIMESTAMP_DATE));
// Overschrijf met zwart vierkant de oude tijd en daarna de nieuwe tijd op het scherm vanuit de DS3231 klok
tft.fillRect(74, 104, 49, 9, ST77XX_BLACK);
tft.setCursor(75, 105);
tft.setTextSize(1);
tft.setTextColor(ST77XX_GREEN);
tft.print(time.timestamp(DateTime::TIMESTAMP_TIME));
// Overschrijf eerst met een zwart vierkant de oude temperatuur en daarna de nieuwe temperatuur uit de BME280 sensor
tft.fillRect(74, 117, 31, 9, ST77XX_BLACK);
tft.setCursor(75, 118);
tft.setTextSize(1);
tft.setTextColor(ST77XX_GREEN);
tft.print(bme.readTemperature());
// tft.fillRect(Begin Links Boven, Start Vanaf Boven, Lengte Kader, Hoogte Kader, ST77XX_CYAN);
// delay(50);
}
De vraag
Dus hoe los ik het flikkeren op, dat is de vraag, ik dacht dus de laatste waarde met de nieuwe waarde te vergelijken en dan alleen de waarde te updaten.
In de code is te zien dat ik het meeste Adafruit library's gebruik.
Het display is een 128x128 model 1.44-Inch SPI display.
Er staat mij iets bij dat er een font is die altijd de zelfde "real estate" of misschien in Nederlands de totale pixel ruimte, dus een 1 en een 8 nemen evenveel ruimte in.
Heb ik dat goed onthouden?
Hoe zouden jullie dit aanpakken om de flikkering te onderdrukken?
Bij de 8-kanaals versie denk ik aan 1 a 2 per seconde het updaten van de waarde en bij de tweede versie die meer 4 kanalen krijgt aan zeg 4x per seconde updaten voor de gemeten temperaturen.
Dank alvast weer voor de inzichten.
Groet,
Bram