Thanks Delta_G
I hope that attached code is OK
as i said, add more line is just for test
And i find out if i add more than one line
then the result will not be what i want
ledStatus:0
relayStatus:1
while if i only have one line here, the result would be
led Relay Status:1
since both ledStaus and relayStatus should be the same
below is another sketch that i test those function separately and they works as i expected with the same test condition
#define LED_1 A12
#define LED_2 A7
#define LED_3 A8
#define LED_4 A10
#define LED_5 A6
#define LED_6 A5
#define LED_7 A11
#define LED_8 A9
#define RD_RELAY1 36
#define RD_RELAY2 31
#define RD_RELAY3 33
#define RD_RELAY4 30
#define RD_RELAY5 37
#define RD_RELAY6 34
#define RD_RELAY7 35
#define RD_RELAY8 32
#define LED_ON 1
#define LED_OFF 0
#define LED_SENSOR_ACTIVE 100
#define LED_SENSOR_DEACTIVE 1000
#define SENSOR_ACTIVE_THRESHOLD 60
#define SENSOR_DEACTIVE_THRESHOLD 500
#define READ_RELAY_FAIL 0X01
#define CHECK_RELAY_FAIL 0X02
#define RELAY_TEST_FAIL 0X01
#define RELAY_TEST_PASS 0x02
#define DISABLE 0X01
#define ENABLE 0X02
#define LED_GREEN 0x01
#define LED_RED 0x02
uint8_t checkRelayResult[9]={0x00,0x01,0x03,0x05,0x09,0x11,0x21,0x41,0x81};
uint8_t ledBuf[]={LED_1,LED_2,LED_3,LED_4,LED_5,LED_6,LED_7,LED_8};
uint8_t relayBuf[8]={RD_RELAY1,RD_RELAY2,RD_RELAY3,RD_RELAY4,RD_RELAY5,RD_RELAY6,RD_RELAY7,RD_RELAY8};
void setup() {
// put your setup code here, to run once:
pinMode(45,OUTPUT);
digitalWrite(45,HIGH);
Serial.begin(115200);
}
uint16_t readADC(uint16_t analogPort){
uint16_t temp=0,sum,maxVal=0,minVal=1024;
for(char i=0;i<10;i++){
temp=analogRead(analogPort);
sum+=temp;
if(maxVal<temp)
maxVal=temp;
if(minVal>temp)
minVal= temp;
delay(2);
}
sum-=(minVal+maxVal);
sum>>=3;
return sum;
}
boolean LEDStateJudge(uint16_t ledValue){
uint16_t value_H,value_L;
value_H = LED_SENSOR_ACTIVE+SENSOR_ACTIVE_THRESHOLD;
value_L = LED_SENSOR_ACTIVE-SENSOR_ACTIVE_THRESHOLD;
if((ledValue<=LED_SENSOR_ACTIVE))
return LED_ON;
value_H = LED_SENSOR_DEACTIVE+SENSOR_DEACTIVE_THRESHOLD;
value_L = LED_SENSOR_DEACTIVE-SENSOR_DEACTIVE_THRESHOLD;
if((ledValue>=value_L)&&(ledValue<=value_H))
return LED_OFF;
return LED_OFF;
}
boolean readLEDStatus(uint16_t whichLED){
uint16_t temp;
boolean result=0;
temp = readADC(whichLED);
result = LEDStateJudge(temp);
return result;
}
boolean readRelay(uint8_t whichRelay){
return digitalRead(whichRelay);
}
//check all the relay status together
uint8_t checkAllRelayStatus(void){
uint8_t ledStatus=0;
uint8_t relayStatus=0;
for(char i=0;i<8;i++){
ledStatus>>=1;
relayStatus>>=1;
if(readLEDStatus(ledBuf[i])!=0){
ledStatus|=0x80;
}
if(readRelay(relayBuf[i])!=0)
relayStatus|=0x80;
}
//Serial.println(ledStatus,BIN);
// Serial.println(relayStatus,BIN);
if(relayStatus!=ledStatus){
Serial.print("Fail: ALL the LED status is:");
Serial.println(ledStatus,BIN);
Serial.print("Fail: ALL the relay status is:");
Serial.println(relayStatus,BIN);
return READ_RELAY_FAIL;
}
Serial.print("PASS: ALL the relay status is:");
Serial.println(relayStatus,BIN);
return relayStatus;
}
uint8_t checkRelayStatus(uint8_t whichRelay){
uint8_t ledStatus=0;
uint8_t relayStatus=0;
uint8_t temp=0;
for(char i=0;i<8;i++){
ledStatus>>=1;
relayStatus>>=1;
if(readLEDStatus(ledBuf[i])!=0){
ledStatus|=0x80;
}
if(readRelay(relayBuf[i])!=0)
relayStatus|=0x80;
}
if(ledStatus==relayStatus){
Serial.print("led Relay Status:");
Serial.println(ledStatus,BIN);
return relayStatus;
}else{
Serial.print("ledStatus:");
Serial.println(ledStatus,BIN);
Serial.print("relayStatus:");
Serial.println(relayStatus,BIN);
}
}
void loop() {
// put your main code here, to run repeatedly:
uint16_t adc=0;
uint8_t val = 0;
uint8_t testStage = 1;
uint8_t relayNum=0;
unsigned long duration = millis();
while(1){
if(testStage==1){
testStage = 2;
//some other code here
duration = millis(); //start the record the time.
}else if(testStage==2){
testStage = 3;
//some other code here
duration = millis();
}else if(testStage==3){
val = checkRelayStatus(relayNum);
Serial.println(val,BIN);
delay(100);
if(millis()-duration>=2000){
testStage = 2;
relayNum++;
}
}
}
checkRelayStatus(1);
delay(500);
Serial.println("---");
}