Basic Function works

This commit is contained in:
Marcel Peterkau 2022-01-10 00:55:04 +01:00
parent 402535051a
commit bfa4272334
6 changed files with 98 additions and 50 deletions

View File

@ -16,6 +16,7 @@ typedef enum eSystem_Status
typedef struct Globals_t {
tSystem_Status systemStatus = sysStat_Startup;
uint8_t purgePulses= 0;
tSystem_Status resumeStatus = sysStat_Startup;
};
extern Globals_t globals;

View File

@ -1,34 +1,65 @@
#include "lubeapp.h"
extern void LED_Process();
extern void LED_Process(tSystem_Status newStatus = sysStat_NOP);
uint32_t lubePulseTimestamp = 0;
void RunLubeApp(volatile uint32_t *wheelPulseCounter)
{
uint32_t LubeDistance = 0;
static uint32_t lubePulseTimestamp = 0;
// Calculate traveled Distance in mm
TravelDistance_highRes += (*wheelPulseCounter * LubeConfig.DistancePerRevolution_mm);
TravelDistance_highRes += (*wheelPulseCounter * (LubeConfig.DistancePerRevolution_mm / LubeConfig.PulsePerRevolution));
*wheelPulseCounter = 0;
// check if we have to Lube!
switch (globals.systemStatus)
{
case sysStat_Startup:
globals.systemStatus = sysStat_Normal;
globals.resumeStatus = sysStat_Normal;
break;
case sysStat_Normal:
LubeDistance = LubeConfig.DistancePerLube_Default;
if (TravelDistance_highRes > LubeConfig.DistancePerLube_Default)
{
LubePulse();
TravelDistance_highRes = 0;
}
break;
case sysStat_Rain:
LubeDistance = LubeConfig.DistancePerLube_Rain;
if (TravelDistance_highRes > LubeConfig.DistancePerLube_Rain)
{
LubePulse();
TravelDistance_highRes = 0;
}
break;
case sysStat_Purge:
if (globals.purgePulses > 0)
{
if (lubePulseTimestamp + LUBE_PULSE_LENGHT_MS + LUBE_PULSE_PAUSE_MS < millis())
{
LubePulse();
globals.purgePulses--;
}
}
else
{
globals.systemStatus = globals.resumeStatus;
}
break;
}
if (TravelDistance_highRes > LubeDistance){
lubePulseTimestamp = millis() + LUBE_PULSE_LENGHT_MS;
TravelDistance_highRes = 0;
}
//maintain Pin-State of Lube-Pump
// maintain Pin-State of Lube-Pump
if (lubePulseTimestamp > millis())
digitalWrite(GPIO_PUMP, HIGH);
else
digitalWrite(GPIO_PUMP, LOW);
}
void LubePulse()
{
lubePulseTimestamp = millis() + LUBE_PULSE_LENGHT_MS;
LubeConfig.tankRemain_µl = LubeConfig.tankRemain_µl - LubeConfig.amountPerDose_µl;
}

View File

@ -6,8 +6,10 @@
#include "common.h"
#include "globals.h"
#define LUBE_PULSE_LENGHT_MS 1000
#define LUBE_PULSE_LENGHT_MS 500
#define LUBE_PULSE_PAUSE_MS 250
void RunLubeApp(volatile uint32_t * wheelPulseCounter);
void LubePulse();
#endif

View File

