add volume log fix for linear potentiometer
This commit is contained in:
parent
fe83cff969
commit
1696e1f04d
|
@ -36,6 +36,9 @@ void changeRelaisByNumberTopic(uint8_t pn, String pTopicPrefix, uint8_t pindex,
|
|||
void setRelaisByNumber(uint8_t pn, String pTopicPrefix, uint8_t pnumber, bool pstate, void (*psetXChannel) (uint8_t, boolean));
|
||||
float getSetVolume();
|
||||
uint8_t getIndex(uint8_t pn, String pTopic);
|
||||
float mapPotiToVolume(int p);
|
||||
int mapVolumeToPoti(float v);
|
||||
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max);
|
||||
|
||||
#define LEDPIN 9 //PB1 = D9 = Pin15
|
||||
#define NUMLED 9
|
||||
|
@ -97,7 +100,7 @@ uint16_t srbits=0;
|
|||
|
||||
#include <Encoder.h>
|
||||
Encoder volEnc(PIN_ENCA,PIN_ENCB);
|
||||
float encoderMultiplier=4.0;
|
||||
float encoderMultiplier=0.4;
|
||||
int volEncVel=0;
|
||||
|
||||
//Servo stuff
|
||||
|
@ -115,6 +118,7 @@ int _motormove;
|
|||
#define POTIFILTER 0.5 //0 to 1. 1 means old value stays forever
|
||||
#define MAX_MOTOR_PWM 255 //0 to 255. Maximum pwm to output
|
||||
|
||||
float poti_volume_set=0; //set value as volume (poti is linear, volume is log). [0.0, 100.0]
|
||||
int poti_set; //set value, initial value will be read from poti
|
||||
int poti_read=0; //read value from poti
|
||||
boolean poti_reachedposition=true; //set to true if position reached. after that stop turning
|
||||
|
@ -253,6 +257,7 @@ void setup() {
|
|||
|
||||
|
||||
poti_set=analogRead(PIN_POT);
|
||||
poti_volume_set=round(mapPotiToVolume(poti_set));
|
||||
|
||||
#ifdef DEBUG
|
||||
Serial.println("Ready");
|
||||
|
@ -402,7 +407,9 @@ void loop() {
|
|||
if (volEncVel!=0){ //knob moved
|
||||
switch(menu_mode) {
|
||||
case 0: //volume
|
||||
poti_set+=volEncVel*encoderMultiplier; //change poti set value
|
||||
poti_volume_set+=volEncVel*encoderMultiplier; //change poti set value
|
||||
poti_volume_set=constrain(poti_volume_set, 0.0,100.0);
|
||||
poti_set=mapVolumeToPoti(poti_volume_set);
|
||||
poti_set=constrain(poti_set, POT_MIN,POT_MAX);
|
||||
poti_reachedposition=false;
|
||||
flag_publishCurrentSetVolume=true;
|
||||
|
@ -640,9 +647,9 @@ void callback(char* topic, byte* payload, unsigned int length) {
|
|||
|
||||
if (String(topic).equals("audiomixer/volume/set")){
|
||||
float _floatvalue = spayload.toFloat();
|
||||
_floatvalue=constrain(_floatvalue,0.0,100.0);
|
||||
poti_volume_set=constrain(_floatvalue,0.0,100.0); //set new poti position
|
||||
|
||||
poti_set=constrain(map(_floatvalue,0.0,100.0,POT_MIN,POT_MAX),POT_MIN,POT_MAX); //set new poti position
|
||||
poti_set=mapVolumeToPoti(poti_volume_set);
|
||||
poti_reachedposition=false; //aim for new position
|
||||
|
||||
publishCurrentSetVolume();
|
||||
|
@ -818,5 +825,28 @@ void setRelaisByNumber(uint8_t pn, String pTopicPrefix, uint8_t pnumber, bool ps
|
|||
|
||||
|
||||
float getSetVolume() {
|
||||
return map(poti_set,POT_MIN,POT_MAX, 0.0,100.0); //get percentage from set poti value
|
||||
//return map(poti_volume_set,POT_MIN,POT_MAX, 0.0,100.0); //get percentage from set poti value
|
||||
return poti_volume_set;
|
||||
}
|
||||
|
||||
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
|
||||
{
|
||||
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
||||
}
|
||||
|
||||
#define STEEPNESS 10.0 //has to be a float!
|
||||
int mapVolumeToPoti(float v) {
|
||||
v=v/100.0;
|
||||
//volume is [0.,100.]
|
||||
//poti is [POTI_MIN,POTI_MAX]
|
||||
float pout=(pow(STEEPNESS,v)-1)/(STEEPNESS-1);
|
||||
return mapfloat(pout,0.0,1.0, POT_MIN, POT_MAX);
|
||||
}
|
||||
|
||||
float mapPotiToVolume(int p) {
|
||||
//volume is [0.,100.]
|
||||
//poti is [POTI_MIN,POTI_MAX]
|
||||
float pmapped=mapfloat((float)p,POT_MIN,POT_MAX,0.0,1.0);
|
||||
return (log((STEEPNESS-1)*( pmapped+(1/(STEEPNESS-1)) ))/log(STEEPNESS))*100.0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue