KGE
Golden Member
Misschien is hier iets te vinden:
https://community.platformio.org/t/esp32-spi-clock-frequency-arduino-f…
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi KGE, 
Daar was ik net aan het lezen en ik wou wat proberen in de Arduino IDE 2.3.3.
Maar die laat dit nu niet toe, omdat hij steeds vast slaat op het bijwerken van de Teensy modellen, GFerfERtawERwe! 
Even die regel uit de settings halen voor Teensy en dan weer verder testen.
Dank en groet,
Bram
KGE
Golden Member
Op maandag 11 november 2024 11:49:19 schreef blackdog:
Hi KGE,Daar was ik net aan het lezen en ik wou wat proberen in de Arduino IDE 2.3.3.
Maar die laat dit nu niet toe, omdat hij steeds vast slaat op het bijwerken van de Teensy modellen, GFerfERtawERwe!
Even die regel uit de settings halen voor Teensy en dan weer verder testen.
Dank en groet,
Bram
Over Teensy gesproken, met een Teensy 4.0 heb ik aan een SPI TFT LCD 480x320 met 24 bit kleurdiepte snelheden tot 120 MHz in kunnen stellen.
De ESP32 is niet zo flexibel helaas maar ik zag 40 en 80 MHz dus daar moet wel meer uit te halen zijn.
Ik heb hier wel gespeeld met een ILI9341 TFT schermpje. Ook op SPI.
Die controller heeft een officiële max frequentie van 10 MHz, maar in de praktijk blijkt het ook op hogere frequenties wel te werken. 20MHz gaat zeker nog goed, daarboven krijg je soms problemen.
En het maakt wel uit welke data je stuurt. Een pixel is 16 bit kleur (5 + 6 + 5 bits). Maar om te bepalen welk pixel wordt aangestuurd moet je eerst een adres bereik selecteren. Daarmee kies je een rechthoek op het scherm dat je vervolgens met pixels kunt vullen. Voor het zetten van zo een rechthoek heb je 2 commando's nodig, samen 10 bytes. Plus 2 bytes voor elke pixel.
Dat werkt goed als je rechthoeken wilt vullen, zoals bijv een tekst veldje. Maar geeft veel overhead voor random pixels zoals bijv in schuine lijnen. Dat kost dan 12 bytes per pixel.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Vanmiddag een beetje lopen frutten met de Heltec Microcontroler met het display er op.
Het doel was om te zien wat er onder meer op past met bepaalde font groottes contrast en het weer ophalen/ervaring van de Adafruit GFX Library.
Hieronder een foto, die beter kan, maar deze geeft wel aan dat het formateren van de items weer een beetje aan het lukken is.
Ik heb ook hier een library gebruikt om lokaal verbinding te maken met de WiFi en dan via NTP de tijd op te halen.
De correcte tijd wordt dan geprogrammeerd in een DS3231 printje.
De ESP32 heeft zelf ook een 32K kristal, maar ik kon zo snel geen werkende code vinden.
Met het nu gebruikte printje dat ik vorige week zo precies mogelijk heb getuned op 32KHZ met wat software weet ik in ieder geval dat het goed is en blijft.
De software synct de DS3231, maar natuurlijk alleen als er een WiFi verbinding is.
Geen verbinding dan is er geen sync mogelijk en dan komt de tijd uit de gekalibreerde DS3231.
Dit is gewoon een stukje code dat ik later meer wil gaan gebruiken en hier is het nu toegepast om in het rood de tijd weer te geven.
Natuurlijk weer die vervelende shifting van de getallen van de klok weergave, hiervoor moet ik de code die ik als eens van jullie heb gekregen nog implementeren.