@ -47,6 +47,7 @@ void RemoteDebug_printWifiInfo();
void wifiMaintainConnectionTicker_callback();
void IRAM_ATTR trigger_ISR();
void LED_Process(tSystem_Status newStatus = sysStat_NOP);
void DisplayProcess();
Ticker WiFiMaintainConnectionTicker(wifiMaintainConnectionTicker_callback, 1000, 0, MILLIS);
@ -138,14 +139,12 @@ void setup()
void loop()
{
LED_Process();
LED_Process(globals.systemStatus);
RunLubeApp(&wheel_pulse);
WiFiMaintainConnectionTicker.update();
u8x8.setCursor(0, 3);
u8x8.printf("%4d m", TravelDistance_highRes / 1000);
u8x8.refreshDisplay();
DisplayProcess();
ArduinoOTA.handle();
Debug.handle();
@ -247,35 +246,33 @@ void LED_Process(tSystem_Status newSysStatus)
uint32_t timer = 0;
uint32_t timestamp = 0;
if (newSysStatus != sysStat_NOP)
if (oldSysStatus != newSysStatus)
{
if (oldSysStatus != newSysStatus)
switch (newSysStatus)
{
switch (newSysStatus)
{
case sysStat_Startup:
LED_Status = LED_Startup;
break;
case sysStat_Normal:
timestamp = millis() + 1500;
LED_Status = LED_Confirm_Normal;
FastLED.setBrightness(64);
break;
case sysStat_Rain:
timestamp = millis() + 1500;
LED_Status = LED_Confirm_Rain;
FastLED.setBrightness(64);
break;
case sysStat_Purge:
LED_Status = LED_Purge;
break;
case sysStat_Error:
LED_Status = LED_Error;
break;
}
oldSysStatus = newSysStatus;
case sysStat_Startup:
LED_Status = LED_Startup;
break;
case sysStat_Normal:
timestamp = millis() + 1500;
LED_Status = LED_Confirm_Normal;
FastLED.setBrightness(64);
break;
case sysStat_Rain:
timestamp = millis() + 1500;
LED_Status = LED_Confirm_Rain;
FastLED.setBrightness(64);
break;
case sysStat_Purge:
LED_Status = LED_Purge;
break;
case sysStat_Error:
LED_Status = LED_Error;
break;
}
oldSysStatus = newSysStatus;
}
timer = millis();
switch (LED_Status)
@ -325,3 +322,12 @@ void LED_Process(tSystem_Status newSysStatus)
}
FastLED.show();
}
void DisplayProcess()
{
u8x8.setCursor(0, 3);
u8x8.printf("Dist.: %4d m\n", TravelDistance_highRes / 1000);
u8x8.printf("Purge: %4d\n", globals.purgePulses);
u8x8.printf("Tank: %4d ml\n", LubeConfig.tankRemain_µl / 1000);
u8x8.refreshDisplay();
}

View File

