Having strange problem with Adafruit QT PY ESP32-S2..everything works fine--except-- the ADCs.. my code compiles, but I still get an error--
/home/jack/Documents/sketchbook/makeSkyBluer_WiFi/makeSkyBluer_WiFi.ino:26:2: warning: #warning Use ESP32 architecture [-Wcpp]
#warning Use ESP32 architecture
^~~~~~~
In file included from /home/jack/Documents/sketchbook/makeSkyBluer_WiFi/makeSkyBluer_WiFi.ino:20:
/home/jack/Documents/sketchbook/makeSkyBluer_WiFi/makeSkyBluer_WiFi.ino: In function 'void scanKeys()':
/home/jack/snap/arduino/70/.arduino15/packages/esp32/hardware/esp32/2.0.5/tools/sdk/esp32s2/include/driver/include/driver/adc.h:104:25: error: 'ADC_WIDTH_BIT_12' was not declared in this scope
#define ADC_WIDTH_12Bit ADC_WIDTH_BIT_12
^~~~~~~~~~~~~~~~
/home/jack/Documents/sketchbook/makeSkyBluer_WiFi/makeSkyBluer_WiFi.ino:584:46: note: in expansion of macro 'ADC_WIDTH_12Bit'
adc2_get_raw( ADC2_CHANNEL_7, ADC_WIDTH_12Bit, &read_raw);
^~~~~~~~~~~~~~~
/home/jack/snap/arduino/70/.arduino15/packages/esp32/hardware/esp32/2.0.5/tools/sdk/esp32s2/include/driver/include/driver/adc.h:104:25: note: suggested alternative: 'ADC_WIDTH_BIT_13'
#define ADC_WIDTH_12Bit ADC_WIDTH_BIT_12
^~~~~~~~~~~~~~~~
/home/jack/Documents/sketchbook/makeSkyBluer_WiFi/makeSkyBluer_WiFi.ino:584:46: note: in expansion of macro 'ADC_WIDTH_12Bit'
adc2_get_raw( ADC2_CHANNEL_7, ADC_WIDTH_12Bit, &read_raw);
^~~~~~~~~~~~~~~
Multiple libraries were found for "WiFi.h"
Used: /home/jack/snap/arduino/70/.arduino15/packages/esp32/hardware/esp32/2.0.5/libraries/WiFi
Not used: /snap/arduino/70/libraries/WiFi
Multiple libraries were found for "Preferences.h"
Used: /home/jack/snap/arduino/70/.arduino15/packages/esp32/hardware/esp32/2.0.5/libraries/Preferences
Not used: /home/jack/Documents/sketchbook/libraries/Preferences
Multiple libraries were found for "FS.h"
Used: /home/jack/Documents/sketchbook/libraries/FS
Not used: /home/jack/snap/arduino/70/.arduino15/packages/esp32/hardware/esp32/2.0.5/libraries/FS
Using library LittleFS_esp32 at version 1.0.6 in folder: /home/jack/Documents/sketchbook/libraries/LittleFS_esp32
Using library FS at version 1.0 in folder: /home/jack/Documents/sketchbook/libraries/FS
Using library WiFi at version 2.0.0 in folder: /home/jack/snap/arduino/70/.arduino15/packages/esp32/hardware/esp32/2.0.5/libraries/WiFi
Using library AsyncTCP at version 1.1.1 in folder: /home/jack/Documents/sketchbook/libraries/AsyncTCP
Using library ESPAsyncWebServer at version 1.2.3 in folder: /home/jack/Documents/sketchbook/libraries/ESPAsyncWebServer
Using library AsyncElegantOTA at version 2.2.7 in folder: /home/jack/Documents/sketchbook/libraries/AsyncElegantOTA
Using library Update at version 2.0.0 in folder: /home/jack/snap/arduino/70/.arduino15/packages/esp32/hardware/esp32/2.0.5/libraries/Update
Using library U8g2 at version 2.33.15 in folder: /home/jack/Documents/sketchbook/libraries/U8g2
Using library Preferences at version 2.0.0 in folder: /home/jack/snap/arduino/70/.arduino15/packages/esp32/hardware/esp32/2.0.5/libraries/Preferences
Using library Wire at version 2.0.0 in folder: /home/jack/snap/arduino/70/.arduino15/packages/esp32/hardware/esp32/2.0.5/libraries/Wire
Using library SPI at version 2.0.0 in folder: /home/jack/snap/arduino/70/.arduino15/packages/esp32/hardware/esp32/2.0.5/libraries/SPI
exit status 1
Error compiling for board Adafruit QT Py ESP32-S2.
the error is something around the new ADC structure..
my code compiles--
adc2_get_raw(ADC2_CHANNEL_7, ADC_WIDTH_12Bit, &read_raw);
but it still sqwaks about an error..concerning--
ADC_WIDTH_12Bit
not sure where to go from here..
[code]
#include <LITTLEFS.h>
#include <littlefs_api.h>
#include <lfs.h>
#include <lfs_util.h>
#include <esp_littlefs.h>
//#include <ESP32AnalogRead.h>
//ESP32AnalogRead adc;
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <AsyncElegantOTA.h>
//#include "wiring_analog_extras.h"
#include <Arduino.h>
#include <U8g2lib.h>
#include <Preferences.h>
Preferences settings;
#include <Wire.h>
#include <driver/adc.h>
#include <esp_adc_cal.h>
#include <driver/gpio.h>
#include <esp_adc_cal.h>
#include <driver/ledc.h>
#warning Use ESP32 architecture
#define ETHERNET_USE_ESP32
#define BOARD_TYPE "ESP32"
#define W5500_RST_PORT 21
#ifndef BOARD_NAME
#define BOARD_NAME BOARD_TYPE
#endif
// Please UNCOMMENT one of the contructor lines below
// U8g2 Contructor List (Picture Loop Page Buffer)
// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
// Please update the pin numbers according to your setup. Use U8X8_PIN_NONE if the reset pin is not connected
//U8G2_NULL u8g2(U8G2_R0); // null device, a 8x8 pixel display which does nothing
// Using hardware IIC bus (SDA: 4, SCL: 5) with noname 128x64 0.96" OLED display
//U8X8_SSD1306_128X64_NONAME_HW_I²C u8x8(/* reset=*/ U8X8_PIN_NONE);
//U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
//U8G2_SSD1309_128X64_NONAME0_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
U8G2_SSD1309_128X64_NONAME0_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
//U8G2_SSD1309_128X64_NONAME0_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
#define MakeSkyBlue_v118 0
#define PowMr 1
#define MakeSkyBlue_v113 1
/////////////////select board type///////////////////
//const int32_t board=PowMr;
const int32_t board=MakeSkyBlue_v118;
//const int32_t board=MakeSkyBlue_v113;
/////////////////////////////////////////////////////
//////////////////Fan Drive//////////////////////////
bool invertFanDrv=false;
//bool invertFanDrv=true;
/////////////////////////////////////////////////////
#define DN 0
#define UP 1
#define OFF 0
#define ON 1
#define LO 1
#define HI 2
#define clrBUFFER 0
#define keyNONE 0
#define keyPROGESC 1
#define keyUP 2
#define keyDN 3
#define keyENTER 4
#define SET_BULK 0
#define UD_BULK 1
#define SET_FLOAT 2
#define UD_FLOAT 3
#define dspPV_BATT 0
#define dspDIAG 1
#define dspPeakPWM 2
#define dspABOUT 3
#define dspBULKfloat 4
#define dspbulkFLOAT 5
#define dspMAXCHARGEAMPS 6
#define dspFAN 7
#define dspCAL_ZERO 8
#define dspCAL_PVv 9
#define dspCAL_BATTv 10
#define dspCAL_PVi 11
#define dspCAL_TEMPv 12
#define dspFREQ 13
#define KeysIN 18 //ADC1_CHANNEL_0 //0
#define BATTvIN 17 //ADC1_CHANNEL_1 //1
#define PVvIN 9 //ADC1_CHANNEL_2 //2
#define PViIN 8 //ADC1_CHANNEL_3 //3
#define TEMP_IN 16 //ADC1_CHANNEL_4
#define FANdrv 7 //GPIO_16 //Fan Drive
//#define PWM1_DutyCycledrv A8 //PWM1_DutyCycle
#define LoadDrv 9 //Load drv
#define Spare 10 //Spare
#define ledc_GPIO 36
#define PWM1_Ch 0
#define PWM1_Res 8
#define PWM1_Freq 40000
int PWM1_DutyCycle = 0;
// resistance at 25 degrees C
#define THERMISTORNOMINAL 10000
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3950
// the value of the 'other' resistor
#define SERIESRESISTOR 10000
volatile static int32_t FLOATv =0;
volatile static int32_t BULKv =0;
volatile static int32_t maxChargeAmps =20;
volatile static int32_t PVv =0;
volatile static int32_t PVv_average=0;
volatile static int32_t PVi =0;
volatile static int32_t PVi_average=0;
volatile static int32_t BATTv =0;
volatile static int32_t BATTv_average=0;
volatile static int32_t BATTi =0;
volatile static int32_t BATTi_average=0;
volatile static int32_t ThmStat =0;
volatile int32_t dspCURRENT=0;
volatile int32_t dspLAST=dspBULKfloat;
volatile static uint32_t PWM=127;
volatile static int32_t WATTS=0;
volatile static int32_t peakPWM=2;
const int32_t maxPWM=254;
volatile static int32_t pixelX=0;
volatile static int32_t pixelY=0;
volatile int32_t adcOFFSET =150;
volatile int32_t PVvGAIN =17; //54
volatile int32_t BATTvGAIN =43; //54
volatile int32_t PViGAIN =560; //270;
volatile int32_t TEMPvOFFSET =0; //21;
volatile int32_t TEMPdeg =0;
volatile int32_t degHOT =0;
volatile int32_t keyHIT =0;
volatile int32_t pwmLEVEL =65;
volatile int32_t f_idx =0;
volatile static bool interrupt_KEY=false;
volatile static bool interrupt_MPPT=false;
volatile static bool interrupt_FAN=false;
volatile static bool interrupt_SCAN=false;
volatile static bool progMODE=false;
volatile static bool dspADJ =false;
volatile static bool Dir=UP;
volatile static bool saveDATA=false;
volatile static bool bulkMODE=true;
bool bootDONE=false;
volatile int32_t fanSPEED=LO;
const char compile_date[] = __DATE__;
const char Author[] = "J. Kennedy";
const char* ssid = "moto e6(XT2005DL)7676 ";
const char* password = "99889988";
AsyncWebServer server(80);
//interrupt timer...
hw_timer_t * timer = NULL;
volatile SemaphoreHandle_t timerSemaphore;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
volatile uint32_t isrCounter = 0;
volatile uint32_t lastIsrAt = 0;
void ARDUINO_ISR_ATTR onTimer(){
volatile static int32_t KEYcntr=0;
volatile static int32_t MPPTcntr=0;
volatile static int32_t SCANcntr=0;
// Increment the counter and set the time of ISR
portENTER_CRITICAL_ISR(&timerMux);
isrCounter++;
lastIsrAt = millis();
portEXIT_CRITICAL_ISR(&timerMux);
// Give a semaphore that we can check in the loop
xSemaphoreGiveFromISR(timerSemaphore, NULL);
// It is safe to use digitalRead/Write here if you want to toggle an output
if(bootDONE){
if(fanSPEED==LO)digitalWrite(FANdrv,!digitalRead(FANdrv));
KEYcntr++;
MPPTcntr++;
SCANcntr++;
if(SCANcntr>=48000){SCANcntr=0;
interrupt_SCAN=true;}
if(MPPTcntr>=50){MPPTcntr=0;
interrupt_MPPT=true;}
if(KEYcntr>=3){KEYcntr=0;
if(keyHIT==keyNONE)interrupt_KEY=true;
}
}
}
void setup() {
bootDONE=false;
adc_power_acquire();
pinMode(0,INPUT); //has an internal 10K PULLUP...geez
pinMode(1,INPUT);
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(6,INPUT);
pinMode(FANdrv,OUTPUT); //Fan Drive
pinMode(8,OUTPUT); //PWM1_DutyCycle
pinMode(Spare,OUTPUT); //Spare
ledcAttachPin(ledc_GPIO, PWM1_Ch);
ledcSetup(PWM1_Ch, PWM1_Freq, PWM1_Res);
Serial.begin(115200);
delay(1000);
//while(!Serial);
if(Serial)Serial.println("begin setup");
digitalWrite(FANdrv,LOW);
pinMode(SDA,OUTPUT); //sda
pinMode(SCL,OUTPUT);
//adc1_config_width(ADC_WIDTH_12Bit);
//adc1_config_width(ADC_WIDTH_12Bit);
adc1_config_channel_atten(ADC1_CHANNEL_0 , ADC_ATTEN_DB_11);
adc1_config_channel_atten(ADC1_CHANNEL_1 , ADC_ATTEN_DB_11);
adc1_config_channel_atten(ADC1_CHANNEL_2 , ADC_ATTEN_DB_11);
adc1_config_channel_atten(ADC1_CHANNEL_3 , ADC_ATTEN_DB_11);
//adc1_config_channel_atten(ADC1_CHANNEL_4 , ADC_ATTEN_DB_11);
//adc1_config_channel_atten(ADC1_CHANNEL_5 , ADC_ATTEN_DB_11);
//adc1_config_channel_atten(ADC1_CHANNEL_6 , ADC_ATTEN_DB_11);
//adc1_config_channel_atten(ADC1_CHANNEL_7 , ADC_ATTEN_DB_11);
//adc1_config_channel_atten(ADC1_CHANNEL_8 , ADC_ATTEN_DB_11);
//adc1_config_channel_atten(ADC1_CHANNEL_9 , ADC_ATTEN_DB_11);
// Create semaphore to inform us when the timer has fired
timerSemaphore = xSemaphoreCreateBinary();
// Use 1st timer of 4 (counted from zero).
// Set 80 divider for prescaler (see ESP32 Technical Reference Manual for more
// info).
timer = timerBegin(0, 80, true);
// Attach onTimer function to our timer.
timerAttachInterrupt(timer, &onTimer, true);
// Set alarm to call onTimer function every second (value in microseconds).
// Repeat the alarm (third parameter)
timerAlarmWrite(timer, 20000, true); //10ms
// Start an alarm
timerAlarmEnable(timer);
// if(Serial)Serial.print(F("freeMem:")); if(Serial)Serial.println(freeRam());
Wire.setClock(400000); //clockFrequency
u8g2.begin();
u8g2.setFlipMode(0);
u8g2.clearDisplay();
u8g2.clearBuffer();
if(Serial)Serial.print(F("\nStarting TimerInterruptLEDDemo on ")); if(Serial)Serial.println(BOARD_NAME);
if(Serial)Serial.print(F("CPU Frequency = ")); if(Serial)Serial.print(F_CPU / 1000000); if(Serial)Serial.println(F(" MHz"));
// Open Preferences with my-app namespace. Each application module, library, etc
// has to use a namespace name to prevent key name collisions. We will open storage in
// RW-mode (second parameter has to be false).
// Note: Namespace name is limited to 15 chars.
settings.begin("my-app", false);
// Remove all preferences under the opened namespace
//preferences.clear();
// Or remove the counter key only
//preferences.remove("counter");
// Get the counter value, if the key does not exist, return a default value of 0
// Note: Key name is limited to 15 chars.
unsigned int counter = settings.getUInt("counter", 0);
// Increase counter by 1
counter++;
// Print the counter to Serial Monitor
Serial.printf("Current counter value: %u\n", counter);
// Store the counter to the Preferences
//settings.putUInt("counter", counter);
// Close the Preferences
settings.end();
EEPROMsettings(false); //read
OLED(dspABOUT,clrBUFFER);
delay(2500);
OLED(dspPV_BATT,clrBUFFER);
/*
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
int32_t cnt=0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
cnt++;
if(cnt>6)break;
}
Serial.println("");
if(WiFi.status()==WL_CONNECTED){
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send(200, "text/plain", "Hi! I am ESP32.");
});
AsyncElegantOTA.begin(&server);
server.begin();}
*/
if(Serial)Serial.println(F("entering Loop"));
bootDONE=true;
}
void avgPVv(int32_t pvv){volatile static int32_t avgPVV[10];
volatile static int32_t avgCntr=0;
avgCntr++;
if(avgCntr>=5)avgCntr=0;
avgPVV[avgCntr]=pvv;
PVv_average=0;
for(int32_t x=0; x<=4; x++){PVv_average+=avgPVV[x];}
PVv_average=PVv_average/5;
}
void avgPVi(int32_t pvi){volatile static int32_t avgPVI[10];
volatile static int32_t avgCntr=0;
avgCntr++;
if(avgCntr>=5)avgCntr=0;
avgPVI[avgCntr]=pvi;
PVi_average=0;
for(int32_t x=0; x<=4; x++){PVi_average+=avgPVI[x];}
PVi_average=PVi_average/5;
}
void avgBATTv(int32_t battv){volatile static int32_t avgBATTV[10];
volatile static int32_t avgCntr=0;
avgCntr++;
if(avgCntr>=5)avgCntr=0;
avgBATTV[avgCntr]=battv;
BATTv_average=0;
for(int32_t x=0; x<=4; x++){BATTv_average+=avgBATTV[x];}
BATTv_average=BATTv_average/5;
}
void avgBATTi(int32_t batti){volatile static int32_t avgBATTI[10];
volatile static int32_t avgCntr=0;
avgCntr++;
if(avgCntr>=5)avgCntr=0;
avgBATTI[avgCntr]=batti;
BATTi_average=0;
for(int32_t x=0; x<=4; x++){BATTi_average+=avgBATTI[x];}
BATTi_average=BATTi_average/5;
}
void scanVitals(){noInterrupts();
int32_t a=0;
// const int32_t comp=540; //compensate for high current pulling up voltages .1v per amp..approx
int32_t cntX=0;
//get PVi current FIRST
int32_t adc=0;
for(cntX=0; cntX<=30; cntX++){a=analogRead(PViIN);
if(cntX>=2)adc+=a;}
adc-=adcOFFSET;
PVi=adc/PViGAIN; //PVi= scale factor
avgPVi(PVi);
//PVv
adc=0;
for(cntX=0; cntX<=30; cntX++){a=analogRead(PVvIN);
if(cntX>=2)adc+=a;}
adc-=adcOFFSET;
PVv=adc/PVvGAIN; //PVv=scale factor
avgPVv(PVv);
//BATTv
adc=0;
for(cntX=0; cntX<=30; cntX++){a=analogRead(BATTvIN);
if(cntX>=2)adc+=a;}
adc-=adcOFFSET;
BATTv=adc/BATTvGAIN; //BATTv= scale factor
avgBATTv(BATTv);
//calculate BATTi
BATTi=(PVv*PVi)/BATTv;
if(BATTi>1000)BATTi=999; //take out later
if(BATTi<-1000)BATTi=999;
avgBATTi(BATTi);
//adc=adc-(adc/comp)*(PVv/100); //compensate for resistance under heavy current
//adc=adc-(adc/comp)*(BATTi/100);
///////////BATTv=adc/54; //BATTv= scale factor
WATTS=(PVv*PVi)/100; //WATTS
interrupts();
}
void EEPROMsettings(bool r_w){noInterrupts();
settings.begin("my-app", false);
if(r_w){if(Serial)Serial.println("writing settings");
if(BULKv!=settings.getInt("Bulk"))settings.putInt("BULKv",BULKv);
if(FLOATv!=settings.getInt("Float"))settings.putInt("FLOATv",FLOATv);
if(maxChargeAmps!=settings.getInt("MAXCHARGEAMPS"))settings.putInt("MAXCHARGEAMPS",maxChargeAmps);
if(ThmStat!=settings.getInt("FAN"))settings.putInt("FAN",ThmStat);
if(adcOFFSET!=settings.getInt("adcOFFSET"))settings.putInt("adcOFFSET",adcOFFSET);
if(PVvGAIN!=settings.getInt("PVvGAIN"))settings.putInt("PVvGAIN",PVvGAIN);
if(BATTvGAIN!=settings.getInt("BATTvGAIN"))settings.putInt("BATTvGAIN",BATTvGAIN);
if(PViGAIN!=settings.getInt("PViGAIN"))settings.putInt("PViGAIN",PViGAIN);
if(TEMPvOFFSET!=settings.getInt("TEMPvOFFSET"))settings.putInt("TEMPvOFFSET",TEMPvOFFSET);
delay(100);
}
if(!r_w){if(settings.getUInt("counter")>=2){
BULKv=settings.getInt("BULKv");
FLOATv=settings.getInt("FLOATv");
maxChargeAmps=settings.getInt("MAXCHARGEAMPS");
ThmStat=settings.getInt("FAN");
adcOFFSET=settings.getInt("adcOFFSET");
PVvGAIN=settings.getInt("PVvGAIN");
BATTvGAIN=settings.getInt("BATTvGAIN");
PViGAIN=settings.getInt("PViGAIN");
TEMPvOFFSET=settings.getInt("TEMPvOFFSET");
}
else {if(board==MakeSkyBlue_v118){
settings.putInt("BULKv",338);
settings.putInt("FLOATv",330);
settings.putInt("maxChargeAmps",20);
settings.putInt("ThmStat",110);
settings.putInt("adcOFFSET",200);
settings.putInt("PVvGAIN",60); //54;
settings.putInt("BATTvGAIN",115); //54;
settings.putInt("PViGAIN",511); //161; //511; //161; //511; //161; //270;
settings.putInt("TEMPvOFFSET",0);
}
if(board==PowMr){
settings.putInt("BULKv",338);
settings.putInt("FLOATv",330);
settings.putInt("MaxChargeAmps",20);
settings.putInt("ThmStat",110);
settings.putInt("adcOFFSET",200);
settings.putInt("PVvGAIN",55); //54;
settings.putInt("BATTvGAIN",135); //54;
settings.putInt("PViGAIN",511); //161; //511; //161; //511; //161; //270;
settings.putInt("TEMPvOFFSET",0);
}
if(board==MakeSkyBlue_v113){
settings.putInt("BULKv",338);
settings.putInt("FLOATv",330);
settings.putInt("maxChargeAmps",20);
settings.putInt("ThmStat",110);
settings.putInt("adcOFFSET",200);
settings.putInt("PVvGAIN",55); //54;
settings.putInt("BATTvGAIN",135); //54;
settings.putInt("PViGAIN",511); //161; //511; //161; //511; //161; //270;
settings.putInt("TEMPvOFFSET",0);
}}
}
settings.end();
interrupts();
}
void doFan(){ //FAN control
noInterrupts();
int32_t x=0;
int32_t adc=0;
int32_t a=0;
float average;
float steinhart;
for(x=0; x<=12; x++){a=analogRead(TEMP_IN);
if(x>=2)adc+=a;}
adc-=adcOFFSET;
adc=adc/10; //divide by 10
// convert the value to resistance
// average = 1023 / average - 1;
if(board==MakeSkyBlue_v118){average=adc;
average=6206/average-1;} //MakeSkyBluer 5.0v
if(board==MakeSkyBlue_v113){average=4096-adc; //same as powmr
average=4096/average-1;} // 3.3v
if(board==PowMr){average=4096-adc; //powmr
average=4096/average-1;} //PowMr 3.3v
average = SERIESRESISTOR / average;
//average=average/SERIESRESISTOR;
//if(Serial)Serial.print("Thermistor resistance ");
//if(Serial)Serial.println(average);
steinhart = average / THERMISTORNOMINAL; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15; // convert absolute temp to C
steinhart = (steinhart * 9.0)/ 5.0 + 32.0;
TEMPdeg=round(steinhart);
TEMPdeg+=TEMPvOFFSET;
TEMPdeg=constrain(TEMPdeg,-300,300);
//Serial.println(TEMPdeg);
degHOT=TEMPdeg-ThmStat;
if((PVv>=BATTv)&&(degHOT>=0)){if(degHOT<=5)fanSPEED=LO;
if(degHOT>=6){if(!invertFanDrv)digitalWrite(FANdrv,LOW);
else digitalWrite(FANdrv,HIGH);
fanSPEED=HI;}}
if((PVv<BATTv-1)||(degHOT<=-2)){if(!invertFanDrv)digitalWrite(FANdrv,HIGH); //turn off fan
else digitalWrite(FANdrv,LOW);
fanSPEED=OFF;}
interrupts();
}
void scanKeys(){noInterrupts();
//adc1_config_width(ADC_WIDTH_12Bit);
adc2_config_channel_atten(ADC2_CHANNEL_7 , ADC_ATTEN_11db);
static int32_t mm;
int32_t keyADC=0;
int32_t read_raw=0;
adc2_get_raw( ADC2_CHANNEL_7, ADC_WIDTH_12Bit, &read_raw);
for(int32_t x=0; x<=9; x++){adc2_get_raw(ADC2_CHANNEL_7, ADC_WIDTH_12Bit, &read_raw);
keyADC+=read_raw;}
keyADC=keyADC/10;
keyHIT=keyNONE;
if(keyADC>0){vTaskDelay(10 / portTICK_PERIOD_MS); //10ms delay
keyADC=0;
for(int32_t x=0; x<=9; x++){adc2_get_raw(ADC2_CHANNEL_7, ADC_WIDTH_12Bit, &read_raw);
keyADC+=read_raw;}
keyADC=keyADC/10;
//Adafruit QT PY
//if(keyADC>2600)keyHIT=keyENTER;
//if(keyADC>2900)keyHIT=keyDN;
//if(keyADC>3200)keyHIT=keyUP;
//if(keyADC>3600)keyHIT=keyPROGESC;
//QTPY ESP32-S2
//if(keyADC>2000)keyHIT=keyENTER;
//if(keyADC>2900)keyHIT=keyDN;
//if(keyADC>3200)keyHIT=keyUP;
//if(keyADC>3500)keyHIT=keyPROGESC;
if(keyADC>=(mm+100) || keyADC<=(mm-100)){Serial.print("keyADC=");Serial.println(keyADC);}
mm=keyADC;
}
//if(Serial)Serial.print("keyADC=");if(Serial)Serial.println(keyADC);
/*
if(keyHIT!=keyNONE){if(keyHIT==keyPROGESC)if(Serial)Serial.println("keyPROGESC");
if(keyHIT==keyUP)if(Serial)Serial.println("keyUP");
if(keyHIT==keyDN)if(Serial)if(Serial)Serial.println("keyDN");
if(keyHIT==keyENTER)if(Serial)if(Serial)Serial.println("keyENTER");}
*/
//if(keyADC>1000)if(Serial)Serial.println(keyADC);
//Serial.println(ADC1_GPIO18_CHANNEL);
interrupt_KEY=false;
interrupts();
}
void doKEYS(){ //if(Serial){Serial.print("doKeys on exit keyHIT=");
//Serial.println(keyHIT);}
noInterrupts();
if(keyHIT==keyPROGESC){if(!progMODE){progMODE=true;
dspADJ=false;
dspCURRENT=dspLAST;}
else{progMODE=false;
dspADJ=false;
dspLAST=dspCURRENT;
dspCURRENT=dspPV_BATT;}
OLED(dspCURRENT,clrBUFFER);
while(keyHIT!=keyNONE);}
if(keyHIT==keyUP){if(progMODE==false){dspCURRENT++;
if(dspCURRENT>dspABOUT)dspCURRENT=dspPV_BATT;
OLED(dspCURRENT,false);
//if(Serial)Serial.print("dspCURRENT=");if(Serial)Serial.println(dspCURRENT);
while(keyHIT!=keyNONE);}
if(progMODE==true){if(dspADJ==false){//set up display
dspCURRENT++;
//if(dspCURRENT>dspPWM1_DutyCycle_MPPT)dspCURRENT=dspBULKfloat; //30A model only
if(dspCURRENT>dspFREQ)dspCURRENT=dspBULKfloat;
OLED(dspCURRENT,false);
// if(Serial)Serial.print("dspCURRENT=");if(Serial)Serial.println(dspCURRENT);
while(keyHIT!=keyNONE);}
if(dspADJ==true){//adjust value
saveDATA=true;
if(dspCURRENT==dspBULKfloat){BULKv++;
if(BULKv>600)BULKv=600;}
if(dspCURRENT==dspbulkFLOAT){FLOATv++;
if(FLOATv>BULKv)BULKv=FLOATv;}
if(dspCURRENT==dspMAXCHARGEAMPS){maxChargeAmps++;
if(maxChargeAmps>60)maxChargeAmps=60;}
if(dspCURRENT==dspFAN){ThmStat++;
doFan();
if(ThmStat>150)ThmStat=150;}
if(dspCURRENT==dspCAL_ZERO){adcOFFSET++;
if(adcOFFSET>1000)adcOFFSET=1000;}
if(dspCURRENT==dspCAL_PVv){PVvGAIN--;
if(PVvGAIN<4)PVvGAIN=4;}
if(dspCURRENT==dspCAL_BATTv){BATTvGAIN--;
if(BATTvGAIN<4)BATTvGAIN=4;}
if(dspCURRENT==dspCAL_PVi){PViGAIN--;
if(PViGAIN<5)PViGAIN=5;}
if(dspCURRENT==dspCAL_TEMPv){TEMPvOFFSET++;
if(TEMPvOFFSET>30)TEMPvOFFSET=30;}
OLED(dspCURRENT,true);
}
}
}
if(keyHIT==keyDN){if(progMODE==false){dspCURRENT--;
if(dspCURRENT<dspPV_BATT)dspCURRENT=dspABOUT;
OLED(dspCURRENT,false);
while(keyHIT!=keyNONE);}
if(progMODE==true){if(dspADJ==false){dspCURRENT--;
if(dspCURRENT<dspBULKfloat)dspCURRENT=dspFREQ;
//if(dspCURRENT<dspBULKfloat)dspCURRENT=dspPWM1_DutyCycle_MPPT;
OLED(dspCURRENT,false);
while(keyHIT!=keyNONE);}
if(dspADJ==true){saveDATA=true;
if(dspCURRENT==dspBULKfloat){BULKv--;
if(BULKv<FLOATv)FLOATv=BULKv;}
if(dspCURRENT==dspbulkFLOAT){FLOATv--;
if(FLOATv<100)FLOATv=100;}
if(dspCURRENT==dspMAXCHARGEAMPS){maxChargeAmps--;
if(maxChargeAmps<5)maxChargeAmps=5;}
if(dspCURRENT==dspFAN){ThmStat--;
doFan();
if(ThmStat<80)ThmStat=80;}
if(dspCURRENT==dspCAL_ZERO){adcOFFSET--;
if(adcOFFSET<0)adcOFFSET=0;}
if(dspCURRENT==dspCAL_PVv){PVvGAIN++;
if(PVvGAIN>1250)PVvGAIN=1250;}
if(dspCURRENT==dspCAL_BATTv){BATTvGAIN++;
if(BATTvGAIN>1250)BATTvGAIN=1250;}
if(dspCURRENT==dspCAL_PVi){PViGAIN++;
if(PViGAIN>1375)PViGAIN=1375;}
if(dspCURRENT==dspCAL_TEMPv){TEMPvOFFSET--;
if(TEMPvOFFSET<-30)TEMPvOFFSET=-30;}
OLED(dspCURRENT,true);
}
}
}
if(keyHIT==keyENTER){if(progMODE==true){dspADJ=!dspADJ;
if(dspADJ==false){//if data changed, store data
EEPROMsettings(saveDATA);
saveDATA=false;
OLED(dspCURRENT,false);}
if(dspADJ==true){if(Serial)Serial.println("JJJ");
OLED(dspCURRENT,true);
} //keyHit=enter
while(keyHIT!=keyNONE);}}
if(progMODE==false){if(dspCURRENT==dspPeakPWM)scan4peakPWM();
}
keyHIT=keyNONE;
interrupts();
}
void scan4peakPWM(){//scanForPeakPWM
int32_t peakWATTS=0;
// if(Serial)Serial.println("entering scan4peakPWM");
//Serial.println(peakPWM);
//if(keyHIT!=keyNONE)return;
OLED(dspPeakPWM,false);
ledcWrite(PWM1_DutyCycle,2);
delay(1500);
for(uint32_t x=2; x<=maxPWM; x++){//if(keyHIT!=keyNONE)break;
//if(Serial)Serial.print("scan4peakPWM x=");if(Serial)Serial.println(x);
ledcWrite(PWM1_Ch,x);
//if(keyHIT!=keyNONE)break;
// if(Serial)Serial.println(x);
scanVitals();
if(WATTS>peakWATTS){peakPWM=x;
peakWATTS=WATTS;} //log the peak
pixelX=map(x,0,maxPWM,8,120);
pixelY=map(constrain(WATTS,0,500),0,500,60,8);
OLED(dspPeakPWM,true);
}
PWM=peakPWM;
// if(Serial)Serial.println("leaving scan4peakPWM");
}
void doMPPT(){static int32_t cloudyTMR=4;
static int32_t WATTSmem=0;
static int32_t cloudyWATTSmem=0;
scanVitals();
if(PVv>FLOATv){cloudyTMR--;
if(cloudyTMR<0){cloudyTMR=20; //look for rapid fade or rise
if(abs(WATTS-cloudyWATTSmem)>
(cloudyWATTSmem+((cloudyWATTSmem*5)/10))){//interrupt_SCAN=true; //sun cloudy up/dn
cloudyWATTSmem=WATTS;}}
}
//determine mode--bulk or float
if(BATTv>BULKv)bulkMODE=false;
if(BATTv<(FLOATv*9)/10)bulkMODE=true; //10% drop from float v
if(PVv>BATTv){//do MPPT
if(((bulkMODE==true) && (BATTv<BULKv))||
((bulkMODE==false) && (BATTv<FLOATv))){//dither around sweetSpot
//scanVitals();
// while(PWM1_DutyCycle > 0)
// ledcWrite(PWM1_Ch, PWM1_DutyCycle1--);
if(WATTS<WATTSmem)Dir=!Dir;
if(Dir==UP)PWM1_DutyCycle++;
if(Dir==DN)PWM1_DutyCycle--;
if(PWM1_DutyCycle<peakPWM-20){PWM1_DutyCycle=peakPWM;
Dir=!Dir;}
if(PWM1_DutyCycle>(peakPWM-2)){PWM1_DutyCycle=peakPWM;
Dir=!Dir;}
if(degHOT>32)PWM1_DutyCycle=peakPWM/4;
if(degHOT>34)PWM1_DutyCycle=2;
if(WATTS>maxChargeAmps)PWM1_DutyCycle=PWM-(PWM/8);
ledcWrite(PWM1_Ch, PWM1_DutyCycle);
WATTSmem=WATTS;}
else ledcWrite(PWM1_Ch, 2);
}
else ledcWrite(PWM1_Ch,0);
}
void loop(){
if(interrupt_KEY)scanKeys();
if(keyHIT!=keyNONE){doKEYS();
//if(dspADJ)keyHIT=keyNONE;
}
if(interrupt_MPPT){
if((dspCURRENT==dspPV_BATT)||(dspCURRENT==dspDIAG)){doMPPT();
if(dspCURRENT==dspPV_BATT)OLED(dspCURRENT,true);
if(dspCURRENT==dspDIAG)OLED(dspDIAG,true);}
interrupt_MPPT=false;}
if(interrupt_FAN){doFan();
interrupt_FAN=false;}
if(interrupt_SCAN){if(PVv>BATTv){if((dspCURRENT==dspPV_BATT)||(dspCURRENT==dspDIAG)){int32_t mem=dspCURRENT;
scan4peakPWM();
dspCURRENT=mem;
OLED(dspCURRENT,clrBUFFER);}}
interrupt_SCAN=false;}
if(dspCURRENT>dspABOUT){scanVitals();
if(dspADJ)OLED(dspCURRENT,true);
else OLED(dspCURRENT,false);}
}
void OLED(int32_t dMODE, bool dspSW){u8g2.setFontMode(1);
//if(Serial)Serial.print("OLED dMODE=");if(Serial)Serial.println(dMODE);
if(dMODE==dspPV_BATT)displayPV_BATT(dspSW);
if(dMODE==dspDIAG)displayDIAG(dspSW);
if(dMODE==dspPeakPWM)displayPeakPWM(dspSW);
if(dMODE==dspABOUT)displayABOUT(dspSW);
// if(dMODE==dspPWM1_DutyCycle_MPPT)displayPWM1_DutyCycle_MPPT(dspSW);
if(dMODE==dspFREQ)displayFREQ(dspSW);
if(dMODE==dspBULKfloat)displayBULKfloat(dspSW);
if(dMODE==dspbulkFLOAT)displaybulkFLOAT(dspSW);
if(dMODE==dspMAXCHARGEAMPS)displayMAXCHARGEAMPS(dspSW);
if(dMODE==dspFAN)displayFAN(dspSW);
if(dMODE==dspCAL_ZERO)displayCAL_ZERO(dspSW);
if(dMODE==dspCAL_PVv)displayCAL_PVv(dspSW);
if(dMODE==dspCAL_PVi)displayCAL_PVi(dspSW);
if(dMODE==dspCAL_BATTv)displayCAL_BATTv(dspSW);
if(dMODE==dspCAL_TEMPv)displayCAL_TEMPv(dspSW);
u8g2.sendBuffer();
}
void displayPV_BATT(bool sw){
if(!sw){u8g2.clearBuffer();
u8g2.setDrawColor(0);
u8g2.drawRFrame(3 ,3,61,60,7);
u8g2.setDrawColor(1);
u8g2.drawRFrame(3 ,3,61,60,7);
u8g2.setDrawColor(0);
u8g2.drawRFrame(63 ,3,63,60,7);
u8g2.setDrawColor(1);
u8g2.drawRFrame(63 ,3,63,60,7);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.setCursor(23,9);
u8g2.print(" ");
u8g2.setCursor(76,9);
u8g2.print(" ");
u8g2.setFontMode(1);
u8g2.setCursor(23,9);
u8g2.print(" PV ");
u8g2.setCursor(76,9);
u8g2.print(" BATT ");}
if(sw){u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_t0_22b_mf);
//update PV
u8g2.setFontMode(0);
u8g2.drawStr(7,30," ");
u8g2.setFontMode(1);
u8g2.setCursor(7,30);
if(PVv_average>=1000)u8g2.print(PVv_average/10);
else u8g2.print(float(PVv_average/10.0),1); //PV volts
u8g2.setFontMode(0);
u8g2.drawStr(7,55," ");
u8g2.setFontMode(1);
u8g2.setCursor(7,55);
u8g2.print(float(PVi_average/10.0),1); //PV amps
//update BATT
u8g2.setFontMode(0);
u8g2.drawStr(67,30," ");
u8g2.setFontMode(1);
u8g2.setCursor(67,30);
u8g2.print(float(BATTv_average/10.0),1); //BATT volts
u8g2.setFontMode(0);
u8g2.drawStr(67,55," ");
u8g2.setFontMode(1);
u8g2.setCursor(67,55);
u8g2.print(float(BATTi_average/10.0),1); //BATT amps
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setCursor(54,30); //pv
u8g2.print("V");
u8g2.setCursor(54,55);
u8g2.print("A");
u8g2.setCursor(115,30); //batt
u8g2.print("V");
u8g2.setCursor(115,55);
u8g2.print("A");}
}
void displayDIAG(bool sw){
if(!sw){u8g2.clearBuffer();
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(1);
u8g2.setCursor(0,8);
u8g2.print("PVv");
u8g2.setCursor(0,19);
u8g2.print("PVi");
u8g2.setCursor(0,30);
u8g2.print("BATTv");
u8g2.setCursor(0,41);
u8g2.print("BATTi");
u8g2.setCursor(0,52);
u8g2.print("FAN");
//col 2
u8g2.setCursor(64,8);
u8g2.print("WATTS");
u8g2.setCursor(64,19);
u8g2.print("PWM1_DutyCycle");
u8g2.setCursor(64,30);
u8g2.print("MODE");
u8g2.setCursor(64,41);
u8g2.print("pwmKHZ");
u8g2.setCursor(64,52);
u8g2.print("degHOT");
u8g2.setFontMode(0);}
if(sw){u8g2.setCursor(36,8);
u8g2.setFontMode(0);
u8g2.print(" ");
u8g2.setFontMode(1);
u8g2.setCursor(36,8);
if(PVv>=1000)u8g2.print(PVv_average/10);
else u8g2.print(float(PVv_average/10.0),1); //PV volts
u8g2.setCursor(36,19);
u8g2.setFontMode(0);
u8g2.print(" ");
u8g2.setCursor(36,19);
u8g2.setFontMode(1);
u8g2.print(float(PVi_average/10.0),1);
u8g2.setCursor(36,30);
u8g2.setFontMode(0);
u8g2.print(" ");
u8g2.setCursor(36,30);
u8g2.setFontMode(1);
u8g2.print(float(BATTv_average/10.0),1);
u8g2.setFontMode(0);
u8g2.setCursor(36,41);
u8g2.print(" ");
u8g2.setCursor(36,41);
u8g2.setFontMode(1);
u8g2.print(float(BATTi_average/10.0),1);
u8g2.setCursor(36,52);
u8g2.setFontMode(0);
u8g2.print(" ");
u8g2.setCursor(36,52);
u8g2.setFontMode(1);
u8g2.print(fanSPEED);
//second column
u8g2.setCursor(105,8);
u8g2.setFontMode(0);
u8g2.print(" ");
u8g2.setFontMode(1);
u8g2.setCursor(105,8);
u8g2.print(WATTS);
u8g2.setCursor(105,19);
u8g2.setFontMode(0);
u8g2.print(" ");
u8g2.setCursor(105,19);
u8g2.setFontMode(1);
u8g2.print(PWM);
u8g2.setCursor(105,30);
u8g2.setFontMode(0);
u8g2.print(" ");
u8g2.setCursor(105,30);
u8g2.setFontMode(1);
if(bulkMODE)u8g2.print("BULK");
else{u8g2.setCursor(99,30);
u8g2.print("FLOAT");}
u8g2.setFontMode(0);
u8g2.setCursor(105,41);
u8g2.print(" ");
u8g2.setCursor(105,41);
u8g2.setFontMode(1);
//u8g2.print(displayFreq(f_idx));
u8g2.setCursor(105,52);
u8g2.setFontMode(0);
u8g2.print(" ");
u8g2.setCursor(105,52);
u8g2.setFontMode(1);
u8g2.print(degHOT);}
}
void displayPeakPWM(bool sw){
if(!sw){u8g2.clearBuffer();
u8g2.setFontMode(0);
u8g2.clearBuffer();
u8g2.setDrawColor(1);
u8g2.drawFrame(0 ,3,126,61);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.drawStr(13,8," ");
u8g2.setFontMode(1);
u8g2.drawStr(18,8,"PWM CURVE: ");
u8g2.setCursor(80,8);
//u8g2.print(displayFreq(f_idx));
u8g2.setCursor(88,8);
u8g2.print(" KHZ");
//u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFont(u8g2_font_tom_thumb_4x6_mf);
u8g2.setFontMode(0);
u8g2.drawStr(8,20,"Peak PWM:");}
if(sw){u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setDrawColor(1);
//u8g2.drawPixel(pixelX,pixelY);
u8g2.drawLine(pixelX,60,pixelX,pixelY);
//u8g2.setFont(u8g2_font_tom_thumb_4x6_mf);
u8g2.setFontMode(0);
u8g2.drawStr(60,20," ");
u8g2.setFontMode(1);
u8g2.setCursor(60,20);
u8g2.print(peakPWM);
}
}
void displayABOUT(bool sw){
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.drawStr(5,12,"Software Version:");
u8g2.drawStr(5,28,compile_date);
u8g2.drawStr(5,45,"Author:");
u8g2.drawStr(5,60,Author);
}
void displayPWM_MPPT(bool sw){
if(!sw){u8g2.clearBuffer();
u8g2.setDrawColor(0);
u8g2.drawRFrame(3 ,3,120,60,7);
u8g2.setDrawColor(1);
u8g2.drawRFrame(3 ,3,120,60,7);
u8g2.setFont(u8g2_font_tom_thumb_4x6_mf);
//u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.setCursor(25,7);
u8g2.print(" ");
u8g2.setFontMode(1);
u8g2.setCursor(25,7);
u8g2.print(" SET PWM TAKEOVER LVL ");
u8g2.drawFrame(60,37,40,20);
u8g2.drawStr(19,44,"PWM > ");
u8g2.drawStr(19,53,"MPPT <=");
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setCursor(65,30);
u8g2.print("BATTi");
u8g2.setCursor(65,51);
u8g2.print(float(pwmLEVEL/10.0),1);
}
if(sw){u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_profont12_mf);
//update pwmLEVEL
u8g2.setFontMode(0);
u8g2.drawStr(65,51," ");
u8g2.setFontMode(1);
u8g2.setCursor(65,51);
if(pwmLEVEL>=1000)u8g2.print(pwmLEVEL/10);
else if(pwmLEVEL>0){u8g2.print(float(pwmLEVEL/10.0),1);} //PV volts
else u8g2.print("NEVER");
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(105,54,0x2191);
u8g2.drawGlyph(105,54,0x2193);
}
}
void displayFREQ(bool sw){
if(!sw){u8g2.clearBuffer();
u8g2.setDrawColor(0);
u8g2.drawRFrame(3 ,3,120,60,7);
u8g2.setDrawColor(1);
u8g2.drawRFrame(3 ,3,120,60,7);
u8g2.setFont(u8g2_font_tom_thumb_4x6_mf);
//u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.setCursor(25,7);
u8g2.print(" ");
u8g2.setFontMode(1);
u8g2.setCursor(25,7);
u8g2.print(" SWITCHING FREQ ");
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setCursor(25,30);
// u8g2.print(displayFreq(f_idx));
u8g2.setCursor(25,45);
u8g2.print("Khz");
}
if(sw){u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_profont12_mf);
//update sw freq
u8g2.setFontMode(0);
u8g2.drawStr(25,30," ");
u8g2.setFontMode(1);
u8g2.setCursor(25,30);
//u8g2.print(displayFreq(f_idx));
//u8g2.setCursor(25,45);
//u8g2.print("Khz");
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(75,34,0x2191);
u8g2.drawGlyph(75,34,0x2193);
}
}
void displayBULKfloat(bool sw){
if(!sw){u8g2.clearBuffer();
//u8g2.setDrawColor(0);
//u8g2.drawRFrame(2 ,2,63,61,7);
u8g2.setDrawColor(1);
u8g2.drawRFrame(2 ,2,63,61,7);
//u8g2.setDrawColor(0);
//u8g2.drawRFrame(63 ,2,63,61,7);
u8g2.setDrawColor(1);
u8g2.drawRFrame(63 ,2,63,61,7);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.setCursor(17,8);
u8g2.print(" ");
u8g2.setCursor(75,8);
u8g2.print(" ");
u8g2.setFontMode(1);
u8g2.setCursor(17,8);
u8g2.print(" BULK ");
u8g2.setCursor(73,8);
u8g2.print(" FLOAT ");
//BULK
u8g2.setCursor(21,26);
u8g2.print(float(BULKv/10.0),1); //BULKv
u8g2.drawStr(26,50,"SET");
//FLOAT
u8g2.setCursor(82,26);
u8g2.print(float(FLOATv/10.0),1); //FLOATv
}
if(sw){//BULK up/dn, FLOATv
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.drawStr(17,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(21,26);
u8g2.print(float(BULKv/10.0),1); //BULKv
u8g2.setFontMode(0);
u8g2.drawStr(79,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(82,26);
u8g2.print(float(FLOATv/10.0),1); //FLOATv
u8g2.setDrawColor(1);
u8g2.setFontMode(0);
u8g2.drawStr(26,50," ");
u8g2.setFontMode(1);
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(30,50,0x2191);
u8g2.drawGlyph(30,50,0x2193);
}
}
void displaybulkFLOAT(bool sw){
if(!sw){u8g2.clearBuffer();
//u8g2.setDrawColor(0);
//u8g2.drawRFrame(2 ,2,63,61,7);
u8g2.setDrawColor(1);
u8g2.drawRFrame(2 ,2,63,61,7);
//u8g2.setDrawColor(0);
//u8g2.drawRFrame(63 ,2,63,61,7);
u8g2.setDrawColor(1);
u8g2.drawRFrame(63 ,2,63,61,7);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.setCursor(17,8);
u8g2.print(" ");
u8g2.setCursor(75,8);
u8g2.print(" ");
u8g2.setFontMode(1);
u8g2.setCursor(17,8);
u8g2.print(" BULK ");
u8g2.setCursor(73,8);
u8g2.print(" FLOAT ");
u8g2.setFontMode(0);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.drawStr(25,45," ");
u8g2.drawStr(25,55," ");
u8g2.drawStr(80,45," ");
u8g2.drawStr(80,55," ");
u8g2.setFontMode(1);
//BULK
u8g2.setCursor(21,26);
u8g2.print(float(BULKv/10.0),1); //BULKv
u8g2.setFontMode(0);
u8g2.drawStr(89,45," ");
u8g2.drawStr(89,55," ");
//FLOAT
u8g2.setFontMode(1);
u8g2.setCursor(82,26);
u8g2.print(float(FLOATv/10.0),1); //FLOATv
u8g2.drawStr(85,50,"SET");
}
if(sw){//BULKv , FLOATv
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.setCursor(21,26);
u8g2.print(" ");
u8g2.setFontMode(1);
u8g2.setCursor(21,26);
u8g2.print(float(BULKv/10.0),1); //BULKv
u8g2.setFontMode(0);
u8g2.setCursor(79,26);
u8g2.print(" ");
u8g2.setFontMode(1);
//u8g2.setDrawColor(0);
u8g2.setCursor(82,26);
u8g2.print(float(FLOATv/10.0),1); //FLOATv
u8g2.setFontMode(0);
u8g2.drawStr(25,45," ");
u8g2.drawStr(25,55," ");
u8g2.drawStr(80,45," ");
u8g2.drawStr(80,55," ");
u8g2.setFontMode(1);
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(89,50,0x2191);
u8g2.drawGlyph(89,50,0x2193);
}
}
void displayMAXCHARGEAMPS(bool sw){
if(!sw){u8g2.clearBuffer();
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(1);
u8g2.drawStr(20,22,"MAX CHARGE AMPS");
u8g2.setCursor(58,51);
u8g2.print(maxChargeAmps);
u8g2.setFontMode(0);
u8g2.drawStr(89,45," ");
u8g2.drawStr(89,55," ");
u8g2.setDrawColor(1);
u8g2.drawRFrame(3,3,125,60,7);
}
if(sw){u8g2.setFontMode(1);
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(89,50,0x2191);
u8g2.drawGlyph(89,50,0x2193);
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.drawStr(58,51," ");
u8g2.setFontMode(1);
u8g2.setCursor(58,51);
u8g2.print(maxChargeAmps);
}
}
void displayFAN(bool sw){
// if(!sw){
u8g2.clearBuffer();
u8g2.setFontMode(1);
u8g2.drawRFrame(2 ,2,63,61,7);
u8g2.drawRFrame(63 ,2,63,61,7);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.drawStr(12,8," ");
u8g2.drawStr(76,8," ");
u8g2.setFontMode(1);
u8g2.setCursor(20,8);
u8g2.print("TEMP");
u8g2.setCursor(86,8);
u8g2.print("FAN");
u8g2.drawStr(85,50,"SET");
//TEMPdeg
u8g2.setCursor(21,26);
u8g2.print(TEMPdeg);
u8g2.setFontMode(0);
u8g2.drawStr(80,45," ");
u8g2.drawStr(80,55," ");
u8g2.setCursor(82,26);
u8g2.print(ThmStat);
u8g2.setCursor(82,50);
u8g2.print("ENTER");
//}
if(sw){//FAN up/dn
u8g2.setFontMode(1);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.drawStr(17,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(21,26);
u8g2.print(TEMPdeg);
u8g2.setFontMode(0);
u8g2.drawStr(79,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(82,26);
u8g2.print(ThmStat);
u8g2.setFontMode(0);
u8g2.drawStr(80,45," ");
u8g2.drawStr(80,55," ");
u8g2.setFontMode(1);
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(89,50,0x2191);
u8g2.drawGlyph(89,50,0x2193);
}
}
void displayCAL_ZERO(bool sw){
if(!sw){u8g2.clearBuffer();
u8g2.setFontMode(1);
u8g2.drawRFrame(2 ,2,63,61,7);
u8g2.drawRFrame(63 ,2,63,61,7);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.drawStr(12,8," ");
u8g2.drawStr(72,8," ");
u8g2.setFontMode(1);
u8g2.setCursor(17,8);
u8g2.print("PVzero");
u8g2.setCursor(77,8);
u8g2.print("OFFSET");
//PVv
u8g2.setCursor(21,26);
u8g2.print(float(PVv/10.0),1);
u8g2.setFontMode(0);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.drawStr(80,45," ");//wipe out u/d arrow
u8g2.drawStr(80,55," ");
u8g2.setCursor(82,26);
u8g2.print(adcOFFSET);
u8g2.setCursor(82,50);
u8g2.print("ENTER");
}
if(sw){//adcOFFSET up/dn
u8g2.setFontMode(1);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.drawStr(17,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(21,26);
u8g2.print(float(PVv/10.0),1);
u8g2.setFontMode(0);
u8g2.drawStr(79,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(82,26);
u8g2.print(adcOFFSET);
u8g2.setFontMode(0);
u8g2.drawStr(80,45," ");
u8g2.drawStr(80,55," ");
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(89,50,0x2191);
u8g2.drawGlyph(89,50,0x2193);
}
}
void displayCAL_PVv(bool sw){
if(!sw){u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(1);
u8g2.clearBuffer();
u8g2.drawRFrame(2 ,2,63,61,7);
u8g2.drawRFrame(63 ,2,63,61,7);
u8g2.setFontMode(0);
u8g2.setCursor(20,8);
u8g2.print(" ");
u8g2.setCursor(76,8);
u8g2.print(" ");
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setCursor(26,8);
u8g2.print("PVv");
u8g2.setCursor(82,8);
u8g2.print("GAIN");
//PVv
u8g2.setCursor(21,26);
u8g2.print(float(PVv/10.0),1);
u8g2.setCursor(82,50);
u8g2.print("ENTER");
u8g2.setCursor(82,26);
u8g2.print(PVvGAIN);
u8g2.setCursor(82,50);
u8g2.print("ENTER");
}
if(sw){//PVvGAIN up/dn
u8g2.setFontMode(1);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.drawStr(17,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(21,26);
u8g2.print(float(PVv/10.0),1);
u8g2.setFontMode(0);
u8g2.drawStr(80,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(82,26);
u8g2.print(PVvGAIN);
u8g2.setFontMode(0);
u8g2.drawStr(74,45," ");
u8g2.drawStr(74,55," ");
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(89,50,0x2191);
u8g2.drawGlyph(89,50,0x2193);
}
}
void displayCAL_BATTv(bool sw){
if(!sw){u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(1);
u8g2.clearBuffer();
u8g2.drawRFrame(2 ,2,63,61,7);
u8g2.drawRFrame(63 ,2,63,61,7);
u8g2.setFontMode(0);
u8g2.setCursor(14,8);
u8g2.print(" ");
u8g2.setCursor(76,8);
u8g2.print(" ");
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setCursor(20,8);
u8g2.print("BATTv");
u8g2.setCursor(82,8);
u8g2.print("GAIN");
//BATTv
u8g2.setCursor(21,26);
u8g2.print(float(BATTv/10.0),1);
u8g2.setFontMode(1);
u8g2.setCursor(82,26);
u8g2.print(BATTvGAIN);
u8g2.setCursor(82,50);
u8g2.print("ENTER");
}
if(sw){//BATTvGAIN up/dn
u8g2.setFontMode(1);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.drawStr(17,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(21,26);
u8g2.print(float(BATTv/10.0),1);
u8g2.setFontMode(0);
u8g2.drawStr(79,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(82,26);
u8g2.print(BATTvGAIN);
u8g2.setFontMode(0);
u8g2.drawStr(74,45," ");
u8g2.drawStr(74,55," ");
u8g2.setFontMode(1);
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(89,50,0x2191);
u8g2.drawGlyph(89,50,0x2193);
}
}
void displayCAL_PVi(bool sw){
if(!sw){u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(1);
u8g2.clearBuffer();
u8g2.drawRFrame(2 ,2,63,61,7);
u8g2.drawRFrame(63 ,2,63,61,7);
u8g2.setFontMode(0);
u8g2.setCursor(21,8);
u8g2.print(" ");
u8g2.setCursor(77,8);
u8g2.print(" ");
u8g2.setFontMode(1);
u8g2.setCursor(21,8);
u8g2.print(" PVi ");
u8g2.setCursor(77,8);
u8g2.print(" GAIN ");
//PVi
u8g2.setCursor(21,26);
u8g2.print(float(PVi/10.0),1);
u8g2.setCursor(82,26);
u8g2.print(PViGAIN);
u8g2.setCursor(82,50);
u8g2.print("ENTER");
//driveFETs(f_idx,freq[f_idx]/2); //mid range charge
}
if(sw){//PViGAIN up/dn
//driveFETs(f_idx,freq[f_idx]/2); //mid range charge
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.drawStr(17,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(21,26);
u8g2.print(float(PVi/10.0),1);
u8g2.setFontMode(0);
u8g2.drawStr(79,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(82,26);
u8g2.print(PViGAIN);
u8g2.setFontMode(0);
u8g2.drawStr(74,45," ");
u8g2.drawStr(74,55," ");
u8g2.setFontMode(1);
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(89,50,0x2191);
u8g2.drawGlyph(89,50,0x2193);
}
}
void displayCAL_TEMPv(bool sw){
if(!sw){u8g2.clearBuffer();
u8g2.setDrawColor(1);
u8g2.drawRFrame(2 ,2,63,61,7);
u8g2.drawRFrame(63 ,2,63,61,7);
u8g2.setFontMode(0);
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setCursor(17,8);
u8g2.print(" ");
u8g2.setCursor(79,8);
u8g2.print(" ");
u8g2.setFontMode(1);
u8g2.setCursor(19,8);
u8g2.print(" TEMP ");
u8g2.setCursor(80,8);
u8g2.print("ADJUST");
//TEMPdeg
u8g2.setCursor(21,26);
u8g2.print(TEMPdeg);
u8g2.setCursor(86,26);
u8g2.print(TEMPvOFFSET);
u8g2.setCursor(82,50);
u8g2.print("ENTER");
}
if(sw){//TEMPvGAIN up/dn
u8g2.setFont(u8g2_font_profont12_mf);
u8g2.setFontMode(0);
u8g2.drawStr(17,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(21,26);
u8g2.print(TEMPdeg);
u8g2.setFontMode(0);
u8g2.drawStr(74,26," ");
u8g2.setFontMode(1);
u8g2.setCursor(86,26);
u8g2.print(TEMPvOFFSET);
u8g2.setFontMode(0);
u8g2.drawStr(74,45," ");
u8g2.drawStr(74,55," ");
u8g2.setFontMode(1);
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(89,50,0x2191);
u8g2.drawGlyph(89,50,0x2193);
}
}
[/code]