└── Regenerative braking for ev /Regenerative braking for ev: -------------------------------------------------------------------------------- 1 | #include //Library for I2C lcd 2 | LiquidCrystal_I2C lcd(0x27,20,4); 3 | 4 | #define ON 1 5 | #define OFF 0 6 | #define CC_MODE 1 7 | #define CV_MODE 0 8 | #define OUTPUT_RELAY1 2 9 | #define OUTPUT_RELAY2 3 10 | #define Blinker 8 11 | 12 | float EMF_BAT1 = 0; 13 | float EMF_BAT2 = 0; 14 | int EMF_MIN = 350; 15 | int EMF_MAX = 360; 16 | int Relay1status = CV_MODE; 17 | int Relay2status = CV_MODE; 18 | char TEMP_STR[10]; 19 | 20 | 21 | void setBlinker ( int status ) 22 | { 23 | if (status) //== on 24 | digitalWrite(Blinker,HIGH); 25 | else // off 26 | digitalWrite(Blinker,LOW); 27 | } 28 | 29 | void setRelay1 ( int status ) 30 | { 31 | 32 | Relay1status = status; 33 | if (status) //== on 34 | digitalWrite(OUTPUT_RELAY1,HIGH); 35 | else // off 36 | digitalWrite(OUTPUT_RELAY1,LOW); 37 | 38 | } 39 | //=============================================================== 40 | void setRelay2 ( int status ) 41 | { 42 | Relay2status = status; 43 | if (status) //== on 44 | digitalWrite(OUTPUT_RELAY2,HIGH); 45 | else // off 46 | digitalWrite(OUTPUT_RELAY2,LOW); 47 | 48 | } 49 | 50 | void setup() { 51 | Serial.begin(9600); 52 | lcd.begin(); //initialization the lcd 53 | lcd.backlight(); 54 | pinMode(OUTPUT_RELAY1, OUTPUT); 55 | pinMode(OUTPUT_RELAY2, OUTPUT); 56 | lcd.setCursor(0,0); 57 | lcd.print("LiFePO4 Charger"); 58 | delay(2000); 59 | lcd.clear(); 60 | } 61 | 62 | void loop() { 63 | setBlinker(OFF); 64 | delay(100); 65 | setBlinker(ON); 66 | delay(100); 67 | int Value1 = analogRead(A0); 68 | int Value2 = analogRead(A1); 69 | EMF_BAT1 = Value1 * ((10.0)/1023.0); 70 | EMF_BAT2 = Value2 * ((10.0)/1023.0); 71 | Serial.println(EMF_BAT1); 72 | Serial.println(EMF_BAT2); 73 | lcd.setCursor(0,0); 74 | lcd.print("BAT1:"); 75 | if(Relay1status == CC_MODE && Value1>600) 76 | { 77 | lcd.print(F("FULL/ABSENT")); 78 | setRelay1(CV_MODE); 79 | } 80 | else if(Relay1status == CV_MODE && Value1>=430) 81 | { 82 | lcd.print(F("FULL/ABSENT")); 83 | setRelay1(CV_MODE); 84 | } 85 | else if(Value1<250) 86 | { 87 | lcd.print(EMF_BAT1); 88 | lcd.print (F("DEAD/ERR ")); 89 | setRelay1(CV_MODE); 90 | } 91 | else if(Value1>345) 92 | { 93 | lcd.print(EMF_BAT1); 94 | lcd.print (F("V CV ")); 95 | setRelay1(CV_MODE); 96 | } 97 | else if(Value1<=345) 98 | { 99 | lcd.print(EMF_BAT1); 100 | lcd.print (F("V CC ")); 101 | setRelay1(CC_MODE); 102 | } 103 | 104 | 105 | lcd.setCursor(0,1); 106 | lcd.print("BAT2:"); 107 | if(Relay2status == CC_MODE && Value2>600) 108 | { 109 | lcd.print(F("FULL/ABSENT")); 110 | setRelay2(CV_MODE); 111 | } 112 | else if(Relay2status == CV_MODE && Value2>=430) 113 | { 114 | lcd.print(F("FULL/ABSENT")); 115 | setRelay2(CV_MODE); 116 | } 117 | else if(Value2<250) 118 | { 119 | lcd.print(EMF_BAT2); 120 | lcd.print (F("DEAD/ERR ")); 121 | setRelay2(CV_MODE); 122 | } 123 | else if(Value2>345) 124 | { 125 | lcd.print(EMF_BAT2); 126 | lcd.print (F("V CV ")); 127 | setRelay2(CV_MODE); 128 | } 129 | else if(Value2<=345) 130 | { 131 | lcd.print(EMF_BAT2); 132 | lcd.print (F("V CC ")); 133 | setRelay2(CC_MODE); 134 | } 135 | 136 | } 137 | --------------------------------------------------------------------------------