Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //config
- #define Displaymode 1 // 1 use discharge curves, 2 displays battery voltage. 42% = 42V
- #define BattMin 5 // min 5% so it doesnt turn off on high load voltage drop.
- #define VMeasAvg 1000 //take average of 1000 measurements
- //
- //discharge curves. ignore first two and last digits..
- //2800 = 28V = 0% 3850 = 38.5V = 80% ... adjust to your Cell behaviour under load
- int voltage_curve[] = {0,10, 2800, 3200, 3300, 3400, 3500, 3600, 3770, 3800, 3850, 3900, 4000, 5000};
- int liion_curve[] = {0,0, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 100};
- unsigned long v_sens;
- unsigned int v_sens_avg;
- unsigned int avg_ctr;
- long timer1;
- //bike default data:
- byte data[] = {0xFF,0xFF,0x0E,0x06,0x64,0x19,0x01,0x7F,0x7F,0x7F,0x2A,0xF8,0x01,0x18,0x11,0x80,0x7F,0x7F,0x00};
- void setup() {
- //
- Serial.begin(2400,SERIAL_8E1);
- //
- }
- int multiMap(int val, int* _in, int* _out, uint8_t size)
- {
- if (val <= _in[0]) return _out[0];
- if (val >= _in[size-1]) return _out[size-1];
- uint8_t pos = 1;
- while(val > _in[pos]) pos++;
- if (val == _in[pos]) return _out[pos];
- return (val - _in[pos-1]) * (_out[pos] - _out[pos-1]) / (_in[pos] - _in[pos-1]) + _out[pos-1];
- }
- byte chksum(){ int _t = data[0]; for(byte i = 17;i>0;i--){ _t = _t - data[i]; } return ((_t % 256)+256); }
- int clamp(int _in, int _min, int _max){ if(_in > _max){_in = _max;} if(_in < _min){_in = _min;} return _in; }
- void sendData(){for(byte i = 0;i<=18;i++){ Serial.write(data[i]); }}
- void loop() {
- //
- //user code (DONT USE DELAY)
- //
- //
- //
- //
- //
- // Input voltage meas and averaging
- //
- v_sens = v_sens + map(analogRead(A0),185,559,1000,3000); //V*100
- avg_ctr++;
- if(avg_ctr > VMeasAvg){
- v_sens_avg = v_sens/avg_ctr;
- v_sens = 0;
- avg_ctr=0;
- }
- //
- //
- //
- //
- //combine data and send every 250ms
- //
- //data[4] = 0...100%
- //data[18] = checksum
- if(millis() > (timer1 + 250)){
- timer1 = millis();
- if(Displaymode == 1){ data[4] = clamp(multiMap(v_sens_avg, voltage_curve, liion_curve , 14),BattMin,100); }
- if(Displaymode == 2){ data[4] = clamp((v_sens_avg/100),BattMin,100); }
- data[18] = chksum();
- sendData();
- }
- //
- //
- //
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement