Если условие не работает должным образом

В последнем условии в else if (см. код, помеченный ***), я не получаю экран со сбоем лазера/спеклке, если присутствуют оба флага сбоя 1 и флаг сбоя 5, однако вместо этого он показывает мне отказ лазера . Пожалуйста, помогите решить мою ошибку.

#include <UTFT.h>
#include <avr/pgmspace.h>
#include <SPI.h>
#include <avr/wdt.h>
extern uint8_t Retro8x16[];
extern unsigned int virtek3[];  //display pic
UTFT myDisplay(ST7735, 11, 13, 3, 2, 4);

int buttonhold = 0;
int state = HIGH;
int tim = 0;
int tim1 = 0;
int tim2 = 0;
int button = 1;

float volt = 0;
float volt1 = 0;
float volt2 = 0;
float volt3 = 0;
float volt4 = 0;
float volt5 = 0;
float volt6 = 0;
float volt7 = 0;
float volt8 = 0;
float volt9 = 0;
float volt10 = 0;
float volt11 = 0;
float volt12 = 0;
float volt13 = 0;
float volt14 = 0;
float volt15 = 0;
float volt16 = 0;
float volt17 = 0;
float volt18 = 0;
float volt19 = 0;
float volt20 = 0;
float volt21 = 0;
float vcc = 0.0;
float temp = 0.0;
float r1 = 10000.0;
float r2 = 2200.0;
int failflag = 0;

//void(* resetFunc) (void) = 0;

void setup()
{
    pinMode(18, INPUT);   //For NEXT button
    pinMode(20, OUTPUT);  //For Relay power
    pinMode(21, OUTPUT);  //For Relay power
    pinMode(14, INPUT);
    Serial.begin(9600);
    myDisplay.InitLCD();
    myDisplay.clrScr();
    myDisplay.setFont(Retro8x16);

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               digitalWrite(20, HIGH);
    digitalWrite(20, HIGH);
    digitalWrite(21, LOW);

    attachInterrupt(digitalPinToInterrupt(18), next, LOW);
    myDisplay.fillScr(255, 255, 255);
    myDisplay.drawBitmap(20, 1, 126, 126, virtek3, 1);

   while (1) {
    delay(100);
    if (state == LOW) {
    break;
    }
  }  
}

void next() {
    state = LOW;
    Serial.println(buttonhold);
    buttonhold++;
    if (buttonhold > 500) {
    //digitalWrite(21, LOW);
    resetFunc();   
    }
  }