.
Dus dit plaatje is om even te laten zien dat ik de hulp waardeer. 
Groet,
Bram
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Ik ben bezig uit te zoeken hoe ik de tijd netjes op het beeldscherm geformatteerd krijg.
Dat hangt af ondermeer van de #include <DS3231.h> file.
Welke van de 4 stuks die ik in de library directory heb staan, gebruikt de Arduino IDE 2.3.3 nu eigenlijk?
Ik heb in de settings zitten zoeken van de IDE, maar ik kan niets vinden als er gecompileerd gaat worden en welke van de vier er dan gebruikt wordt.
Weten jullie hoe ik dit in beeld kan krijgen?
Dank en groet,
Bram
KGE
Golden Member
Op maandag 11 november 2024 18:55:42 schreef blackdog:
Hi,Ik ben bezig uit te zoeken hoe ik de tijd netjes op het beeldscherm geformatteerd krijg.
Dat hangt af ondermeer van de #include <DS3231.h> file.
Welke van de 4 stuks die ik in de library directory heb staan, gebruikt de Arduino IDE 2.3.3 nu eigenlijk?
Ik heb in de settings zitten zoeken van de IDE, maar ik kan niets vinden als er gecompileerd gaat worden en welke van de vier er dan gebruikt wordt.Weten jullie hoe ik dit in beeld kan krijgen?
Dank en groet,
Bram
Bij de libraries zitten vaak voorbeelden waar je kan zien hoe je dingen kunt doen. In de DS3231 library zit een voorbeeldje 'echo_time' waarin de tijd uitgelezen wordt en met Serialprint weergegeven wordt.
Je ziet daarin al hoe alle losse delen van de tijd (uren, minuten etc.) uitgevoerd worden. Je kunt dit wel omzetten naar print commando's voor jouw LCD.
Wat ook kan is met sprintf (= print to string with formatting) die tijdstukjes netjes aan elkaar rijgen tot één nieuwe string die je dan naar het LCD stuurt.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Ik heb een poginge gedaan om het "sprintf" commando te gebruiken, dat werkt nu niet.
Ik zal zeker het verkeerd toepassen, kunnen jullie mij even schoppen.
Het staat onder aan de loop, ik breng 2x de tijd in beeld de eerste keer met deze opbouw: tft.print(Clock.getHour(h12, PM), DEC); enz en dat werkt.
En de tweede keer probeer ik het met het "sprintf" commando, dat geeft dan dit in beeld 10:10:10 Que!
De code
/**************************************************************************
// Color definitions
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
**************************************************************************/
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
//---------
#include <TimeLib.h>
#include <NTPtimeESP.h>
#include <WiFiClient.h>
#include <DS3231.h>
#include <Wire.h>
//---------
//--------- Time config
DS3231 Clock;
DS3231 myRTC;
bool century = false;
bool h12Flag;
bool pmFlag;
const char* ssid = "BlagBlahBlah"; //SSID of your Wifi network: Change this
const char* password = "BlagBlahBlah"; //Wi-Fi Password: Change this
//**** NTP Server to use
const char* NTP_Server = "BlagBlahBlah"; // local Time Server
//**** Your time zone UTC related (floating point number)
#define TIME_ZONE 1.0f
NTPtime NTPch(NTP_Server);
strDateTime dateTime;
//****************************************************
//* SYNCRONIZE SYSTEM TIME with NTP SERVERS
//****************************************************
#define SEND_INTV 1
#define RECV_TIMEOUT 1
// --------------------------------------
// epochUnixNTP set the UNIX time
// number of seconds sice Jan 1 1970
// --------------------------------------
time_t epochUnixNTP()
{
Serial.println(">>>> TimeSync function called <<<<");
//**** BIG ISSUE: in case of poor connection, we risk to remain in this loop forever
NTPch.setSendInterval(SEND_INTV);
NTPch.setRecvTimeout(RECV_TIMEOUT);
do
{
dateTime = NTPch.getNTPtime(TIME_ZONE, 1);
delay(1);
}
while(!dateTime.valid);
Clock.setSecond(dateTime.second);
Clock.setMinute(dateTime.minute);
Clock.setClockMode(false); // set to 24h
//setClockMode(true); // set to 12h
Clock.setHour(dateTime.hour);
Clock.setYear(dateTime.year-2000);
Clock.setMonth(dateTime.month);
Clock.setDate(dateTime.day);
Clock.setDoW(dateTime.dayofWeek);
Serial.println(">>>> DS3231 sync'ed with NTP time <<<<");
Serial.print("NTP time : ");
NTPch.printDateTime(dateTime);
//set system time
setTime(dateTime.hour,dateTime.minute,dateTime.second,dateTime.day,dateTime.month,dateTime.year);
return 0;
}
//***********************************************************************
//* SSIDCONNECT
//***********************************************************************
void ssidConnect()
{
Serial.println(ssid);
Serial.println(password);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(700);
Serial.print(".");
}
Serial.println();
Serial.print(F("Connected to "));
Serial.println(ssid);
Serial.print(F("IP address: "));
Serial.println(WiFi.localIP());
}
//--------- End Time config
//Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
Adafruit_ST7789 tft = Adafruit_ST7789(39, 47, 48, 38, 40); // Heltec T190 gebruikt een ST7789 driver IC met deze SPI aansluitingen
int myDT = 0;
void setup(void) {
// ---------------------------------------------------------------------------------
bool i2c_found;
Serial.begin(115200); while (!Serial);
Serial.println("COM setup successful.");
delay(10);
WiFi.mode(WIFI_STA);
// connect to WiFi network
ssidConnect();
// Start the I2C interface
Wire.begin();
// Set time sync provider
setSyncProvider(epochUnixNTP); //set function to call when sync required
setSyncInterval(5); //every 60 seconds
//In the same moment you retrieve the time from the library, that function will look up whether it is time to sync the time.
//If you don't retrieve the time or if you do, but the syninterval has not yet passed, nothing will happen.
// display the time
Serial.print("DS3231 time: ");
PrintDS3231Time();
}
//***********************************************************************
//* Print DS3231 time
//***********************************************************************
bool Century=false;
bool h12;
bool PM;
void PrintDS3231Time(){
Serial.print((Clock.getYear()+2000), DEC);
Serial.print('-');
// then the month
Serial.print(Clock.getMonth(Century), DEC);
Serial.print('-');
// then the date
Serial.print(Clock.getDate(), DEC);
Serial.print('-');
// and the day of the week
Serial.print(Clock.getDoW(), DEC);
Serial.print(' ');
// Finally the hour, minute, and second
Serial.print(Clock.getHour(h12, PM), DEC);
Serial.print("H ");
Serial.print(Clock.getMinute(), DEC);
Serial.print("M ");
Serial.print(Clock.getSecond(), DEC);
Serial.print("S ");
// Add AM/PM indicator
if (h12) {
if (PM) {
Serial.print(" PM ");
} else {
Serial.print(" AM ");
}
} else {
Serial.print(" (24h) ");
}
// Display the temperature
Serial.print("T=");
Serial.print(Clock.getTemperature(), 2);
// Tell whether the time is (likely to be) valid
if (Clock.oscillatorCheck()) {
Serial.print(" O+");
} else {
Serial.print(" O-");
}
Serial.print('\n');
Serial.print('\n');
// ---------------------------------------------------------------------------------
// OR use this initializer (uncomment) if using a 1.9" 170x320 TFT:
tft.init(170, 320); // Init ST7789 170x320 voor Heltec T190 display
tft.setSPISpeed(300000000); // set SPI clock display
tft.setRotation(1); // Draait het display voor horizontaal gebruik
pinMode(7, OUTPUT); // Set de voeding voor het TFT display aan
digitalWrite(7, LOW);
pinMode(17, OUTPUT); // Maakt de PWM ingang voor de achtergrond verlichting "1"
digitalWrite(17, HIGH);
tft.fillScreen(0x0000); //tft.fillScreen(ST77XX_BLACK);
tft.drawRect(0, 0, 320, 170, 0x07E0); // Groen kader om display
tft.drawRect(6, 25, 305, 2, 0x07FF);
tft.drawRect(12, 35, 290, 2, 0xFFE0);
tft.drawRect(18, 45, 275, 2, 0xF800);
tft.setCursor(25, 70);
tft.setTextSize(3);
tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK);
tft.print("Circuits-Online");
// Geel kader om Circuits-Online
tft.drawRect(0, 0, 320, 170, 0x07E0);
tft.setCursor(25, 145);
tft.setTextSize(2);
tft.setTextColor(ST77XX_GREEN, ST77XX_BLUE);
tft.print(" Mijn dank is GROOT! ");
}
void loop() {
tft.setCursor(110, 115);
tft.setTextSize(2);
tft.setTextColor(ST77XX_RED, ST77XX_BLACK);
// delay(1);
// tft.print(myRTC.getHour(h12Flag, pmFlag), DEC); //24-hr
// tft.print(":");
// tft.print(myRTC.getMinute(), DEC);
// tft.print(":");
// tft.println(myRTC.getSecond(), DEC);
// Klok onderzijde zonder formatering
tft.print(Clock.getHour(h12, PM), DEC);
tft.print("-H ");
tft.print(Clock.getMinute(), DEC);
tft.print("-M ");
tft.print(Clock.getSecond(), DEC);
tft.print("-S ");
tft.drawRect(19, 65, 280, 34, 0xFFE0);
// Klok poging met formattering
tft.setTextSize(2);
tft.setCursor(5, 5);
// buffer voor tijdaanduiding
char tbuffer[30];
// set uren, minuten, seconden en dubbele punten in buffer
snprintf(tbuffer,30,"%02i:%02i:%02i",(Clock.getHour(h12, PM), DEC),(Clock.getMinute(), DEC),(Clock.getSecond(), DEC));
tft.print(tbuffer);
}
// -------------------------------------------------
Dus... hoe set ik de variabelen goed in de snprintf buffer?
Dank en groet,
Bram
Je print nu de waarde van DEC (= 10), en niet de tijd van de klok.
Probeer die laatste regel eens zo:
// set uren, minuten, seconden en dubbele punten in buffer
snprintf(tbuffer,30,"%02i:%02i:%02i", Clock.getHour(h12, PM),
Clock.getMinute(),
Clock.getSecond() );
tft.print(tbuffer);
PS, de ", DEC" zijn parameters van de oorspronkelijke Serial.print funktie. Die zijn hier niet van toepassing.
KGE
Golden Member
Ja dat is het vage aan Arduino.. de Strings...
Met een tussen 'string' variabele moet het wel lukken:
String tijd;
char tbuffer[30];
.... code die een char array buffer vult
tijd=String(tbuffer);
tft.print(tijd);
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Even de code zo aangepast zoals deKees het aangaf, en dit is het resultaat, links bovenaan het resultaat. 

.
Dank en groet,
Bram
@KGE : Dat heeft niks te maken met vage strings in Arduino, maar alles met eigenschappen van de compiler.
Met deze code als parameter :
(Clock.getHour(h12, PM), DEC)Dat zijn feitelijk 2 aparte parameters "Clock.getHour(h12, PM)" en "DEC" die door de haakjes en de comma tot een enkele parameter worden samengebonden. De laatste wordt dan de waarde van het geheel. Dus in dit geval DEC (=10).
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Ik ben wezen testen met een modernere telefoon, ook in de Pro modus maar geen mooier plaatje...
Toen mijn vriendin aar mooie camera en lens laten pakkken denk samen de prijs van ongeveer mijn Keithley 7510. 
En wat denken jullie, beter maar niet goed, zie het plaatje hieronder.
Het geeft wat beter de kleuren weer maar uit de hand is het niet scherp te krijgen, bij de huidige ligt condities is een statief nodig.
De onderste regel is nog steeds niet kleur correct, het rood gaat nu wel, maar in het echt spettert het van het schempje af.

.
Voor jullie info, deze T190 is nu voor iets minder dan 18 Euro te koop.
Er is ook een model met het zelfde TFT display maar geen LoRa voor iets van 12 Euro.
En dan nu het volgende onderdeel van deze Microcontroller proberen aan het werk te krijgen!
Groet,
Bram
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Aangezien dit toch al een verzamel topic is voor mijn programmeer onkunde *grin* het ik nog een vraag over millis.
Ik weet al lang dat er een limit is van iets meer dan 49 dagen.
Voor mij is die limmit van belang omdat de microcontroler een spannings referentie aanstuurd en deze maanden lang aan kan staan.
Nu dacht ik er aan omdat ik toch een DS3232 in het systeem heb( en NTP via WiFi) om b.v. het dagnummer te gebruiken om de microcontroler te resetten.
De meeste moderne microcontrolers starten snel op en dit zal verder geen noemenswaardige verandering geven in de oven temperatuur,
dit i.v.m. de thermische massa.
Ik zou b.v. op dag 1, 7, 14, 21 en 28 van de maand en dan om 00:00 een reset kunnen geven, b.v. zo in de code: resetFunc();
Als ik de reset buiten de microcontroler wil houden, dan kan ik ook de alarm uitgang van de DS3232 gebruiken hiervoor.
Dat met opset restarten voor de betrouwbaarheid doe ik ook regelmatig bij LTE Routers op iedere zondag van de week om ze "fris" te houden.
Als ik deze reset functie toepas, dan weet ik ook zeker dat via NTP de DS3232 weer goed op tijd wordt gezet.
Wat is jullie mening hierin, meenemend wat ik hierboven aangeef waarom ik het onder meer wil.
Dank en groet,
Bram
KGE
Golden Member
Zolang je de millis in unsigned 32 bits variabelen (uint_32t) houdt is er niets aan de hand, hij gaat na ongeveer 49 dagen over de kop maar daar merk je dan niets van tenzij je die waarde als absolute tijd wil gebruiken. (maar daar heb je de DS3232 voor)
De ESP32 heeft zelf ook een 64 bits timer:
The ESP32 uses a micro counter, esp_timer_get_time(), that is a uint64_t and rolls over after 200+ years.
De waarde (in absolute microseconden) kun je opvragen met:
uint_64t var = esp_timer_get_time();
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi KGE en anderen, 
Ik wil het resetten op een paar manieren kunnen doen, dus de "Boot Reset" op een ESP32 en later ook andere microcontrolers, dit is voor mij een leerproces .
Hieronder mijn probeer code waarvan ik nu drie manieren werkend heb.
Een echte watchdog schakeling die de loop timed, een stukje code die kijkt naar de datum en de tijd en deze vergelijkt met een voor geprogrammeerde waarde en als laatste een drukknop, als je deze langer dan een bepaalde waarde ingedrukt houd dan reset de ESP32 ook.
Ik heb geprobeerd de code in stukjes te hangen en dan deze appart in de loop aan te roepen.
De loop zelf is nu nog mooi schoon, voor mij een unicum. 
Even laten zien wat ik vanmiddag werkend heb gekregen.
Nog steeds met veel Serial prints er in, maar dat gooi ik er later wel uit.
Het gaat om het stukje van de void loop.
Deze functies moeten nog "getimed" worden, dat komt later, nu nog bezig met de alarm fucties uit te vogelen.
Print_tijd();
Print_bme();
Time_Reboot();
Wachthond();
.
/**************************************************************************
// Color definitions
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
**************************************************************************/
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
#include "esp_system.h"
#include "rom/ets_sys.h"
#include <TimeLib.h>
#include <NTPtimeESP.h>
#include <WiFiClient.h>
#include <DS3231.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C configuratie voor deze sensor
unsigned long delayTime;
// Nodig voor Watchdog
const int button = 21; // gpio pin to use to trigger delay via "User Button T190" voor het testen van de Watchdog
const int wdtTimeout = 1000; // time in ms to trigger the watchdog
hw_timer_t *timer = NULL;
void ARDUINO_ISR_ATTR resetModule() {
ets_printf("reboot\n");
esp_restart();
}
// Einde Watchdog settings
// Tijd eenheden variabele, wordt gebruikt voor klok gestuurde herstart microcontroler
int rd = 0; // Variabel voor dag waarde
int rh = 0; // Variabele voor de uur waarde
int rm = 0; // Variabele voor de minuut waarde
int rs = 0; // Variabele voor de seconden waarde
//---------
//---------
DS3231 Clock;
DS3231 myRTC;
bool century = false;
bool h12Flag;
bool pmFlag;
const char* ssid = "Hatseflast-Blah34"; //SSID of your Wifi network: Change this
const char* password = "huppleldepupskie"; //Wi-Fi Password: Change this
//**** NTP Server to use
const char* NTP_Server = "o.o.o.o"; // local Time Server
//**** Your time zone UTC related (floating point number)
#define TIME_ZONE 1.0f
NTPtime NTPch(NTP_Server);
strDateTime dateTime;
//****************************************************
//* SYNCRONIZE SYSTEM TIME with NTP SERVERS
//****************************************************
#define SEND_INTV 1
#define RECV_TIMEOUT 1
// --------------------------------------
// epochUnixNTP set the UNIX time
// number of seconds sice Jan 1 1970
// --------------------------------------
time_t epochUnixNTP()
{
Serial.println(">>>> TimeSync function called <<<<");
//**** BIG ISSUE: in case of poor connection, we risk to remain in this loop forever
NTPch.setSendInterval(SEND_INTV);
NTPch.setRecvTimeout(RECV_TIMEOUT);
do
{
dateTime = NTPch.getNTPtime(TIME_ZONE, 1);
delay(1);
}
while(!dateTime.valid);
Clock.setSecond(dateTime.second);
Clock.setMinute(dateTime.minute);
Clock.setClockMode(false); // set to 24h
//setClockMode(true); // set to 12h
Clock.setHour(dateTime.hour);
Clock.setYear(dateTime.year-2000);
Clock.setMonth(dateTime.month);
Clock.setDate(dateTime.day);
Clock.setDoW(dateTime.dayofWeek);
Serial.println(">>>> DS3231 sync'ed with NTP time <<<<");
Serial.print("NTP time : ");
NTPch.printDateTime(dateTime);
//set system time
setTime(dateTime.hour,dateTime.minute,dateTime.second,dateTime.day,dateTime.month,dateTime.year);
return 0;
}
//***********************************************************************
//* SSIDCONNECT
//***********************************************************************
void ssidConnect()
{
Serial.println(ssid);
Serial.println(password);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(700);
Serial.print(".");
}
Serial.println();
Serial.print(F("Connected to "));
Serial.println(ssid);
Serial.print(F("IP address: "));
Serial.println(WiFi.localIP());
}
//--------- End Time config
//Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
Adafruit_ST7789 tft = Adafruit_ST7789(39, 47, 48, 38, 40); // Heltec T190 gebruikt een ST7789 driver IC met deze SPI aansluitingen
int myDT = 0;
void setup(void) {
bool i2c_found;
Serial.begin(115200); while (!Serial);
Serial.println("COM setup successful.");
delay(10);
WiFi.mode(WIFI_STA);
// connect to WiFi network
ssidConnect();
// Start the I2C interface
Wire.begin();
// Set time sync provider
setSyncProvider(epochUnixNTP); //set function to call when sync required
setSyncInterval(5); //every 60 seconds
//In the same moment you retrieve the time from the library, that function will look up whether it is time to sync the time.
//If you don't retrieve the time or if you do, but the syninterval has not yet passed, nothing will happen.
// display the time
Serial.print("DS3231 time: ");
PrintDS3231Time();
}
//***********************************************************************
//* Print DS3231 time
//***********************************************************************
bool Century=false;
bool h12;
bool PM;
void PrintDS3231Time(){
Serial.print((Clock.getYear()+2000), DEC);
Serial.print('-');
// then the month
Serial.print(Clock.getMonth(Century), DEC);
Serial.print('-');
// then the date
Serial.print(Clock.getDate(), DEC);
Serial.print('-');
// and the day of the week
Serial.print(Clock.getDoW(), DEC);
Serial.print(' ');
// Finally the hour, minute, and second
Serial.print(Clock.getHour(h12, PM), DEC);
Serial.print("H ");
Serial.print(Clock.getMinute(), DEC);
Serial.print("M ");
Serial.print(Clock.getSecond(), DEC);
Serial.print("S ");
// Add AM/PM indicator
if (h12) {
if (PM) {
Serial.print(" PM ");
} else {
Serial.print(" AM ");
}
} else {
Serial.print(" (24h) ");
}
// Display the temperature
Serial.print("T=");
Serial.print(Clock.getTemperature(), 2);
// Tell whether the time is (likely to be) valid
if (Clock.oscillatorCheck()) {
Serial.print(" O+");
} else {
Serial.print(" O-");
}
Serial.print('\n');
Serial.print('\n');
// ---------------------------------------------------------------------------------
// Initializer using a 1.9" 170x320 TFT:
tft.init(170, 320); // Init ST7789 170x320 voor Heltec T190 display
tft.setSPISpeed(300000000); // set SPI clock display
tft.setRotation(1); // Draait het display voor horizontaal gebruik
pinMode(7, OUTPUT); // Set de voeding voor het TFT display aan
digitalWrite(7, LOW);
pinMode(17, OUTPUT); // Maakt de PWM ingang voor de achtergrond verlichting "1"
digitalWrite(17, HIGH);
tft.fillScreen(0x0000); //Maak de achtergrond zwart
tft.drawRect(0, 0, 320, 170, 0x07E0); // Groen kader op het display
tft.drawRect(6, 25, 305, 2, 0x07FF); //plaatst smal kader op het display
tft.drawRect(12, 35, 290, 2, 0xFFE0); //plaatst smal kader op het display
tft.drawRect(18, 45, 275, 2, 0xF800); //plaatst smal kader op het display
tft.setCursor(25, 70);
tft.setTextSize(3);
tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK);
tft.print("Circuits-Online");
// weather monitoring
unsigned status;
// default settings
status = bme.begin(0x76);
// BME280 Sensor configuratie
bme.setSampling(Adafruit_BME280::MODE_NORMAL,
Adafruit_BME280::SAMPLING_X16, // temperature
Adafruit_BME280::SAMPLING_X16, // pressure
Adafruit_BME280::SAMPLING_X16, // humidity
Adafruit_BME280::FILTER_X16,
Adafruit_BME280::STANDBY_MS_250 );
// Nodig voor Watchdog
pinMode(button, INPUT_PULLUP); //init control pin
timer = timerBegin(1000000); //timer 1Mhz resolution
timerAttachInterrupt(timer, &resetModule); //attach callback
timerAlarm(timer, wdtTimeout * 1000, false, 0); //set time in us
// Einde Watchdog settings
}
// ---------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------
void loop() {
Print_tijd();
Print_bme();
Time_Reboot();
Wachthond();
}
// --------------------------------------------------------------------------------
// Dit is de functie voor het resetten van de microcontroler na Wachthont gebeurtenis
// --------------------------------------------------------------------------------
void Wachthond() {
timerWrite(timer, 0); //reset timer (feed watchdog)
long loopTime = millis();
//while button is pressed, delay up to 3 seconds to trigger the timer
while (!digitalRead(button)) {
Serial.println("button pressed"); // <== Kan later weg
delay(500); // <== Kan later weg
}
loopTime = millis() - loopTime;
// Einde Watchdog settings
}
// --------------------------------------------------------------------------------
// Dit is de functie voor het resetten van de microcontroler na een bepaalde tijd gestuurd vanuit de DS3232
// --------------------------------------------------------------------------------
void Time_Reboot() {
rd = myRTC.getDate();
rh = myRTC.getHour(h12Flag, pmFlag);
rm = myRTC.getMinute();
rs = myRTC.getSecond();
if( (rd == 12) && (rh == 18) && (rm == 12) && (rs == 0) ) { // <== op deze tijd reboot de micro: op dag-12 van de maand om 18:12:00
esp_restart(); // Reboot commando
}
// debug regels time, kan later weg
Serial.println(rd);
Serial.println(rh);
Serial.println(rm);
Serial.println(rs);
Serial.println();
}
// --------------------------------------------------------------------------------
// Dit is de functie voor het weergeven van de tijd op het display
// --------------------------------------------------------------------------------
void Print_tijd() {
// Plaatst realtime klok met formattering op het display
tft.setTextColor(ST77XX_YELLOW, ST77XX_BLACK);
tft.setTextSize(2);
tft.setCursor(218, 149);
// Buffer voor klok weergave met formattering voorloop nul
char tbuffer[30];
// Set de klok gegevens in de snprintf buffer
snprintf(tbuffer,30,"%02i:%02i:%02i",(Clock.getHour(h12, PM)),(Clock.getMinute()),(Clock.getSecond()));
// Plaatst de inhoud van de buffer op het display
tft.print(tbuffer);
}
// --------------------------------------------------------------------------------
// Dit is de functie voor de BM280 sensor, voor temperatuur en lucht vochtigheid
// --------------------------------------------------------------------------------
void Print_bme() {
tft.setTextSize(2);
tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
tft.setCursor(68, 149);
tft.print((char)247); // plaatst het Celcius rondje voor de C
tft.setCursor(79, 149);
tft.print("C");
tft.setCursor(7, 149);
tft.print(bme.readTemperature());
tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
tft.setCursor(145, 149);
tft.print("%Hum");
tft.setCursor(117, 149);
tft.print(bme.readHumidity(),0);
}
Nog een doel is dus of ik uit de DS3232 ook een alarm functie kan pulleken die b.v. 1x per maand de reset-pin van de T190 kan frutten.
Daar is jammer genoeg bij deze T190 geen echte aansluitpen voor aanwezig, maar aan de onderzijde is het reset toetsje gemonteerd met open en bloot de solderingen hiervan, no problemo dus.
Alarm DS3232
Ik heb al in wat voorbeeld code gekeken van de door mij gebruikte library voor de DS3232 van Andrew Wickert, maar ik denk dat ik daarvoor een stukje frisser moet zijn dan nu op dit moment. *grin*
Ik dacht dat library's er voor zouden zorgen dat de code makkelijk toepasbaar zou worden.
Van de voorbeeld code betreffende een van de alrm functies ga ik eerst alle debug codes die ik verder niet nodig heb verwijderen, ik raak daar echt de weg van kwijt.
Mag ik jullie naar de DS3232 code laten kijken en mij proberen duidelijk te maken waat ik in de naam van de Heer b.v. dag 20 van de maand om 00:01:01 een alarm kan invullen in de onderstaande code?
/*
DS3231_test.pde
Eric Ayars
4/11
Test/demo of read routines for a DS3231 RTC.
Turn on the serial monitor after loading this to check if things are
working as they should.
*/
#include <DS3231.h>
#include <Wire.h>
DS3231 myRTC;
bool century = false;
bool h12Flag;
bool pmFlag;
byte alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits;
bool alarmDy, alarmH12Flag, alarmPmFlag;
void setup() {
// Start the I2C interface
Wire.begin();
// Start the serial interface
Serial.begin(57600);
}
void loop() {
// send what's going on to the serial monitor.
// Start with the year
Serial.print("2");
if (century) { // Won't need this for 89 years.
Serial.print("1");
} else {
Serial.print("0");
}
Serial.print(myRTC.getYear(), DEC);
Serial.print(' ');
// then the month
Serial.print(myRTC.getMonth(century), DEC);
Serial.print(" ");
// then the date
Serial.print(myRTC.getDate(), DEC);
Serial.print(" ");
// and the day of the week
Serial.print(myRTC.getDoW(), DEC);
Serial.print(" ");
// Finally the hour, minute, and second
Serial.print(myRTC.getHour(h12Flag, pmFlag), DEC);
Serial.print(" ");
Serial.print(myRTC.getMinute(), DEC);
Serial.print(" ");
Serial.print(myRTC.getSecond(), DEC);
// Add AM/PM indicator
if (h12Flag) {
if (pmFlag) {
Serial.print(" PM ");
} else {
Serial.print(" AM ");
}
} else {
Serial.print(" 24h ");
}
// Display the temperature
Serial.print("T=");
Serial.print(myRTC.getTemperature(), 2);
// Tell whether the time is (likely to be) valid
if (myRTC.oscillatorCheck()) {
Serial.print(" O+");
} else {
Serial.print(" O-");
}
// Indicate whether an alarm went off
if (myRTC.checkIfAlarm(1)) {
Serial.print(" A1!");
}
if (myRTC.checkIfAlarm(2)) {
Serial.print(" A2!");
}
// New line on display
Serial.println();
// Display Alarm 1 information
Serial.print("Alarm 1: ");
myRTC.getA1Time(alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
Serial.print(alarmDay, DEC);
if (alarmDy) {
Serial.print(" DoW");
} else {
Serial.print(" Date");
}
Serial.print(' ');
Serial.print(alarmHour, DEC);
Serial.print(' ');
Serial.print(alarmMinute, DEC);
Serial.print(' ');
Serial.print(alarmSecond, DEC);
Serial.print(' ');
if (alarmH12Flag) {
if (alarmPmFlag) {
Serial.print("pm ");
} else {
Serial.print("am ");
}
}
if (myRTC.checkAlarmEnabled(1)) {
Serial.print("enabled");
}
Serial.println();
// Display Alarm 2 information
Serial.print("Alarm 2: ");
myRTC.getA2Time(alarmDay, alarmHour, alarmMinute, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
Serial.print(alarmDay, DEC);
if (alarmDy) {
Serial.print(" DoW");
} else {
Serial.print(" Date");
}
Serial.print(" ");
Serial.print(alarmHour, DEC);
Serial.print(" ");
Serial.print(alarmMinute, DEC);
Serial.print(" ");
if (alarmH12Flag) {
if (alarmPmFlag) {
Serial.print("pm");
} else {
Serial.print("am");
}
}
if (myRTC.checkAlarmEnabled(2)) {
Serial.print("enabled");
}
// display alarm bits
Serial.println();
Serial.print("Alarm bits: ");
Serial.println(alarmBits, BIN);
Serial.println();
delay(1000);
}
.
Schiet mij maar lek, heel veel debug Serial.print, ik probeer daar omheen te lezen, maar ik kan geen regels vinden waar alarm-1 of alarm-2 met mijn tijd kan worden geladen.
Zover mijn kennis rijkt, kan alleen alarm-1 gebruikt worden, daar alarm-2 geen seconde functie heeft, dan blijft de uitgang van de DS3232 de ESP32 een minuut i nde reset stand houden en dat is niet fijn. 
Ik hoop dat de Software Goden mij weer de goede richting op kunnen duwen.
Dank weer en groet,
Bram
Die code gaat er vanuit dat er al een alarm ingesteld is. Daar is een speciale functie voor, Zie header file.
Instellen gaat zo:
byte A1Day = 20;
byte A1Hour = 0;
byte A1Minute = 1;
byte A1Second = 1;
byte AlarmBits = 0b0000; // Alarm when date, h, m, s match
bool A1Dy = false; // Assume DayOfMonth
bool A1h12 = false; // Using 24-hour clock
bool A1PM = false; //
myRTC.setA1Time(A1Day, A1Hour, A1Minute, A1Second,
AlarmBits, A1Dy, A1h12, A1PM);
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi deKees, 
Ik ben in een andere voorbeeld file aan het kijken aan de hand van wat je liet zien en zal proberen het nu zo op te bouwen dat het gaat werken, nu nog wat veel errors met de eerste testen. 
Dank en groet,
Bram
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Het werkt nu, er waren typo's te over van mij... *grin*
De onderstaande code laat de uitgang van de DS3232 1 seconde laag worden.
/*
DS3231_test.pde
Eric Ayars
4/11
Test/demo of read routines for a DS3231 RTC.
Turn on the serial monitor after loading this to check if things are
working as they should.
*/
#include <DS3231.h>
#include <Wire.h>
DS3231 myRTC;
bool century = false;
bool h12Flag;
bool pmFlag;
byte alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits;
bool alarmDy, alarmH12Flag, alarmPmFlag;
// Interrupt signaling byte
volatile byte tick = 1;
void setup() {
// Start the I2C interface
Wire.begin();
// Start the serial interface
Serial.begin(57600);
// Punt in de maand waarop de microcontroler een reset krijgt van de uitgang DS3232
byte A1Day = 12;
byte A1Hour = 22;
byte A1Minute = 45;
byte A1Second = 5;
byte AlarmBits = 0b0000; // Alarm when date, h, m, s match
bool A1Dy = false; // Assume DayOfMonth
bool A1h12 = false; // Using 24-hour clock
bool A1PM = false; //
// Upload initial parameters of Alarm 1
myRTC.turnOnAlarm(1);
myRTC.setA1Time(A1Day, A1Hour, A1Minute, A1Second, AlarmBits, A1Dy, A1h12, A1PM);
// clear Alarm 1 flag after setting the alarm time
myRTC.checkIfAlarm(1);
// now it is safe to enable interrupt output
myRTC.turnOnAlarm(1);
// Einde setup alarmtijd
}
void loop() {
// send what's going on to the serial monitor.
// Start with the year
Serial.print("2");
if (century) { // Won't need this for 89 years.
Serial.print("1");
} else {
Serial.print("0");
}
Serial.print(myRTC.getYear(), DEC);
Serial.print(' ');
// then the month
Serial.print(myRTC.getMonth(century), DEC);
Serial.print(" ");
// then the date
Serial.print(myRTC.getDate(), DEC);
Serial.print(" ");
// and the day of the week
Serial.print(myRTC.getDoW(), DEC);
Serial.print(" ");
// Finally the hour, minute, and second
Serial.print(myRTC.getHour(h12Flag, pmFlag), DEC);
Serial.print(" ");
Serial.print(myRTC.getMinute(), DEC);
Serial.print(" ");
Serial.print(myRTC.getSecond(), DEC);
// Add AM/PM indicator
if (h12Flag) {
if (pmFlag) {
Serial.print(" PM ");
} else {
Serial.print(" AM ");
}
} else {
Serial.print(" 24h ");
}
// Display the temperature
Serial.print("T=");
Serial.print(myRTC.getTemperature(), 2);
// Tell whether the time is (likely to be) valid
if (myRTC.oscillatorCheck()) {
Serial.print(" O+");
} else {
Serial.print(" O-");
}
// Indicate whether an alarm went off
if (myRTC.checkIfAlarm(1)) {
Serial.print(" A1!");
}
if (myRTC.checkIfAlarm(2)) {
Serial.print(" A2!");
}
// New line on display
Serial.println();
// Display Alarm 1 information
Serial.print("Alarm 1: ");
myRTC.getA1Time(alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
Serial.print(alarmDay, DEC);
if (alarmDy) {
Serial.print(" DoW");
} else {
Serial.print(" Date");
}
Serial.print(' ');
Serial.print(alarmHour, DEC);
Serial.print(' ');
Serial.print(alarmMinute, DEC);
Serial.print(' ');
Serial.print(alarmSecond, DEC);
Serial.print(' ');
if (alarmH12Flag) {
if (alarmPmFlag) {
Serial.print("pm ");
} else {
Serial.print("am ");
}
}
if (myRTC.checkAlarmEnabled(1)) {
Serial.print("enabled");
}
Serial.println();
// Display Alarm 2 information
Serial.print("Alarm 2: ");
myRTC.getA2Time(alarmDay, alarmHour, alarmMinute, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
Serial.print(alarmDay, DEC);
if (alarmDy) {
Serial.print(" DoW");
} else {
Serial.print(" Date");
}
Serial.print(" ");
Serial.print(alarmHour, DEC);
Serial.print(" ");
Serial.print(alarmMinute, DEC);
Serial.print(" ");
if (alarmH12Flag) {
if (alarmPmFlag) {
Serial.print("pm");
} else {
Serial.print("am");
}
}
if (myRTC.checkAlarmEnabled(2)) {
Serial.print("enabled");
}
// display alarm bits
Serial.println();
Serial.print("Alarm bits: ");
Serial.println(alarmBits, BIN);
Serial.println();
delay(1000);
}
Nu nog Alarm-2 uitzoeken hoe deze altijd uit staat, zodat deze alarmfunctie niets kan verstoren.
Dat zal niet zo moeilijk zein, ik had al wat gezien wat dit betreft.
Dank weer deKees
De header file is een onderdeel van de library. Een nadeel van de arduino IDE is dat die een beetje verstopt zit, terwijl je die wel nodig hebt om te zien hoe de library gebruikt moet worden.
Ergens in je Arduino installatie is een "libraries" folder en daarin zit een subfolder voor elke library in je systeem. Ook eentje voor de DS3231. En daarin zit de "DS3231.h" header file die je ook bovenin je sketch aanroept in de "#include <DS3231.h>" statement.
Die file bevat een lijst met alle functies die door de library beschikbaar wordt gemaakt.
Als alternatief kun je ook zoeken op internet. Zie https://github.com/NorthernWidget/DS3231/blob/master/DS3231.h
Ook bereikbaar via Arduino IDE : Tools -> Manage libraries:
Kies een library module
en klik op 'More info'
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Ondertussen heel veel getest voor voor het HF oven project, display werkt en nog meer zaken uitgezocht, maar ik moet me even niet meer op de hals halen dan strikt noodzakelijk.
Dus de Heltec microcontroler met display ga ik niet gebruiken.
Ook het mooie kleuren display 2x16 van DFRobot niet, het ook nog met de zelfde code een LCD 4x 20 getest wat ook werkte.
Een aantal functies, leuke dingen die ik in dit project wou hebben heb ik er uit gekegeld, het moet af, dus voro nu even KISS. 
Het display is weer veranderd, geen menu struktuur alles past op één 240x320 TFT display, de afmeting is 2-Inch en van het merk Wave share.
Vandaag met de stroomsensor bezig geweest en dat is de MAX471, deze doet alleen stroommeting en heeft een stroombron uitgang met een 2K weerstand naar aarde.
De hele middag hangt deze al aan een aantal meetinstrumenten en meet een stroom van 100mA.
De Keitley 7510 meet hier de spanning over de 2K weerstand, dus bij 100mA zou de meter gemiddeld 100mV moeten aangeven.
De weerstand op het printje van de sensor is wat lager en je hebt de calibratie error ook nog van de MAX471.
Zo ziet een meting van ruim twee uur er uit, de stroom die ik door de sensor stuur is zeker 10x stabieler, dus daar hoef ik bij deze meting geen rekenenign mee te houden,
en deze stroom wordt door een tweede Keitley meter(hier niet zichtbaar) in de gaten gehouden.
.
En dan nu de vraag... 
Hieronder een stukje code die over de spannngs meting gaat, maar het verschil met de stroommeting is nihil.
Ook mijn spannings deler aan de ingang van Analoge ingang A2 is niet super precies en dit samen met de ADC afwijking, de referentie voor de ADC is een precisie model en is ook weer ruim beter dan de
andere items die een grotere afwijking hebben.
//Twee correctie waarden voorde U en de I metingen
float Cal_15v = 0.0012; // <== random gekozen waarde.... Deze waarde past de gemeten waarde aan die van ADC pin-2 komt, zodat de aangeven voeding spanning correct is
float i_15v = 0.00312; // <== random gekozen waarde.... Deze waarde past de gemeten waarde aan die van ADC pin-2 komt, zodat de aangeven voeding stroom correct is
void Omgeving_temp() {
// Meten van de voedingspanning
float sample_Filter_Voeding = (float)analogRead(A2);
Filter_Voeding.AddSample(sample_Filter_Voeding);
float avg_Filter_Voeding = Filter_Voeding.Average();
vOUT = (avg_Filter_Voeding * VCC) / 65536;
vIN = vOUT / ( R2 / (R1 + R2) );
// Debug uitlezing 15V Voeding
Serial.println("15V Voedingspanning");
Serial.print(vIN, 4);
Serial.println();
Serial.println();
Laat ik even wat aanamen doen:
De stroom door de sensor is b.v. precies 100mA en na het middelen van de ADC en het hardbass middel filter
welke ik hier niet laat zien,
maar wel gebruikt word, is de meetwaarde zeg 98.06534-mA
De spanning meting geeft i.p.v. precies 15.000V, 15,18532V aan en ook deze meting wil ik graag redelijk correct op het scherm hebben.
Waar ga ik de correctie toepassen, is dat b.v. op deze positie: float sample_Filter_Voeding = (float)analogRead(A2);
Of is het beter de correctie te doen op de regel die de uiteindelijke waarde levert voor het display: vIN = vOUT / ( R2 / (R1 + R2) );
Kunnen jullie mij laten zien wat de goede Manier is om dit netjes op te lossen, dus de float Cal_15v en de float i_15v.?
Ik vermoed dat de berekening in de regel van vIN moet komen.
Dank en groet,
Bram
Moeilijk te zeggen zo. Dat hangt af van het type van de AddSample() funktie. Als die een integer verwacht dan heeft het geen zin om daar een float in te geven.
Ik zou de correctie toepassen op Vout. Dat werkt altijd.
Vout = Offset + Gain * Filter_Voeding.Average();
En dan wel de waarde van Offset en Gain (allebei float) bepalen. Offset ligt in de buurt van 0.0, en Gain is ongeveer (VCC/65536);
Als je ook nog intresse hebt andere bordjes, kijk dan eens naar BigTreeTech. Die verkopen TFT's met een STM32 achterop, en ook spul om een 3D printer aan te sturen, alleen voor de print + TFT + uC zijn ze het overwegen waard. Er zitten ook best grote displays tussen. BigTreeTech heeft ook aardig wat schema's en firmware op github staan.