Added board detection to solve setup of GPIO of modded vs unmodded V2.0 PCBs and inversion of inputs on V1 PCBS.
This commit is contained in:
parent
a2fe5e969d
commit
83784a77d2
|
@ -102,6 +102,7 @@
|
||||||
#include "src/Utility/UtilClasses.h"
|
#include "src/Utility/UtilClasses.h"
|
||||||
#include "src/Utility/BTC_JSON.h"
|
#include "src/Utility/BTC_JSON.h"
|
||||||
#include "src/Utility/GPIO.h"
|
#include "src/Utility/GPIO.h"
|
||||||
|
#include "src/Utility/BoardDetect.h"
|
||||||
#include "src/OLED/ScreenManager.h"
|
#include "src/OLED/ScreenManager.h"
|
||||||
#include "src/OLED/keypad.h"
|
#include "src/OLED/keypad.h"
|
||||||
#include <DallasTemperature.h>
|
#include <DallasTemperature.h>
|
||||||
|
@ -144,6 +145,7 @@ long lastTemperatureTime; // used to moderate DS18B20 access
|
||||||
float fFilteredTemperature = -100; // -100: force direct update uopn first pass
|
float fFilteredTemperature = -100; // -100: force direct update uopn first pass
|
||||||
const float fAlpha = 0.95; // exponential mean alpha
|
const float fAlpha = 0.95; // exponential mean alpha
|
||||||
int DS18B20holdoff = 2;
|
int DS18B20holdoff = 2;
|
||||||
|
int BoardRevision = 0;
|
||||||
|
|
||||||
unsigned long lastAnimationTime; // used to sequence updates to LCD for animation
|
unsigned long lastAnimationTime; // used to sequence updates to LCD for animation
|
||||||
|
|
||||||
|
@ -159,6 +161,7 @@ CScreenManager ScreenManager;
|
||||||
TelnetSpy DebugPort;
|
TelnetSpy DebugPort;
|
||||||
CGPIOin GPIOin;
|
CGPIOin GPIOin;
|
||||||
CGPIOout GPIOout;
|
CGPIOout GPIOout;
|
||||||
|
CGPIOalg GPIOalg;
|
||||||
|
|
||||||
sRxLine PCline;
|
sRxLine PCline;
|
||||||
long lastRxTime; // used to observe inter character delays
|
long lastRxTime; // used to observe inter character delays
|
||||||
|
@ -309,6 +312,9 @@ void setup() {
|
||||||
sprintf(msg, " Temperature for device#1 (idx 0) is: %.1f", TempSensor.getTempCByIndex(0));
|
sprintf(msg, " Temperature for device#1 (idx 0) is: %.1f", TempSensor.getTempCByIndex(0));
|
||||||
DebugPort.println(msg);
|
DebugPort.println(msg);
|
||||||
|
|
||||||
|
BoardRevision = BoardDetect();
|
||||||
|
DebugPort.print("Board revision: V"); DebugPort.println(float(BoardRevision) * 0.1, 1);
|
||||||
|
|
||||||
#if USE_SPIFFS == 1
|
#if USE_SPIFFS == 1
|
||||||
// Initialize SPIFFS
|
// Initialize SPIFFS
|
||||||
if(!SPIFFS.begin(true)){
|
if(!SPIFFS.begin(true)){
|
||||||
|
@ -387,7 +393,7 @@ void setup() {
|
||||||
|
|
||||||
#endif // USE_WIFI
|
#endif // USE_WIFI
|
||||||
|
|
||||||
pinMode(ListenOnlyPin, INPUT_PULLUP); // pin to enable passive mode
|
// pinMode(ListenOnlyPin, INPUT_PULLUP); // pin to enable passive mode
|
||||||
pinMode(LED_Pin, OUTPUT); // On board LED indicator
|
pinMode(LED_Pin, OUTPUT); // On board LED indicator
|
||||||
digitalWrite(LED_Pin, LOW);
|
digitalWrite(LED_Pin, LOW);
|
||||||
|
|
||||||
|
@ -448,6 +454,7 @@ void loop()
|
||||||
|
|
||||||
GPIOin.manage();
|
GPIOin.manage();
|
||||||
GPIOout.manage();
|
GPIOout.manage();
|
||||||
|
GPIOalg.manage();
|
||||||
|
|
||||||
// manage changes in Bluetooth connection status
|
// manage changes in Bluetooth connection status
|
||||||
if(Bluetooth.isConnected()) {
|
if(Bluetooth.isConnected()) {
|
||||||
|
@ -670,15 +677,15 @@ void loop()
|
||||||
|
|
||||||
case CommStates::HeaterReport1:
|
case CommStates::HeaterReport1:
|
||||||
if(CommState.delayExpired()) {
|
if(CommState.delayExpired()) {
|
||||||
if(digitalRead(ListenOnlyPin)) { // pin open, pulled high (STANDARD OPERATION)
|
/* if(digitalRead(ListenOnlyPin)) { // pin open, pulled high (STANDARD OPERATION)*/
|
||||||
bool isBTCmaster = false;
|
bool isBTCmaster = false;
|
||||||
TxManage.PrepareFrame(OEMCtrlFrame, isBTCmaster); // parrot OEM parameters, but block NV modes
|
TxManage.PrepareFrame(OEMCtrlFrame, isBTCmaster); // parrot OEM parameters, but block NV modes
|
||||||
TxManage.Start(timenow);
|
TxManage.Start(timenow);
|
||||||
CommState.set(CommStates::BTC_Tx);
|
CommState.set(CommStates::BTC_Tx);
|
||||||
}
|
/* }
|
||||||
else { // pin shorted to ground
|
else { // pin shorted to ground
|
||||||
CommState.set(CommStates::TemperatureRead); // "Listen Only" input is held low, don't send our Tx
|
CommState.set(CommStates::TemperatureRead); // "Listen Only" input is held low, don't send our Tx
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1232,8 +1239,44 @@ bool isCyclicActive()
|
||||||
|
|
||||||
void setupGPIO()
|
void setupGPIO()
|
||||||
{
|
{
|
||||||
GPIOin.begin(GPIOin1_pin, GPIOin2_pin, NVstore.getGPIOinMode());
|
if(BoardRevision) {
|
||||||
|
// some special considerations for GPIO inputs, depending upon PCB hardware
|
||||||
|
// V1.0 PCBs only expose bare inputs, which are pulled high. Active state into ESP32 is LOW
|
||||||
|
// V2.0+ PCBs use an input transistor buffer. Active state into ESP32 is HIGH (inverted)
|
||||||
|
int activePinState = BoardRevision == 10 ? LOW : HIGH;
|
||||||
|
int Input1 = BoardRevision == 20 ? GPIOin1_pinV20 : GPIOin1_pinV21V10;
|
||||||
|
GPIOin.begin(Input1, GPIOin2_pin, NVstore.getGPIOinMode(), activePinState);
|
||||||
|
|
||||||
|
// GPIO out is always active high from ESP32
|
||||||
|
// V1.0 PCBs only expose the bare pins
|
||||||
|
// V2.0+ PCBs provide an open collector output that conducts when active
|
||||||
GPIOout.begin(GPIOout1_pin, GPIOout2_pin, NVstore.getGPIOoutMode());
|
GPIOout.begin(GPIOout1_pin, GPIOout2_pin, NVstore.getGPIOoutMode());
|
||||||
|
|
||||||
|
// ### MAJOR ISSUE WITH ADC INPUTS ###
|
||||||
|
//
|
||||||
|
// V2.0 PCBs that have not been modified connect the analogue input to GPIO26.
|
||||||
|
// This is ADC2 channel (#9).
|
||||||
|
// Unfortunately it was subsequently discovered that any ADC2 input cannot be
|
||||||
|
// used if Wifi is enabled.
|
||||||
|
// THIS ISSUE IS NOT RESOLBVABLE IN SOFTWARE.
|
||||||
|
// *** It is not possible to use ANY of the 10 ADC2 channels if Wifi is enabled :-( ***
|
||||||
|
//
|
||||||
|
// Fix is to cut traces to GPIO33 & GPIO26 and swap the connections.
|
||||||
|
// This directs GPIO input1 into GPIO26 and the analogue input into GPIO33 (ADC1_CHANNEL_5)
|
||||||
|
// This will be properly fixed in V2.1 PCBs
|
||||||
|
//
|
||||||
|
// As V1.0 PCBS expose the bare pins, the correct GPIO33 input can be readily chosen.
|
||||||
|
GPIOalgModes algMode = NVstore.getGPIOalgMode();
|
||||||
|
if(BoardRevision == 20)
|
||||||
|
algMode = GPIOalgNone; // force off analogue support in V2.0 PCBs
|
||||||
|
GPIOalg.begin(GPIOalg_pin, algMode);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// unknown board - deny all GPIO operation (unlikely)
|
||||||
|
GPIOin.begin(0, 0, GPIOinNone, LOW);
|
||||||
|
GPIOout.begin(0, 0, GPIOoutNone);
|
||||||
|
GPIOalg.begin(ADC1_CHANNEL_5, GPIOalgNone);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setGPIO(int channel, bool state)
|
void setGPIO(int channel, bool state)
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
|
|
||||||
extern CGPIOout GPIOout;
|
extern CGPIOout GPIOout;
|
||||||
extern CGPIOin GPIOin;
|
extern CGPIOin GPIOin;
|
||||||
|
extern CGPIOalg GPIOalg;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
|
@ -320,6 +321,7 @@ bool
|
||||||
CGPIOInfoScreen::show()
|
CGPIOInfoScreen::show()
|
||||||
{
|
{
|
||||||
CScreenHeader::show();
|
CScreenHeader::show();
|
||||||
|
char msg[16];
|
||||||
|
|
||||||
_display.writeFillRect(49, 18, 30, 12, WHITE);
|
_display.writeFillRect(49, 18, 30, 12, WHITE);
|
||||||
_printInverted(64, 20, "GPIO", true, eCentreJustify);
|
_printInverted(64, 20, "GPIO", true, eCentreJustify);
|
||||||
|
@ -338,6 +340,9 @@ CGPIOInfoScreen::show()
|
||||||
_display.drawBitmap(86, 29, GPIOout.getState(0) ? BulbOnIcon : BulbOffIcon, BulbOnIconWidth, BulbOnIconHeight, WHITE);
|
_display.drawBitmap(86, 29, GPIOout.getState(0) ? BulbOnIcon : BulbOffIcon, BulbOnIconWidth, BulbOnIconHeight, WHITE);
|
||||||
_display.drawBitmap(113, 29, GPIOout.getState(1) ? BulbOnIcon : BulbOffIcon, BulbOnIconWidth, BulbOnIconHeight, WHITE);
|
_display.drawBitmap(113, 29, GPIOout.getState(1) ? BulbOnIcon : BulbOffIcon, BulbOnIconWidth, BulbOnIconHeight, WHITE);
|
||||||
|
|
||||||
|
sprintf(msg, "%d", GPIOalg.getValue());
|
||||||
|
_printMenuText(58, Line1, msg);
|
||||||
|
|
||||||
_printMenuText(_display.xCentre(), 53, " \021 \030Edit \020 ", true, eCentreJustify);
|
_printMenuText(_display.xCentre(), 53, " \021 \030Edit \020 ", true, eCentreJustify);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
120
Arduino/BTCDieselHeater/src/Utility/BoardDetect.cpp
Normal file
120
Arduino/BTCDieselHeater/src/Utility/BoardDetect.cpp
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the "bluetoothheater" distribution
|
||||||
|
* (https://gitlab.com/mrjones.id.au/bluetoothheater)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Ray Jones <ray@mrjones.id.au>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// We need to identify the PCB the firmware is running upon for 2 reasons related to GPIO functions
|
||||||
|
//
|
||||||
|
// 1: Digital Inputs
|
||||||
|
// To the outside world, the digital inputs are always treated as contact closures to ground.
|
||||||
|
// V1.0 PCBs expose the bare ESP inputs for GPIO, they are normally pulled HIGH.
|
||||||
|
// V2.0+ PCBs use an input conditioning transistor that inverts the sense state.
|
||||||
|
// Inactive state for V1.0 is HIGH
|
||||||
|
// Inactive state for V2.0+ is LOW
|
||||||
|
//
|
||||||
|
// 2: Analogue input
|
||||||
|
// Unfortunately the pin originally chosen for the analogue input on the V2.0 PCB goes to
|
||||||
|
// an ADC2 channel of the ESP32.
|
||||||
|
// It turns out NONE of the 10 ADC2 channels can be used if Wifi is enabled!
|
||||||
|
// The remedy on V2.0 PCBs is to cut the traces leading from Digital input 1 and the Analogue input.
|
||||||
|
// The signals are then tranposed.
|
||||||
|
// This then presents Digital Input #1 to GPIO26, and analogue to GPIO33.
|
||||||
|
// As GPIO33 uses an ADC1 channel no issue is present reading analogue values with wifi enabled.
|
||||||
|
//
|
||||||
|
// Board Detection
|
||||||
|
// Fortunately due to the use of the digital input transistors on V2.0+ PCBs, a logical
|
||||||
|
// determination of the board configuration can be made.
|
||||||
|
// By setting the pins as digital inputs with pull ups enabled, the logic level presented
|
||||||
|
// can be read and thus the input signal paths can be determined.
|
||||||
|
// Due to the input conditioning transistors, V2.0 PCBs will hold the inputs to the ESP32
|
||||||
|
// LOW when inactive, V1.0 PCBs will pull HIGH.
|
||||||
|
// Likewise, the analogue input is left to float, so it will always be pulled HIGH.
|
||||||
|
// NOTE: a 100nF capacitor exists on the analogue input so a delay is required to ensure
|
||||||
|
// a reliable read.
|
||||||
|
//
|
||||||
|
// Input state truth table
|
||||||
|
// GPIO26 GPIO33
|
||||||
|
// ------ ------
|
||||||
|
// V1.0 HIGH HIGH
|
||||||
|
// unmodified V2.0 HIGH LOW
|
||||||
|
// modified V2.0 LOW HIGH
|
||||||
|
// V2.1 LOW HIGH
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// ****************************************************************************************
|
||||||
|
// This test only needs to be performed upon the very first firmware execution.
|
||||||
|
// Once the board has been identified, the result is saved to non volatile memory
|
||||||
|
// If a valid value is detected, the test is bypassed.
|
||||||
|
// This avoids future issues should the GPIO inputs be legitimately connected to
|
||||||
|
// extension hardware that may distort the test results when the system is repowered.
|
||||||
|
// ****************************************************************************************
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "BoardDetect.h"
|
||||||
|
#include <Preferences.h>
|
||||||
|
#include <driver/adc.h>
|
||||||
|
#include "DebugPort.h"
|
||||||
|
|
||||||
|
int BoardDetect()
|
||||||
|
{
|
||||||
|
Preferences preferences;
|
||||||
|
|
||||||
|
preferences.begin("System Info", false);
|
||||||
|
|
||||||
|
uint8_t revision = 0;
|
||||||
|
uint8_t val = preferences.getUChar("Board Revision", revision);
|
||||||
|
if(val != 0) {
|
||||||
|
// return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
DebugPort.println("Virgin system - attempting to detect revision");
|
||||||
|
pinMode(33, INPUT_PULLUP);
|
||||||
|
pinMode(26, INPUT_PULLUP);
|
||||||
|
// there is a 100nF capacitor across the analogue input, allow that to charge before testing
|
||||||
|
delay(100);
|
||||||
|
int pin33 = digitalRead(33);
|
||||||
|
int pin26 = digitalRead(26);
|
||||||
|
|
||||||
|
if(pin33 == HIGH && pin26 == HIGH) {
|
||||||
|
revision = 10;
|
||||||
|
DebugPort.println("Board detect: digital input test suggests V1.x PCB");
|
||||||
|
}
|
||||||
|
else if(pin33 == LOW && pin26 == HIGH) {
|
||||||
|
revision = 20;
|
||||||
|
DebugPort.println("Board detect: digital input test suggests V2.0 PCB");
|
||||||
|
}
|
||||||
|
else if(pin33 == HIGH && pin26 == LOW) {
|
||||||
|
revision = 21;
|
||||||
|
DebugPort.println("Board detect: digital input test suggests V2.1 PCB");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DebugPort.println("Board detect: digital input test failed to detect a sane combination!!!");
|
||||||
|
}
|
||||||
|
|
||||||
|
pinMode(33, INPUT); // revert to normal inputs (remove pull ups)
|
||||||
|
pinMode(26, INPUT);
|
||||||
|
|
||||||
|
if(revision) {
|
||||||
|
preferences.putUChar("Board Revision", revision);
|
||||||
|
}
|
||||||
|
|
||||||
|
DebugPort.print("Board detect result: V"); DebugPort.println(float(revision)*0.1f, 1);
|
||||||
|
return revision;
|
||||||
|
}
|
24
Arduino/BTCDieselHeater/src/Utility/BoardDetect.h
Normal file
24
Arduino/BTCDieselHeater/src/Utility/BoardDetect.h
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the "bluetoothheater" distribution
|
||||||
|
* (https://gitlab.com/mrjones.id.au/bluetoothheater)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Ray Jones <ray@mrjones.id.au>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
int BoardDetect();
|
|
@ -21,6 +21,8 @@
|
||||||
|
|
||||||
#include "GPIO.h"
|
#include "GPIO.h"
|
||||||
#include "../Protocol/helpers.h"
|
#include "../Protocol/helpers.h"
|
||||||
|
#include <driver/adc.h>
|
||||||
|
#include "DebugPort.h"
|
||||||
|
|
||||||
const int BREATHINTERVAL = 45;
|
const int BREATHINTERVAL = 45;
|
||||||
const int FADEAMOUNT = 3;
|
const int FADEAMOUNT = 3;
|
||||||
|
@ -32,6 +34,7 @@ CGPIOin::CGPIOin()
|
||||||
_Mode = GPIOinNone;
|
_Mode = GPIOinNone;
|
||||||
_pins[0] = 0;
|
_pins[0] = 0;
|
||||||
_pins[1] = 0;
|
_pins[1] = 0;
|
||||||
|
_pinActive = LOW;
|
||||||
_prevPins = 0;
|
_prevPins = 0;
|
||||||
_lastDebounceTime = 0;
|
_lastDebounceTime = 0;
|
||||||
_lastKey = 0;
|
_lastKey = 0;
|
||||||
|
@ -39,10 +42,11 @@ CGPIOin::CGPIOin()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CGPIOin::begin(int pin1, int pin2, GPIOinModes mode)
|
CGPIOin::begin(int pin1, int pin2, GPIOinModes mode, int activeState)
|
||||||
{
|
{
|
||||||
_pins[0] = pin1;
|
_pins[0] = pin1;
|
||||||
_pins[1] = pin2;
|
_pins[1] = pin2;
|
||||||
|
_pinActive = activeState;
|
||||||
pinMode(pin1, INPUT_PULLUP); // GPIO input pin #1
|
pinMode(pin1, INPUT_PULLUP); // GPIO input pin #1
|
||||||
pinMode(pin2, INPUT_PULLUP); // GPIO input pin #2
|
pinMode(pin2, INPUT_PULLUP); // GPIO input pin #2
|
||||||
|
|
||||||
|
@ -137,8 +141,8 @@ uint8_t
|
||||||
CGPIOin::_scanInputs()
|
CGPIOin::_scanInputs()
|
||||||
{
|
{
|
||||||
uint8_t newPins = 0;
|
uint8_t newPins = 0;
|
||||||
if(_pins[0] && digitalRead(_pins[0]) == HIGH) newPins |= 0x01;
|
if(_pins[0] && (digitalRead(_pins[0]) == _pinActive)) newPins |= 0x01;
|
||||||
if(_pins[1] && digitalRead(_pins[1]) == HIGH) newPins |= 0x02;
|
if(_pins[1] && (digitalRead(_pins[1]) == _pinActive)) newPins |= 0x02;
|
||||||
|
|
||||||
if(newPins != _prevPins) {
|
if(newPins != _prevPins) {
|
||||||
_lastDebounceTime = millis();
|
_lastDebounceTime = millis();
|
||||||
|
@ -155,6 +159,8 @@ CGPIOin::_scanInputs()
|
||||||
return _debouncedPins;
|
return _debouncedPins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CGPIOout::CGPIOout()
|
CGPIOout::CGPIOout()
|
||||||
{
|
{
|
||||||
_Mode = GPIOoutNone;
|
_Mode = GPIOoutNone;
|
||||||
|
@ -353,3 +359,41 @@ CGPIOout::getState(int channel)
|
||||||
int mask = 0x01 << (channel & 0x01);
|
int mask = 0x01 << (channel & 0x01);
|
||||||
return (_userState & mask) != 0;
|
return (_userState & mask) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CGPIOalg::CGPIOalg()
|
||||||
|
{
|
||||||
|
_expMean = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CGPIOalg::begin(adc1_channel_t pin, GPIOalgModes mode)
|
||||||
|
{
|
||||||
|
_pin = pin;
|
||||||
|
_Mode = mode;
|
||||||
|
|
||||||
|
if(_Mode != GPIOalgNone) {
|
||||||
|
adc_gpio_init(ADC_UNIT_1, ADC_CHANNEL_5);
|
||||||
|
adc1_config_width(ADC_WIDTH_BIT_12);
|
||||||
|
adc1_config_channel_atten(ADC1_CHANNEL_5, ADC_ATTEN_11db);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPIOalg::manage()
|
||||||
|
{
|
||||||
|
if(_Mode != GPIOalgNone) {
|
||||||
|
int read_raw;
|
||||||
|
char msg[32];
|
||||||
|
read_raw = adc1_get_raw( ADC1_CHANNEL_5);
|
||||||
|
// read_raw = analogRead(33);
|
||||||
|
sprintf(msg, "ADC: %d", read_raw );
|
||||||
|
_expMean = read_raw;
|
||||||
|
// DebugPort.println(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
CGPIOalg::getValue()
|
||||||
|
{
|
||||||
|
return _expMean;
|
||||||
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#define __BTCGPIO_H__
|
#define __BTCGPIO_H__
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <driver/adc.h>
|
||||||
|
|
||||||
enum GPIOinModes {
|
enum GPIOinModes {
|
||||||
GPIOinNone,
|
GPIOinNone,
|
||||||
|
@ -37,23 +38,29 @@ enum GPIOoutModes {
|
||||||
GPIOoutUser
|
GPIOoutUser
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum GPIOalgModes {
|
||||||
|
GPIOalgNone, // Unmodified V2.0 PCBs must use this - ADC2 / Wifi unresolvable conflict
|
||||||
|
GPIOalgHeatDemand,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class CGPIOin {
|
class CGPIOin {
|
||||||
GPIOinModes _Mode;
|
GPIOinModes _Mode;
|
||||||
void _doOn1Off2();
|
int _pinActive;
|
||||||
void _doOnHold1();
|
|
||||||
void _doOn1Off1();
|
|
||||||
int _pins[2];
|
int _pins[2];
|
||||||
uint8_t _scanInputs();
|
|
||||||
uint8_t _prevPins;
|
uint8_t _prevPins;
|
||||||
uint8_t _debouncedPins;
|
uint8_t _debouncedPins;
|
||||||
uint8_t _lastKey;
|
uint8_t _lastKey;
|
||||||
unsigned long _lastDebounceTime;
|
unsigned long _lastDebounceTime;
|
||||||
unsigned long _debounceDelay;
|
unsigned long _debounceDelay;
|
||||||
|
uint8_t _scanInputs();
|
||||||
|
void _doOn1Off2();
|
||||||
|
void _doOnHold1();
|
||||||
|
void _doOn1Off1();
|
||||||
public:
|
public:
|
||||||
CGPIOin();
|
CGPIOin();
|
||||||
void setMode(GPIOinModes mode) { _Mode = mode; };
|
void setMode(GPIOinModes mode) { _Mode = mode; };
|
||||||
void begin(int pin1, int pin2, GPIOinModes mode);
|
void begin(int pin1, int pin2, GPIOinModes mode, int activeState);
|
||||||
void manage();
|
void manage();
|
||||||
uint8_t getState(int channel);
|
uint8_t getState(int channel);
|
||||||
};
|
};
|
||||||
|
@ -80,4 +87,16 @@ public:
|
||||||
bool getState(int channel);
|
bool getState(int channel);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CGPIOalg {
|
||||||
|
GPIOalgModes _Mode;
|
||||||
|
float _expMean;
|
||||||
|
adc1_channel_t _pin;
|
||||||
|
public:
|
||||||
|
CGPIOalg();
|
||||||
|
void begin(adc1_channel_t pin, GPIOalgModes mode);
|
||||||
|
void manage();
|
||||||
|
int getValue();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif // __BTCGPIO_H__
|
#endif // __BTCGPIO_H__
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "NVStorage.h"
|
#include "NVStorage.h"
|
||||||
#include "DebugPort.h"
|
#include "DebugPort.h"
|
||||||
|
#include <driver/adc.h>
|
||||||
|
|
||||||
bool u8inBounds(uint8_t test, uint8_t minLim, uint8_t maxLim);
|
bool u8inBounds(uint8_t test, uint8_t minLim, uint8_t maxLim);
|
||||||
bool s8inBounds(int8_t test, int8_t minLim, int8_t maxLim);
|
bool s8inBounds(int8_t test, int8_t minLim, int8_t maxLim);
|
||||||
|
@ -321,10 +322,15 @@ CHeaterStorage::setGPIOoutMode(unsigned char val)
|
||||||
_calValues.Options.GPIOoutMode = val;
|
_calValues.Options.GPIOoutMode = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char
|
GPIOalgModes
|
||||||
CHeaterStorage::getGPIOalgMode()
|
CHeaterStorage::getGPIOalgMode()
|
||||||
{
|
{
|
||||||
return _calValues.Options.GPIOalgMode;
|
GPIOalgModes algMode = GPIOalgNone;
|
||||||
|
switch (_calValues.Options.GPIOalgMode) {
|
||||||
|
case 0: algMode = GPIOalgNone; break;
|
||||||
|
case 1: algMode = GPIOalgHeatDemand; break;
|
||||||
|
}
|
||||||
|
return algMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -151,7 +151,7 @@ public:
|
||||||
unsigned char getCyclicMode();
|
unsigned char getCyclicMode();
|
||||||
GPIOinModes getGPIOinMode();
|
GPIOinModes getGPIOinMode();
|
||||||
GPIOoutModes getGPIOoutMode();
|
GPIOoutModes getGPIOoutMode();
|
||||||
unsigned char getGPIOalgMode();
|
GPIOalgModes getGPIOalgMode();
|
||||||
|
|
||||||
void setPmin(float);
|
void setPmin(float);
|
||||||
void setPmax(float);
|
void setPmax(float);
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <driver/adc.h>
|
||||||
|
|
||||||
const uint8_t UART_Tx = 1;
|
const uint8_t UART_Tx = 1;
|
||||||
const uint8_t LED_Pin = 2;
|
const uint8_t LED_Pin = 2;
|
||||||
|
@ -38,17 +39,18 @@ const uint8_t OLED_SDA_pin = 21; // I2C std pins
|
||||||
const uint8_t OLED_SCL_pin = 22; // "
|
const uint8_t OLED_SCL_pin = 22; // "
|
||||||
const uint8_t HC05_SensePin = 23;
|
const uint8_t HC05_SensePin = 23;
|
||||||
const uint8_t GPIOin2_pin = 25;
|
const uint8_t GPIOin2_pin = 25;
|
||||||
const uint8_t AlgInput_pin = 26;
|
const uint8_t GPIOin1_pinV21V10 = 26;
|
||||||
|
const adc2_channel_t GPIOalg_pinINVALID = ADC2_CHANNEL_9; // GPIO 26 - Cannot use ADC2 with WiFi enabled!!!
|
||||||
const uint8_t GPIOout1_pin = 27;
|
const uint8_t GPIOout1_pin = 27;
|
||||||
|
|
||||||
const uint8_t keyUp_pin = 32;
|
const uint8_t keyUp_pin = 32;
|
||||||
const uint8_t GPIOin1_pin = 33;
|
const uint8_t GPIOin1_pinV20 = 33;
|
||||||
|
const adc1_channel_t GPIOalg_pin = ADC1_CHANNEL_5; // GPIO 33 - OK with Wifi, ADC1 channel
|
||||||
const uint8_t keyDown_pin = 34; // input only, no chip pullup
|
const uint8_t keyDown_pin = 34; // input only, no chip pullup
|
||||||
const uint8_t keyCentre_pin = 35; // input only, no chip pullup
|
const uint8_t keyCentre_pin = 35; // input only, no chip pullup
|
||||||
const uint8_t keyRight_pin = 36; // input only, no chip pullup
|
const uint8_t keyRight_pin = 36; // input only, no chip pullup
|
||||||
const uint8_t keyLeft_pin = 39; // input only, no chip pullup
|
const uint8_t keyLeft_pin = 39; // input only, no chip pullup
|
||||||
|
|
||||||
const uint8_t ListenOnlyPin = 33;
|
//const uint8_t ListenOnlyPin = 33;
|
||||||
//const uint8_t WiFi_TriggerPin = 25;
|
|
||||||
const uint8_t WiFi_TriggerPin = 0; // BOOT switch!
|
const uint8_t WiFi_TriggerPin = 0; // BOOT switch!
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue