Advertisement
Guest User

Untitled

a guest
Sep 24th, 2019
1,792
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.25 KB | None | 0 0
  1.  
  2.  
  3. //config
  4. #define Displaymode 1 // 1 use discharge curves, 2 displays battery voltage. 42% = 42V
  5. #define BattMin 5 // min 5% so it doesnt turn off on high load voltage drop.
  6. #define VMeasAvg 1000 //take average of 1000 measurements
  7. //
  8.  
  9. //discharge curves. ignore first two and last digits..
  10. //2800 = 28V = 0% 3850 = 38.5V = 80% ... adjust to your Cell behaviour under load
  11. int voltage_curve[] = {0,10, 2800, 3200, 3300, 3400, 3500, 3600, 3770, 3800, 3850, 3900, 4000, 5000};
  12. int liion_curve[] = {0,0, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 100};
  13.  
  14.  
  15. unsigned long v_sens;
  16. unsigned int v_sens_avg;
  17. unsigned int avg_ctr;
  18. long timer1;
  19.  
  20. //bike default data:
  21. byte data[] = {0xFF,0xFF,0x0E,0x06,0x64,0x19,0x01,0x7F,0x7F,0x7F,0x2A,0xF8,0x01,0x18,0x11,0x80,0x7F,0x7F,0x00};
  22.  
  23. void setup() {
  24. //
  25. Serial.begin(2400,SERIAL_8E1);
  26. //
  27.  
  28. }
  29.  
  30.  
  31. int multiMap(int val, int* _in, int* _out, uint8_t size)
  32. {
  33. if (val <= _in[0]) return _out[0];
  34. if (val >= _in[size-1]) return _out[size-1];
  35. uint8_t pos = 1;
  36. while(val > _in[pos]) pos++;
  37. if (val == _in[pos]) return _out[pos];
  38. return (val - _in[pos-1]) * (_out[pos] - _out[pos-1]) / (_in[pos] - _in[pos-1]) + _out[pos-1];
  39. }
  40.  
  41.  
  42. byte chksum(){ int _t = data[0]; for(byte i = 17;i>0;i--){ _t = _t - data[i]; } return ((_t % 256)+256); }
  43. int clamp(int _in, int _min, int _max){ if(_in > _max){_in = _max;} if(_in < _min){_in = _min;} return _in; }
  44. void sendData(){for(byte i = 0;i<=18;i++){ Serial.write(data[i]); }}
  45.  
  46. void loop() {
  47.  
  48. //
  49. //user code (DONT USE DELAY)
  50. //
  51.  
  52.  
  53. //
  54. //
  55. //
  56.  
  57. //
  58. // Input voltage meas and averaging
  59. //
  60. v_sens = v_sens + map(analogRead(A0),185,559,1000,3000); //V*100
  61. avg_ctr++;
  62. if(avg_ctr > VMeasAvg){
  63. v_sens_avg = v_sens/avg_ctr;
  64. v_sens = 0;
  65. avg_ctr=0;
  66. }
  67. //
  68. //
  69. //
  70.  
  71. //
  72. //combine data and send every 250ms
  73. //
  74. //data[4] = 0...100%
  75. //data[18] = checksum
  76. if(millis() > (timer1 + 250)){
  77. timer1 = millis();
  78. if(Displaymode == 1){ data[4] = clamp(multiMap(v_sens_avg, voltage_curve, liion_curve , 14),BattMin,100); }
  79. if(Displaymode == 2){ data[4] = clamp((v_sens_avg/100),BattMin,100); }
  80. data[18] = chksum();
  81. sendData();
  82. }
  83. //
  84. //
  85. //
  86.  
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement