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.