void loop()
{
  digitalWrite(20, LOW);
 digitalWrite(21, LOW);   //Relay is ON.
  myDisplay.clrScr();
  state = HIGH;
  buttonhold = 0;
  while (1) {
    failflag = 0;
    float voltage_value = 0;

    myDisplay.setColor(0, 255, 255);
    myDisplay.print("1.Voltage Test", 35, 0);

    myDisplay.setColor(255, 255, 255);
    myDisplay.print("(V)", 0, 20);
    myDisplay.print("LASER",50,20);
    myDisplay.print("SPECKLE",100,20);

delay(1000);

      //FOR ANALOG A4 PIN
      //A4 pin connected to TP2 of speckle
      float volt_b = 0;
       float volt_c = 0;
       float volt_d = 0;
      for (int i = 0; i < 1000; i++) {
      volt_b =(volt_b + (4.99 / 1024 * analogRead(A4)));  
      }
      volt_b = volt_b / 1000;
      volt1 = volt_b / (r2 / (r1 + r2));

      myDisplay.setColor(255, 255, 255);
      myDisplay.print("TP2 :", 0, 38);                   

      myDisplay.setColor(0, 255, 255);
      myDisplay.print("NA", 60, 37);

      Serial.println(volt1);                      //ANALOG A4
      if (volt1 >= 5 && volt1 <= 7.30) {
      myDisplay.setColor(0, 255, 0);
      myDisplay.printNumF(volt1, 2, 120, 38);
      //myDisplay.print("  ", 130, 20);
      } else {   
      myDisplay.setColor(0, 0, 255);
      myDisplay.printNumF(volt1, 2, 120, 38);
      //myDisplay.print(" ", 150, 38);
      failflag = 1;
      }

      delay(2000);

      digitalWrite(20, HIGH);
      digitalWrite(21, LOW);
       delay(2000);

      //FOR ANALOG A4 PIN
      //A4 pin connected to TP2/L of SPECKLE

      for (int i = 0; i < 1000; i++) {
      volt_b =(volt_b + (4.99 / 1024 * analogRead(A4)));  
      }
      volt_b = volt_b / 1000;
      volt2 = volt_b / (r2 / (r1 + r2));

      myDisplay.setColor(255, 255, 255);
      myDisplay.print("TP2/L :", 0, 56);

      myDisplay.setColor(0, 255, 255);
      myDisplay.print("NA", 60, 56);

      Serial.println(volt2);                       //ANALOG A4
      if (volt2 >= 5 && volt2 <= 0.05) {
      myDisplay.setColor(0, 255, 0);
      myDisplay.printNumF(volt2, 2, 120, 56);
      //myDisplay.print("  ", 130, 20);
      } else {   
      myDisplay.setColor(0, 0, 255);
      myDisplay.printNumF(volt2, 2, 120, 56);
      //myDisplay.print(" ", 150, 56);
      failflag = 1;
      }

      //FOR ANALOG A1 PIN
      //A1 pin connected to J1_1 of SENSOR
      volt = analogRead(A1);
      volt3 =(volt * 4.8) /1024;

      myDisplay.setColor(255, 255, 255);
      myDisplay.print("J1_1 :", 0, 74);

      Serial.println(volt3);                 //ANALOG A1
      if (volt3 >= 0 && volt3 <= 5.25) {
      myDisplay.setColor(0, 255, 0);
      myDisplay.printNumF(volt3, 2, 60, 74);
      //myDisplay.print("  ", 130, 20);
      } else {   
      myDisplay.setColor(0, 0, 255);
      myDisplay.printNumF(volt3, 2, 60, 74);
      //myDisplay.print(" ", 150, 74);
      failflag = 5;
      }

      myDisplay.setColor(0, 255, 255);
      myDisplay.print("NA", 125, 74);


      //FOR ANALOG A0 PIN
      //A0 pin connected to J2_2 of SENSOR

      for (int i = 0; i < 1000; i++) {
      volt_b =(volt_b + (4.99 / 1024 * analogRead(A0)));  
      }
      volt_b = volt_b / 1000;
      volt4 = volt_b / (r2 / (r1 + r2));

    //volt4 = volt_c - 2.7;

      myDisplay.setColor(255, 255, 255);
      myDisplay.print("J2_2 :", 0, 92);

      Serial.println(volt4);                //ANALOG A0
      if (volt4 >= 5 && volt4 <= 8.82) {
      myDisplay.setColor(0, 255, 0);
      myDisplay.printNumF(volt4, 2, 60, 92);
      //myDisplay.print("  ", 130, 20);
      } else {
      myDisplay.setColor(0, 0, 255);
      myDisplay.printNumF(volt4, 2, 60, 92);
      //myDisplay.print(" ", 150, 92);
      failflag = 5;
      }

      myDisplay.setColor(0, 255, 255);
      myDisplay.print("NA", 125, 93);

      digitalWrite(20, LOW);
      digitalWrite(20, LOW);
      delay(2000);

      if (failflag == 5) {
      myDisplay.setColor(0, 0, 255);
      myDisplay.print("LASER FAIL", 35, 108);
      delay(4000);
      state = 0;

      }

      else if (failflag == 1) {
      myDisplay.setColor(0, 0, 255);
      myDisplay.print("SPECKLE FAIL", 35, 108);
      delay(40000);
      state = 0;

      }

 // *** Here the condition not working START
    else if ((failflag == 5) && (failflag == 1)) {
      myDisplay.setColor(0, 0, 255);
      myDisplay.print("LASER/SPECKLE FAIL", 15, 108);
      delay(40000);
      state = 0;
      }
  // *** Here the condition not working END

, 👍0

Обсуждение

что должна делать программа? .... чего вы ожидаете? .... что на самом деле происходит? .... вы получаете какие-либо ошибки?, @jsotola


2 ответа


5
(failflag == 5) && (failflag == 1))

failflag не может быть одновременно равен 5 и 1.

,

1

Поскольку вы запрашиваете два разных задания для одной и той же переменной, это никогда не работало таким образом. Два быстрых варианта:
Выполнить двоичное сложение

 failflag = 0;
 if(errorA) failflag += 1;
 if(errorB) failflag += 2;
 if(errorC) failflag += 4;
 if(errorD) failflag += 8;

//тогда вы можете декодировать комбинированные ошибки следующим образом
else if (failflag == 13) {
    Serial.println("Errors: A, C, D"); // 1 + 4 + 8 =13
}

Другой быстрый способ — определить флаг ошибки как логический массив

bool failflag [5] = {00000}; // 5 элементов

 if(errorA) failflag [0]= 1;
 if(errorB) failflag [1]= 1;
 if(errorC) failflag [2]= 1;
 if(errorD) failflag [3]= 1;

//тогда вы можете декодировать комбинированные ошибки следующим образом
else if ( failflag [0] == 1 &&  failflag [2]== 1 && failflag [3]== 1) {
    Serial.println("Errors: A, C, D"); // 1 + 4 + 8 =13
}

поскольку у нас есть failflag[i] в качестве логического значения, мы можем сократить код до

else if ( failflag [0] && failflag [2] && failflag [3]) {
    Serial.println("Errors: A, C, D"); // 1 + 4 + 8 =13
}

Все, что соответствует вашим потребностям. Как я уже сказал, только 2 быстрых
Обновление Уборка, вы сомневаетесь в том, что нужно изменить:
Избавьтесь от delay() (за исключением инициализации вашего оборудования и цикла во время отладки).

21 переменная с плавающей запятой может храниться в массиве с плавающей запятой

 float myFloatVars [22]

и записать значения в позицию

 myFloatVars [11] = myMeasureFunction();

вы можете сделать это даже в цикле for, выполняющем повторяющуюся функцию FIFO (своего рода кольцевой буфер), первое сохраненное значение сбрасывается, если массив заполнен, чтобы поместить следующее. Таким образом, вы можете создать "скользящее" среднее, что вам и нужно

,

тип данных bool — истина/ложь, поэтому проверка if (failflag [0]) или if (!failflag [0]) .... if (failflag [0]== 1) эквивалентна if (true==true), что избыточно, @jsotola

Ваша правильная ошибка копирования и вставки. изменил его на true, чтобы OP видел, что происходит - избыточность помогает понять новичкам. Спасибо за орлиный взгляд, @Codebreaker007

примечание: нулевое завершение используется для строк, а не для числовых массивов, @jsotola

это в интересах OP .... if(errorA) failflag [0]= 1; можно заменить на failflag[0] = errorA, но только если failflag[0] не установлен несколькими источниками, @jsotola

Большое спасибо . Я использую логический массив, и он работает. Очень ценю тебя, легенда!, @paxhi

Пожалуйста, отметьте как решенное/принятое Спасибо., @Codebreaker007