Если условие не работает должным образом
В последнем условии в 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
@paxhi, 👍0
Обсуждение2 ответа
Поскольку вы запрашиваете два разных задания для одной и той же переменной, это никогда не работало таким образом. Два быстрых варианта:
Выполнить двоичное сложение
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
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- ошибка: ожидаемое первичное выражение перед токеном ','
- Ввести идентификатор чипа ESP32 в строковую переменную (новичок в Arduino/C++)
- Передача функции-члена класса в качестве аргумента
- Улучшенное циклическое переключение цветов RGB.
- Какие есть другие IDE для Arduino?
- Несовместимые типы при назначении «uint8_t {aka unsigned char}» на «uint8_t [1] {aka unsigned char [1]}»
что должна делать программа? .... чего вы ожидаете? .... что на самом деле происходит? .... вы получаете какие-либо ошибки?, @jsotola