Documentation

This commit is contained in:
Armin 2023-08-12 09:17:50 +02:00
parent 5507618f93
commit 36e4a19ff8
7 changed files with 63 additions and 31 deletions

View File

@ -115,8 +115,8 @@
extern float sVCCVoltage;
extern uint16_t sVCCVoltageMillivolt;
extern long sLastVoltageCheckMillis;
extern uint8_t sVoltageTooLowCounter;
extern long sLastVCCCheckMillis;
extern uint8_t sVCCTooLowCounter;
uint16_t readADCChannel(uint8_t aChannelNumber);
uint16_t readADCChannelWithReference(uint8_t aChannelNumber, uint8_t aReference);
@ -157,7 +157,9 @@ float getTemperature(void);
bool isVCCTooLowMultipleTimes();
void resetVCCTooLowMultipleTimes();
bool isVoltageTooLow();
bool isVCCTooLow();
bool isVCCTooHigh();
bool isVCCTooHighSimple();
#endif // defined(__AVR__) ...
#endif // _ADC_UTILS_H

View File

@ -61,8 +61,8 @@ float sVCCVoltage;
uint16_t sVCCVoltageMillivolt;
// for isVCCTooLowMultipleTimes()
long sLastVoltageCheckMillis;
uint8_t sVoltageTooLowCounter = 0;
long sLastVCCCheckMillis;
uint8_t sVCCTooLowCounter = 0;
/*
* Conversion time is defined as 0.104 milliseconds by ADC_PRESCALE in ADCUtils.h.
@ -155,7 +155,7 @@ uint8_t checkAndWaitForReferenceAndChannelToSwitch(uint8_t aChannelNumber, uint8
/*
* Switch reference from DEFAULT to INTERNAL
*/
delayMicroseconds(8000); // experimental value is >= 7600 us for Nano board and 6200 for UNO board
delayMicroseconds(8000); // experimental value is >= 7600 us for Nano board and 6200 for Uno board
} else if ((tOldADMUX & 0x0F) != aChannelNumber) {
if (aChannelNumber == ADC_1_1_VOLT_CHANNEL_MUX) {
/*
@ -361,6 +361,10 @@ uint16_t readUntil4ConsecutiveValuesAreEqual(uint8_t aChannelNumber, uint8_t aDe
* !!! Function without handling of switched reference and channel.!!!
* Use it ONLY if you only call getVCCVoltageSimple() or getVCCVoltageMillivoltSimple() in your program.
* !!! Resolution is only 20 millivolt !!!
* Raw reading of 1.1 V is 225 at 5 V.
* Raw reading of 1.1 V is 221 at 5.1 V.
* Raw reading of 1.1 V is 214 at 5.25 V (+5 %).
* Raw reading of 1.1 V is 204 at 5.5 V (+10 %).
*/
float getVCCVoltageSimple(void) {
// use AVCC with (optional) external capacitor at AREF pin as reference
@ -384,7 +388,7 @@ uint16_t getVCCVoltageMillivoltSimple(void) {
* Similar to getVCCVoltageMillivolt() * 1023 / 1100
*/
uint16_t getVCCVoltageReadingFor1_1VoltReference(void) {
uint16_t tVCC = waitAndReadADCChannelWithReference(ADC_1_1_VOLT_CHANNEL_MUX, DEFAULT); // 225 for 1.1 V at 5 V VCC
uint16_t tVCC = waitAndReadADCChannelWithReference(ADC_1_1_VOLT_CHANNEL_MUX, DEFAULT);
/*
* Do not switch back ADMUX to enable checkAndWaitForReferenceAndChannelToSwitch() to work correctly for the next measurement
*/
@ -402,6 +406,10 @@ float getVCCVoltage(void) {
* Read value of 1.1 volt internal channel using VCC (DEFAULT) as reference.
* Handles reference and channel switching by introducing the appropriate delays.
* !!! Resolution is only 20 millivolt !!!
* Raw reading of 1.1 V is 225 at 5 V.
* Raw reading of 1.1 V is 221 at 5.1 V.
* Raw reading of 1.1 V is 214 at 5.25 V (+5 %).
* Raw reading of 1.1 V is 204 at 5.5 V (+10 %).
*/
uint16_t getVCCVoltageMillivolt(void) {
uint16_t tVCC = waitAndReadADCChannelWithReference(ADC_1_1_VOLT_CHANNEL_MUX, DEFAULT);
@ -502,6 +510,12 @@ uint16_t getVoltageMillivoltWith_1_1VoltReference(uint8_t aADCChannelForVoltageM
#if !defined(VCC_EMERGENCY_STOP_MILLIVOLT)
#define VCC_EMERGENCY_STOP_MILLIVOLT 3000 // Many Li-ions are specified down to 3.0 volt
#endif
#if !defined(VCC_TOO_HIGH_STOP_MILLIVOLT)
#define VCC_TOO_HIGH_STOP_MILLIVOLT 5250 // + 5 % operation voltage
#endif
#if !defined(VCC_TOO_HIGH_EMERGENCY_STOP_MILLIVOLT)
#define VCC_TOO_HIGH_EMERGENCY_STOP_MILLIVOLT 5500 // +10 %. Max recommended operation voltage
#endif
#if !defined(VCC_CHECK_PERIOD_MILLIS)
#define VCC_CHECK_PERIOD_MILLIS 10000 // Period of VCC checks
#endif
@ -517,8 +531,8 @@ bool isVCCTooLowMultipleTimes() {
* Check VCC every VCC_CHECK_PERIOD_MILLIS (10) seconds
*/
if (millis() - sLastVoltageCheckMillis >= VCC_CHECK_PERIOD_MILLIS) {
sLastVoltageCheckMillis = millis();
if (millis() - sLastVCCCheckMillis >= VCC_CHECK_PERIOD_MILLIS) {
sLastVCCCheckMillis = millis();
# if defined(INFO)
readAndPrintVCCVoltageMillivolt(&Serial);
@ -526,31 +540,31 @@ bool isVCCTooLowMultipleTimes() {
readVCCVoltageMillivolt();
# endif
if (sVoltageTooLowCounter < VCC_CHECKS_TOO_LOW_BEFORE_STOP) {
if (sVCCTooLowCounter < VCC_CHECKS_TOO_LOW_BEFORE_STOP) {
/*
* Do not check again if shutdown has happened
*/
if (sVCCVoltageMillivolt > VCC_STOP_THRESHOLD_MILLIVOLT) {
sVoltageTooLowCounter = 0; // reset counter
sVCCTooLowCounter = 0; // reset counter
} else {
/*
* Voltage too low, wait VCC_CHECKS_TOO_LOW_BEFORE_STOP (6) times and then shut down.
*/
if (sVCCVoltageMillivolt < VCC_EMERGENCY_STOP_MILLIVOLT) {
// emergency shutdown
sVoltageTooLowCounter = VCC_CHECKS_TOO_LOW_BEFORE_STOP;
sVCCTooLowCounter = VCC_CHECKS_TOO_LOW_BEFORE_STOP;
# if defined(INFO)
Serial.println(F("Voltage < " STR(VCC_EMERGENCY_STOP_MILLIVOLT) " mV detected -> emergency shutdown"));
# endif
} else {
sVoltageTooLowCounter++;
sVCCTooLowCounter++;
# if defined(INFO)
Serial.print(F("Voltage < " STR(VCC_STOP_THRESHOLD_MILLIVOLT) " mV detected: "));
Serial.print(VCC_CHECKS_TOO_LOW_BEFORE_STOP - sVoltageTooLowCounter);
Serial.print(VCC_CHECKS_TOO_LOW_BEFORE_STOP - sVCCTooLowCounter);
Serial.println(F(" tries left"));
# endif
}
if (sVoltageTooLowCounter == VCC_CHECKS_TOO_LOW_BEFORE_STOP) {
if (sVCCTooLowCounter == VCC_CHECKS_TOO_LOW_BEFORE_STOP) {
/*
* 6 times voltage too low -> shutdown
*/
@ -562,12 +576,35 @@ bool isVCCTooLowMultipleTimes() {
return false;
}
void resetVCCTooLowMultipleTimes(){
sVoltageTooLowCounter = 0;
/*
* Return true if VCC_EMERGENCY_STOP_MILLIVOLT (3 V) reached
*/
bool isVCCTooLow(){
return (sVCCVoltageMillivolt < VCC_EMERGENCY_STOP_MILLIVOLT);
}
bool isVoltageTooLow(){
return (sVoltageTooLowCounter >= VCC_CHECKS_TOO_LOW_BEFORE_STOP);
void resetVCCTooLowMultipleTimes(){
sVCCTooLowCounter = 0;
}
/*
* Recommended VCC is 1.8 V to 5.5 V, absolute maximum VCC is 6.0 V.
* Check for 5.25 V, because such overvoltage is quite unlikely to happen during regular operation.
* Raw reading of 1.1 V is 225 at 5 V.
* Raw reading of 1.1 V is 221 at 5.1 V.
* Raw reading of 1.1 V is 214 at 5.25 V (+5 %).
* Raw reading of 1.1 V is 204 at 5.5 V (+10 %).
* @return true if 5 % overvoltage reached
*/
bool isVCCTooHigh(){
readVCCVoltageMillivolt();
return (sVCCVoltageMillivolt > VCC_TOO_HIGH_STOP_MILLIVOLT);
}
bool isVCCTooHighSimple(){
readVCCVoltageMillivoltSimple();
return (sVCCVoltageMillivolt > VCC_TOO_HIGH_STOP_MILLIVOLT);
}
/*

View File

@ -182,7 +182,7 @@ void setup() {
#if defined(USE_SERIAL_LCD)
myLCD.init();
myLCD.clear();
myLCD.backlight();
myLCD.backlight(); // Switch backlight LED on
#endif
#if defined(USE_PARALLEL_LCD)
myLCD.begin(LCD_COLUMNS, LCD_ROWS); // This also clears display

View File

@ -129,7 +129,7 @@ void loop() {
* Example for using the compensateAndStorePronto() function.
* Creating this String requires 2210 bytes program memory and 10 bytes RAM for the String class.
* The String object itself requires additional 440 bytes RAM from the heap.
* This values are for an Arduino UNO.
* This values are for an Arduino Uno.
*/
// Serial.println(); // blank line between entries
// String ProntoHEX = F("Pronto HEX contains: "); // Assign string to ProtoHex string object

View File

@ -379,7 +379,7 @@ void loop() {
#if FLASHEND >= 0x3FFF // For 16k flash or more, like ATtiny1604. Code does not fit in program memory of ATtiny85 etc.
if (sAddress == 0xFFF1) {
# if FLASHEND >= 0x7FFF // For 32k flash or more, like UNO. Code does not fit in program memory of ATtiny1604 etc.
# if FLASHEND >= 0x7FFF // For 32k flash or more, like Uno. Code does not fit in program memory of ATtiny1604 etc.
/*
* Send constant values only once in this demo
*/

View File

@ -1651,20 +1651,11 @@ const char* IRrecv::getProtocolString() {
* aResults->decode_type
**********************************************************************************************************************/
bool IRrecv::decode_old(decode_results *aResults) {
static bool sDeprecationMessageSent = false;
if (irparams.StateForISR != IR_REC_STATE_STOP) {
return false;
}
if (!sDeprecationMessageSent) {
#if !(defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny87__) || defined(__AVR_ATtiny167__))
// Serial.println(
// "The function decode(&results)) is deprecated and may not work as expected! Just use decode() without a parameter and IrReceiver.decodedIRData.<fieldname> .");
#endif
sDeprecationMessageSent = true;
}
// copy for usage by legacy programs
aResults->rawbuf = irparams.rawbuf;
aResults->rawlen = irparams.rawlen;

View File

@ -33,6 +33,8 @@ bool IRrecv::decode(decode_results *aResults) {
Serial.println(F(" https://github.com/Arduino-IRremote/Arduino-IRremote#examples-for-this-library"));
Serial.println(F("A guide how to convert your 2.0 program is here:"));
Serial.println(F(" https://github.com/Arduino-IRremote/Arduino-IRremote#converting-your-2x-program-to-the-4x-version"));
Serial.println();
Serial.println(F("Thanks"));
Serial.println(F("**************************************************************************************************"));
Serial.println();
Serial.println();