@ -1,6 +1,4 @@
#include <Arduino.h>
#include <ESPUI.h>
#include "config.h"
#include "webui.h"
uint16_t tab_lube;
uint16_t tab_wheel;
@ -21,6 +19,7 @@ uint16_t num_wheel_dist;
uint16_t num_tank_capacity;
uint16_t num_tank_notify;
uint16_t num_dose_per_pulse;
uint16_t label_tankRemain;
uint16_t button_reset_tank;
@ -51,11 +50,14 @@ void SettingChanged_Callback(Control *sender, int type)
LubeConfig.tankCapacity_ml = ESPUI.getControl(num_tank_capacity)->value.toInt();
else if (sender->id == num_tank_notify)
LubeConfig.TankRemindAtPercentage = ESPUI.getControl(num_tank_notify)->value.toInt();
else if (sender->id == num_dose_per_pulse)
LubeConfig.amountPerDose_µl = ESPUI.getControl(num_dose_per_pulse)->value.toInt();
}
void buttons_Callback(Control *sender, int type)
{
if (type != B_UP) return;
if (type != B_UP)
return;
if (sender->id == button_wheelcalc)
{
@ -66,19 +68,21 @@ void buttons_Callback(Control *sender, int type)
ESPUI.updateControlValue(num_wheel_dist, String(LubeConfig.DistancePerRevolution_mm));
}
if(sender->id == button_reset_tank)
if (sender->id == button_reset_tank)
{
LubeConfig.tankRemain_µl = LubeConfig.tankCapacity_ml * 1000;
ESPUI.print(label_tankRemain, String(LubeConfig.tankRemain_µl / 1000));
}
if(sender->id == button_purge)
if (sender->id == button_purge)
{
int pulses = ESPUI.getControl(num_purge_pulses)->value.toInt();
Serial.printf("Starting to Purge with %d pulses", pulses);
globals.purgePulses = pulses;
globals.resumeStatus = globals.systemStatus;
globals.systemStatus = sysStat_Purge;
}
if (sender->id == button_store)
{
StoreConfig_EEPROM();
@ -107,13 +111,14 @@ void initWebUI()
num_wheel_ratio = ESPUI.addControl(ControlType::Number, "Höhe/Breite-Verhältniss", String(LubeConfig.TireWidthHeight_Ratio), ControlColor::Peterriver, tab_wheel, &SettingChanged_Callback);
num_wheel_rim = ESPUI.addControl(ControlType::Number, "Felgendurchmesser (Zoll)", String(LubeConfig.RimDiameter_Inch), ControlColor::Peterriver, tab_wheel, &SettingChanged_Callback);
button_wheelcalc = ESPUI.addControl(ControlType::Button, "Abrollumfang aus Reifendaten berechnen", "Berechnen", ControlColor::Peterriver, tab_wheel, &buttons_Callback);
num_wheel_dist = ESPUI.addControl(ControlType::Number, "Wegstrecke pro Umdrehung (mm)", String(LubeConfig.DistancePerRevolution_mm), ControlColor::Wetasphalt, tab_wheel, &SettingChanged_Callback);
num_wheel_dist = ESPUI.addControl(ControlType::Number, "Wegstrecke pro Radumdrehung (mm)", String(LubeConfig.DistancePerRevolution_mm), ControlColor::Wetasphalt, tab_wheel, &SettingChanged_Callback);
num_wheel_ppr = ESPUI.addControl(ControlType::Number, "Sensorimpulse pro Umdrehung", String(LubeConfig.PulsePerRevolution), ControlColor::Wetasphalt, tab_wheel, &SettingChanged_Callback);
num_tank_capacity = ESPUI.addControl(ControlType::Number, "Tankinhalt maximal (ml)", String(LubeConfig.tankCapacity_ml), ControlColor::Carrot, tab_tank, &SettingChanged_Callback);
num_tank_notify = ESPUI.addControl(ControlType::Number, "Tankinhalt Warnung (%)", String(LubeConfig.TankRemindAtPercentage), ControlColor::Carrot, tab_tank, &SettingChanged_Callback);
num_dose_per_pulse = ESPUI.addControl(ControlType::Number, "Menge pro Pumpenimpuls (µl)", String(LubeConfig.amountPerDose_µl), ControlColor::Carrot, tab_tank, &SettingChanged_Callback);
label_tankRemain = ESPUI.addControl(ControlType::Label, "Tankinhalt verbleibend (ml, geschätzt)",String(LubeConfig.tankRemain_µl / 1000), ControlColor::Alizarin, tab_maintenance);
label_tankRemain = ESPUI.addControl(ControlType::Label, "Tankinhalt verbleibend (ml, geschätzt)", String(LubeConfig.tankRemain_µl / 1000), ControlColor::Alizarin, tab_maintenance);
button_reset_tank = ESPUI.addControl(ControlType::Button, "Tankinhalt zurücksetzen", "Reset", ControlColor::Alizarin, tab_maintenance, &buttons_Callback);
num_purge_pulses = ESPUI.addControl(ControlType::Number, "Entlüftung Impulse", "10", ControlColor::Alizarin, tab_maintenance);
button_purge = ESPUI.addControl(ControlType::Button, "Leitung Entlüften", "Start", ControlColor::Alizarin, tab_maintenance, &buttons_Callback);

View File

@ -2,6 +2,9 @@
#define _WEBUI_H_
#include <Arduino.h>
#include <ESPUI.h>
#include "config.h"
#include "globals.h"
void initWebUI();