Оператор For
- Войдите на сайт для отправки комментариев
Ср, 29/06/2022 - 22:18
Оператор For после прохождения автоматически выполняет действия во втором if. Причем даже если во втором if условие выполнено For его игнорирует. В чем может быть проблема.
void Open(){
for (int h=1; h<10; h++){
if (Password == "BULKA"){
Clear_display();
ResetDisplay = false;
pos = 45;
myservo.write(pos);
display.setCursor(3,1);
display.setTextColor(WHITE);
display.setTextSize(2);
display.println("Push Enter for close");
display.display();
delay(1000);
if(Key_read>870 and Key_read<890){
ResetDisplay = true;
display.clearDisplay();
pos = 90;
myservo.write(pos);
delay(100);
//resetFunc();
display.println("Kot");
}
}
}
}
в том, что ты не читаешь, что сам написал, может быть?
Key_read>870 and Key_read<890И что тут не так?
Откуда в С++ оператор and?
причем тут оператор For?
что, если заменить for на while - условие перестанет выполняться?
Откуда в С++ оператор and?
с
в Си нет, а в Ардуино - есть
причем тут оператор For?
что, если заменить for на while - условие перестанет выполняться?
Разве что-то поменяется?
причем тут оператор For?
что, если заменить for на while - условие перестанет выполняться?
Теперь вообще всё перестало работать)
в Си нет, а в Ардуино - есть
Есть и в Си, если включить iso646.h из стандартной библиотеки.
Разделительные скобки условий все равно желательно ставить. У меня была ситуация когда нужно было добавить скобки для корректной работы условия.
Serial.println(Key_read);
Я писал эту команду и монитор порта показывает Key_read больше чем значения в условии, т.е. оно не должно выполняться
начните со скобок.
И поменяйте and на && - хоть это и допустимо, лучше пользоваться традиционным синтаксисом Си
Ну вот, почему не выполняется, вы выяснили
Ну вот, почему не выполняется, вы выяснили
Так оно наоборот выполняется. Значение в условии от 870 до 890, а в мониторе порта показывает 1023, т.е. не должно выполняться условие
Тогда сделайте, как вам посоветовали в #12 сообщении. Похоже, что таки and в условии не работает
Тогда сделайте, как вам посоветовали в #12 сообщении. Похоже, что таки and в условии не работает
Ну вот я так и планирую когда доберусь до компьютера
А что это тут сегодня все добрые телепаты такие? Взялись какой-то огрызок кода обсуждать. Mysteriousapels, выкладывайте минимальный законченный скетч, в котором проявляется ошибка. Со вставленным выводом переменной условия в сериал. А то хз что там у Вас ещё происходит и где именно Вы её проверяете.
p.s. подобное условие вполне себе работает как есть - с and и без дополнительных скобок. Причина не в этом. Где-нибудь в логике проблема.
А что это тут сегодня все добрые телепаты такие? Взялись какой-то огрызок кода обсуждать.
и то верно...
А что это тут сегодня все добрые телепаты такие? Взялись какой-то огрызок кода обсуждать. Mysteriousapels, выкладывайте минимальный законченный скетч, в котором проявляется ошибка. Со вставленным выводом переменной условия в сериал. А то хз что там у Вас ещё происходит и где именно Вы её проверяете.
p.s. подобное условие вполне себе работает как есть - с and и без дополнительных скобок. Причина не в этом. Где-нибудь в логике проблема.
#include <SPI.h> #include <Wire.h> #include <Servo.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> // Oled display size #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels Servo myservo; //Potentiometer PIN A1 int Keyboard=A0; // Variables capturing current and newly calculated position on the letter board (9x3 - 27 postions) int New_X=0; int Old_X=0; int New_Y=0; int Old_Y=0; // Variable capturing output from Keyboard pin (Values 0 1023) int Key_read=0; int Prev_Key_read=1023; boolean Key_pressed=false; // String variable holding the text to transmit String Password=""; String WS = "-"; // Length of the text to transmit int Password_Length=0; // Save servo postition int pos; // Variable for display rest bool ResetDisplay = true; // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Used for displaying Leter board char Letters[3][9]={"ABCDEFGHI", "JKLMNOPQR", "STUVWXYZ-"}; void setup() { Serial.begin(9600); myservo.attach(9); pos = 90; myservo.write(pos); // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64 Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } // Show initial display buffer contents on the screen -- // the library initializes this with an Adafruit splash screen. display.display(); delay(2000); // Pause for 2 seconds // Clear the buffer display.clearDisplay(); display.display(); // Display filled in rect in the top section of the display when To_Transfer would be output display.fillRect(0, 0, 128, 15, SSD1306_INVERSE); display.drawRect(110, 2, 16, 12, SSD1306_BLACK); display.setTextSize(1); display.setTextColor(SSD1306_BLACK); display.setCursor(113,4); display.println("OK"); display.display(); // Display Letter Board 3 rows 9 character in each row display.setTextSize(2); display.setTextColor(SSD1306_WHITE); for (int j=0; j<3;j++){ for (int i=0; i<9;i++){ display.setCursor(i*12+2*i+1,j*16+17); display.println(Letters[j][i]); delay(10); display.display(); } } // Highlight character A by displaying Inverse rect at first position display.fillRect(0, 16, 12, 16, SSD1306_INVERSE); display.display(); } void(* resetFunc) (void) = 0; //declare reset function @ address 0 void Highlight_letter(int X, int X_Old, int Y, int Y_Old){ // When position changes // Draw the inverse rect in the Old_pos to deactivate the highlight in the old spot // Draw the inverse rect to Highlite the new spot // Displaying Inverse rect in a new position to highlight display.fillRect(X*12+2*X, Y*16 +16, 12, 16, SSD1306_INVERSE); // Displaying Inverse rect in the old positon to unhighlight display.fillRect(X_Old*12+2*X_Old, Y_Old*16 +16, 12, 16, SSD1306_INVERSE); display.display(); } void Clear_display(){ if (ResetDisplay = true){ display.clearDisplay(); } } void Open(){ for (int h; h < 10; h++){ if (Password == "BULKA"){ Clear_display(); ResetDisplay = false; pos = 45; myservo.write(pos); display.setCursor(3,1); display.setTextColor(WHITE); display.setTextSize(2); display.println("Push Enter for close"); display.display(); delay(1000); if(Key_read>870 and Key_read<890){ ResetDisplay = true; display.clearDisplay(); pos = 90; myservo.write(pos); delay(100); //resetFunc(); display.println("Kot"); } } } } void loop() { Key_read =analogRead(Keyboard); if (Prev_Key_read>1000 and Key_read<1000){ Key_pressed=true; if (Key_read>590 and Key_read<610 and Old_X>0) New_X=Old_X-1; if (Key_read<10 and Old_X<9) New_X=Old_X+1; if (Key_read>390 and Key_read<400 and Old_Y>-1) New_Y=Old_Y-1; if (Key_read>160 and Key_read<180 and Old_Y<2 ) New_Y=Old_Y+1; if (Key_read>870 and Key_read<890) { if (New_Y!=-1){ Password=Password + Letters[New_Y][New_X]; Password_Length++; display.setTextSize(1); display.setCursor(3,1); display.setTextColor(BLACK ); display.fillRect(0, 0, 100, 15, SSD1306_WHITE); display.println(Password); display.display(); } else{ for (int i=1;i<9;i++) { display.fillRect(0, 0, 128, 15, SSD1306_INVERSE); delay(300); display.display(); } } } //Clear display if make mistake if (Password.endsWith(WS)){ Password = ""; display.setCursor(3,1); } if (New_Y==-1 and Old_Y==0){ display.fillRect(110, 2, 16, 12, SSD1306_INVERSE); display.fillRect(Old_X*12+2*Old_X, Old_Y*16 +16, 12, 16, SSD1306_INVERSE); } if (New_Y==0 and Old_Y==-1){ display.fillRect(110, 2, 16, 12, SSD1306_INVERSE); display.fillRect(New_X*12+2*New_X, New_Y*16 +16, 12, 16, SSD1306_INVERSE); Prev_Key_read=Key_read; Old_X=New_X; Old_Y=New_Y;; } if ((Old_X!=New_X or Old_Y!=New_Y) and Old_Y!=-1 ){ if (New_Y!=-1 )Highlight_letter (New_X,Old_X,New_Y,Old_Y); Old_X=New_X; Old_Y=New_Y; } } display.display(); Prev_Key_read=Key_read; Open(); Serial.println(Key_read); }А что это тут сегодня все добрые телепаты такие? Взялись какой-то огрызок кода обсуждать. Mysteriousapels, выкладывайте минимальный законченный скетч, в котором проявляется ошибка. Со вставленным выводом переменной условия в сериал. А то хз что там у Вас ещё происходит и где именно Вы её проверяете.
p.s. подобное условие вполне себе работает как есть - с and и без дополнительных скобок. Причина не в этом. Где-нибудь в логике проблема.
Так в Serial как раз таки все нормально и значения, которые он показывает не попадают под условие. Открываю монитор порта, там значение 1023, if при этом все равно выполняется
Надо бы int h = 0; Или необязательно?
char Letters[3][9]={"ABCDEFGHI", "JKLMNOPQR", "STUVWXYZ-"};Здесь компилятор ругается, надо не 9, а 10
void Clear_display(){ if (ResetDisplay = true){ display.clearDisplay(); } }Вот ещё ошибка
Зачем 192 строка если есть 204?
Условие 137 строки выполняется всегда? А 158 строки тоже получается выполняется? Вообще не люблю работу с глобальными переменными в подпрограммах - лучше передавать в виде параметра. Или все-таки они выполняются при нажатии на какие-то определенные кнопки?
Схему похоже тоже не помешает.
Код - мечта мазохиста.
Надо бы int h = 0; Или необязательно?
смотря для чего :) Чтобы программа работала так, как задумал автор - стоило бы :) Но вообще необязательно, ни к чему фатальному в этом участке кода это приводить не должно.
char Letters[3][9]={"ABCDEFGHI", "JKLMNOPQR", "STUVWXYZ-"};Здесь компилятор ругается, надо не 9, а 10
Опять же в данном коде не имеет значения, буквы используются по отдельности, а не в составе строк.
Зачем 192 строка если есть 204?
Условие 137 строки выполняется всегда? А 158 строки тоже получается выполняется? Вообще не люблю работу с глобальными переменными в подпрограммах - лучше передавать в виде параметра. Или все-таки они выполняются при нажатии на какие-то определенные кнопки?
Схему похоже тоже не помешает.
Код - мечта мазохиста.
158 строка выполняется как надо. Я использую аналоговую клавиатуру из 5 кнопок, т.е. у каждой свое сопротивление.
Upd: 192 не знаю как попала)
Я чего-то непонятно видать объяснил. Сейчас Вы можете видеть значение переменной в конце loop, но где подтверждение что срабатывает условие?
Автор, Вы утверждаете, что у Вас какой-то конкретный if выполняется, хотя по Вашему мнению не должен. Так вот не где попало, а прямо первым оператором в блоке, который выполняется по условию, нужно вывести в сериал эту Вашу переменную условия. Из других мест печать убрать, чтобы не путаться!
Т.е. например, если речь идёт об условии в строке 137, то печатайте Key_read в сериал перед строкой 138. И убедитесь, что дважды два всё-таки четыре, а не пять, раз уж Вы в этом засомневались.
А по существу, Вы бы лучше обычными словами (без ссылок на код) описали что программа должна делать, и что делается не так, как Вы ожидаете.
Я чего-то непонятно видать объяснил. Сейчас Вы можете видеть значение переменной в конце loop, но где подтверждение что срабатывает условие?
Автор, Вы утверждаете, что у Вас какой-то конкретный if выполняется, хотя по Вашему мнению не должен. Так вот не где попало, а прямо первым оператором в блоке, который выполняется по условию, нужно вывести в сериал эту Вашу переменную условия. Из других мест печать убрать, чтобы не путаться!
Т.е. например, если речь идёт об условии в строке 137, то печатайте Key_read в сериал перед строкой 138. И убедитесь, что дважды два всё-таки четыре, а не пять, раз уж Вы в этом засомневались.
А по существу, Вы бы лучше обычными словами (без ссылок на код) описали что программа должна делать, и что делается не так, как Вы ожидаете.
Не умею я объяснять проблему, это правда. Программа по сути представляет из себя кодовый замок. На экран выводится буквы, с помощью аналоговой клавиатуры мы вводим пароль. Как только комбинация совпадает сервоприводы открывают затвор, на экран выводится сообщение "Нажать ввод для закрытия", после чего сервоприводы закрывают затвор и плата перезагружается в начало. То, что указано в условии соответствует значениям кнопки ввода на аналоговой клавиатуре.
Вы оказались правы, считывание аналогового входа останавливается после вызова функции Open(). Key_Read запоминала последнее значение, которое и было вводом. Спасибо за подсказку, на самом деле мой первый серьезный код, который я три месяца писал через интернет)
~2 строки в день ...
Программа по сути представляет из себя кодовый замок. На экран выводится буквы, с помощью аналоговой клавиатуры мы вводим пароль. Как только комбинация совпадает сервоприводы открывают затвор, на экран выводится сообщение "Нажать ввод для закрытия", после чего сервоприводы закрывают затвор и плата перезагружается в начало. То, что указано в условии соответствует значениям кнопки ввода на аналоговой клавиатуре. Вы оказались правы, считывание аналогового входа останавливается после вызова функции Open(). Key_Read запоминала последнее значение, которое и было вводом.
Кнопки видимо соответствуют стрелкам влево, вправо, вверх, вниз и ввод. Чтобы выбрать букву, нужно выделить её стрелками и нажать ввод. Видимо так?
А как планировалось проверять пароль? Принимать символы до первого неправильного и выдавать ошибку? Или принимать какое-то количество символов и после сверять введёное с паролем? Или ещё как?
Когда разберёмся, что хотели сделать, станет понятно что именно реализовано не так.
Программа по сути представляет из себя кодовый замок. На экран выводится буквы, с помощью аналоговой клавиатуры мы вводим пароль. Как только комбинация совпадает сервоприводы открывают затвор, на экран выводится сообщение "Нажать ввод для закрытия", после чего сервоприводы закрывают затвор и плата перезагружается в начало. То, что указано в условии соответствует значениям кнопки ввода на аналоговой клавиатуре. Вы оказались правы, считывание аналогового входа останавливается после вызова функции Open(). Key_Read запоминала последнее значение, которое и было вводом.
Кнопки видимо соответствуют стрелкам влево, вправо, вверх, вниз и ввод. Чтобы выбрать букву, нужно выделить её стрелками и нажать ввод. Видимо так?
А как планировалось проверять пароль? Принимать символы до первого неправильного и выдавать ошибку? Или принимать какое-то количество символов и после сверять введёное с паролем? Или ещё как?
Когда разберёмся, что хотели сделать, станет понятно что именно реализовано не так.
Да, кнопками выбираются буквы. Проверка пароля путем сравнения, но это уже потом, если руки дойдут. Самое главное сделано.