fix signed unsigned warnings

This commit is contained in:
interfisch 2023-04-22 14:49:37 +02:00
parent d048c44b75
commit 75b720f564
2 changed files with 79 additions and 29 deletions

View File

@ -18,4 +18,5 @@ monitor_speed = 9600
lib_deps=
bogde/HX711@^0.7.5
marcoschwartz/LiquidCrystal_I2C@^1.1.4
https://github.com/arduino-libraries/Servo
https://github.com/arduino-libraries/Servo
https://github.com/emilv/ArduinoSort/

View File

@ -6,6 +6,7 @@
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoSort.h>
#define EEPROMVERSION 1
@ -82,10 +83,10 @@ String receivedString ="";
char tempstring[16]; //for dtostrf
long time_lastlcd=0;
long looptimelcd_margin=0; //if >0 loop took longer than expected
unsigned long time_lastlcd=0;
unsigned long looptimelcd_margin=0; //if >0 loop took longer than expected
uint8_t fps=DEFAULT_FPS; //EEPROM
long time_lcdwait=1000/fps;
unsigned long time_lcdwait=1000/fps;
String lcd0=""; //lcd line 0
String lcd1=""; // " 1
#define LCD_BACKLIGHT_TIME 20000
@ -96,17 +97,18 @@ uint32_t lcd_backlight_offtimer=0;
String lcd0_buffer="";
String lcd1_buffer="";
long time_lastadc=0;
long looptimeadc_margin=0;
unsigned long time_lastadc=0;
unsigned long looptimeadc_margin=0;
uint8_t spsadc=DEFAULT_SPSADC; //eeprom
long time_adcwait=1000/spsadc;
unsigned long time_adcwait=1000/spsadc;
int adc_readings=1; //ca. 700ms for 5 readings, ca 75ms for 1 reading, readings=1 10times = 747ms
double weight=0;
#define ADCMEDIANVALUES_MAX 31 //needs to be uneven, maximum number, for array declaration
double weightseries[ADCMEDIANVALUES_MAX]; //last n values for median filter
int adcmedianvalues=DEFAULT_ADCMEDIANVALUES; //needs to be uneven //eeprom
int adcmedianposition=0;
float weightseries[ADCMEDIANVALUES_MAX]; //last n values for median filter
uint16_t adcmedianvalues=DEFAULT_ADCMEDIANVALUES; //needs to be uneven //eeprom
float adcFilterKeepMedianvaluesFactor=0.8; //how many lowest and highest values will be removed from the array before avaraging (as factor). 0.0 means only median is used. 1.0 means all values are used.
uint16_t adcmedianposition=0;
float calibrationWeight=100; //gramms
@ -170,11 +172,12 @@ String toString(double w,uint8_t dec);
String toString(double w);
String toWeightString(double w,uint8_t dec,uint8_t len);
String toWeightString(double w);
double getWeightSeriesMax();
double getWeightSeriesMin();
float getWeightSeriesMax();
float getWeightSeriesMin();
double getWeightMedian();
double getVoltage();
double getCurrent();
double getWeightFiltered();
float getVoltage();
float getCurrent();
String menuentry_string();
void menuentry_set(uint8_t presstype);
void menuentry_back(uint8_t presstype);
@ -311,7 +314,8 @@ void loop() {
}
lcd0=toStringBar(weight,0,1000);
//lcd1=toWeightString(weight)+"g";
lcd1=toWeightString(getWeightMedian())+"g";
//lcd1=toWeightString(getWeightMedian())+"g";
lcd1=toWeightString(getWeightFiltered())+"g";
//___
if (btn_back_press==2){ //press BACK to tare
@ -883,7 +887,7 @@ String menuentry_string(){ //second line string if entry selected
return s;
}
double getCurrent()
float getCurrent()
{
uint16_t _current=0;
for (uint8_t i=0;i<N_CURRENTREADINGS;i++){
@ -893,7 +897,7 @@ double getCurrent()
return _current*CURRENTMULTIPLIER+0.00001;
}
double getVoltage()
float getVoltage()
{
return analogRead(PIN_VOLTAGE)*VOLTAGEMULTIPLIER+0.00001;
}
@ -901,14 +905,14 @@ double getVoltage()
double getWeightMedian() //return median weight from weightseries
{
boolean mask[adcmedianvalues]; //true=disabled value
for (int i=0;i<adcmedianvalues;i++)
for (uint16_t i=0;i<adcmedianvalues;i++)
mask[i]=false;
double cmin=MAXDOUBLEVALUE; int cmin_i=0;
double cmax=0; int cmax_i=0;
float cmin=MAXDOUBLEVALUE; uint16_t cmin_i=0;
float cmax=0; uint16_t cmax_i=0;
while(cmin!=cmax){ //stop when only one value left
cmin=MAXDOUBLEVALUE;
cmax=-MAXDOUBLEVALUE-1;
for (int i=0;i<adcmedianvalues;i++){
for (uint16_t i=0;i<adcmedianvalues;i++){
if (!mask[i]){
if (weightseries[i]<cmin){
cmin=weightseries[i];
@ -927,19 +931,64 @@ double getWeightMedian() //return median weight from weightseries
return cmax;
}
double getWeightSeriesMin()
double getWeightFiltered() {
boolean mask[adcmedianvalues]; //true=disabled value
for (uint16_t i=0;i<adcmedianvalues;i++)
mask[i]=false;
float cmin=MAXDOUBLEVALUE; uint16_t cmin_i=0;
float cmax=0; uint16_t cmax_i=0;
//while(cmin!=cmax){ //stop when only one value left
uint16_t _valuesLeft=adcmedianvalues;
while (_valuesLeft>2 && _valuesLeft>(uint16_t)(adcmedianvalues*adcFilterKeepMedianvaluesFactor))
{
cmin=MAXDOUBLEVALUE;
cmax=-MAXDOUBLEVALUE-1;
for (uint16_t i=0;i<adcmedianvalues;i++){
if (!mask[i]){
if (weightseries[i]<cmin){
cmin=weightseries[i];
cmin_i=i;
}
if (weightseries[i]>cmax){
cmax=weightseries[i];
cmax_i=i;
}
}
}
mask[cmin_i]=true;
mask[cmax_i]=true;
_valuesLeft-=2; //2 values have been masked out
}
double sum=0;
uint16_t meanvalues=0;
for (uint16_t i=0;i<adcmedianvalues;i++){
if (!mask[i]) { //not masked out
sum+=weightseries[i];
meanvalues++;
}
}
return sum/meanvalues;
}
float getWeightSeriesMin()
{
double cmin=MAXDOUBLEVALUE;
for (int i=0;i<adcmedianvalues;i++){
float cmin=MAXDOUBLEVALUE;
for (uint16_t i=0;i<adcmedianvalues;i++){
if (weightseries[i]<cmin)
cmin=weightseries[i];
}
return cmin;
}
double getWeightSeriesMax()
float getWeightSeriesMax()
{
double cmax=0;
for (int i=0;i<adcmedianvalues;i++){
float cmax=0;
for (uint16_t i=0;i<adcmedianvalues;i++){
if (weightseries[i]>cmax)
cmax=weightseries[i];
}
@ -1087,7 +1136,7 @@ uint16_t EEPROMReadInt(uint8_t paddr){
void EEPROMWriteDouble(int ee, double value)
{
byte* p = (byte*)(void*)&value;
for (int i = 0; i < sizeof(value); i++)
for (uint16_t i = 0; i < sizeof(value); i++)
EEPROM.write(ee++, *p++);
}
@ -1095,7 +1144,7 @@ double EEPROMReadDouble(int ee)
{
double value = 0.0;
byte* p = (byte*)(void*)&value;
for (int i = 0; i < sizeof(value); i++)
for (uint16_t i = 0; i < sizeof(value); i++)
*p++ = EEPROM.read(ee++);
return value;
}