티스토리 뷰

#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;
  }  
}

 

 

반응형
반응형
250x250
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/09   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함