BilientSevices/Measurement&Monitoring
Firmware for BatteryTester
tothebeyond
2026. 8. 29. 11:19

#include <Wire.h>
#define ADDRESS_THISSLAVE 0x24
#define NUMBER_I2CBYTES 2
#define PIN_ChargeON 8
#define PIN_DischargeON 9
#define PIN_PWM 10
#define PIN_INDICATORLED LED_BUILTIN
int PWM_Value = 0;
int PWM_Direction = 1;
char DeviceMode = 'M';
byte ReceivedBytes[NUMBER_I2CBYTES];
boolean IsI2CReceived = false;
unsigned long PreMilisecond = 0;
unsigned long StartTime_IndicatorLED = 0;
void _receiveEvent(int numBytes){
// 'C', 123
int i=0;
String rxString = "";
IsI2CReceived = false;
while(Wire.available() && (i<NUMBER_I2CBYTES)){
ReceivedBytes[i] = Wire.read();
rxString += String(char(ReceivedBytes[i]));
i++;
}
while(i<numBytes){
Wire.read();
i++;
}
Serial.println(rxString);
if(i<NUMBER_I2CBYTES) return;
IsI2CReceived = true;
DeviceMode = char(ReceivedBytes[0]);
int pwmValue = int(ReceivedBytes[1]);
boolean isChargeON = false;
boolean isDischargeON = false;
switch(DeviceMode){
case 'C': // Charge
isChargeON = true;
PWM_Direction = 0;
break;
case 'D': // Discharge
isDischargeON = true;
PWM_Direction = 0;
break;
case 'O': // OFF
break;
case 'M': // Monitoring
PWM_Direction = 1;
break;
case 'A': // Ack
digitalWrite(PIN_INDICATORLED, LOW);
StartTime_IndicatorLED = millis();
PWM_Direction = 0;
break;
default:
break;
}
digitalWrite(PIN_ChargeON, LOW);
delay(2);
digitalWrite(PIN_DischargeON, LOW);
PWM_Value = pwmValue;
if(pwmValue>255) pwmValue = 255;
analogWrite(PIN_PWM, PWM_Value);
delay(23);
if(isChargeON) digitalWrite(PIN_ChargeON, HIGH);
if(isDischargeON) digitalWrite(PIN_DischargeON, HIGH);
PreMilisecond = 0;
}
void _responseEvent(){ // Send 3 bytes
Wire.write(ADDRESS_THISSLAVE);
Wire.write(byte(DeviceMode));
Wire.write(byte(PWM_Value));
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Wire.begin(ADDRESS_THISSLAVE);
// Wire.setClock(100000L);
Wire.onReceive(_receiveEvent);
Wire.onRequest(_responseEvent);
pinMode(PIN_ChargeON, OUTPUT);
pinMode(PIN_DischargeON, OUTPUT);
pinMode(PIN_PWM, OUTPUT);
pinMode(PIN_INDICATORLED, OUTPUT);
analogWrite(PIN_PWM, 128);
digitalWrite(PIN_ChargeON, LOW);
digitalWrite(PIN_DischargeON, LOW);
}
void loop() {
// put your main code here, to run repeatedly:
if((millis() - StartTime_IndicatorLED)>500) digitalWrite(PIN_INDICATORLED, HIGH);
if((millis()-PreMilisecond)<5000) return;
PreMilisecond = millis();
// analogWrite(PIN_PWM, PWM_Value);
PWM_Value = PWM_Value + PWM_Direction*10;
if(PWM_Direction>0){
if(PWM_Value>250) PWM_Direction = -1;
}else if(PWM_Direction<0){
if(PWM_Value<10) PWM_Direction = 1;
}
}
반응형