Оператор For

Mysteriousapelsin
Offline
Зарегистрирован: 29.06.2022

Оператор 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");
      }
    }
  }
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

в том, что ты не читаешь, что сам написал, может быть?

 

Key_read>870 and Key_read<890

Mysteriousapelsin
Offline
Зарегистрирован: 29.06.2022

И что тут не так?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Mysteriousapelsin пишет:
И что тут не так?

Откуда в С++ оператор and?

b707
Offline
Зарегистрирован: 26.05.2017

причем тут оператор For?

что, если заменить for на while - условие перестанет выполняться?

b707
Offline
Зарегистрирован: 26.05.2017

v258 пишет:

Откуда в С++ оператор and?

с

в Си нет, а в Ардуино - есть

 

Mysteriousapelsin
Offline
Зарегистрирован: 29.06.2022

b707 пишет:

причем тут оператор For?

что, если заменить for на while - условие перестанет выполняться?


Разве что-то поменяется?

Mysteriousapelsin
Offline
Зарегистрирован: 29.06.2022

b707 пишет:

причем тут оператор For?

что, если заменить for на while - условие перестанет выполняться?


Теперь вообще всё перестало работать)

Green
Offline
Зарегистрирован: 01.10.2015

b707 пишет:

в Си нет, а в Ардуино - есть


Есть и в Си, если включить iso646.h из стандартной библиотеки.

#ifndef __cplusplus
#define and	&&
#define and_eq	&=
#define bitand	&
#define bitor	|
#define compl	~
#define not	!
#define not_eq	!=
#define or	||
#define or_eq	|=
#define xor	^
#define xor_eq	^=
#endif

 

nevkon
Offline
Зарегистрирован: 20.01.2015

Разделительные скобки условий все равно желательно ставить. У меня была ситуация когда нужно было добавить скобки для корректной работы условия.

sadman41
Offline
Зарегистрирован: 19.10.2016

Serial.println(Key_read);

Mysteriousapelsin
Offline
Зарегистрирован: 29.06.2022

sadman41 пишет:
Serial.println(Key_read);

Я писал эту команду и монитор порта показывает Key_read больше чем значения в условии, т.е. оно не должно выполняться

b707
Offline
Зарегистрирован: 26.05.2017

начните со скобок.

И поменяйте and на && - хоть это и допустимо, лучше пользоваться традиционным синтаксисом Си

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Mysteriousapelsin пишет:
sadman41 пишет:
Serial.println(Key_read);
Я писал эту команду и монитор порта показывает Key_read больше чем значения в условии, т.е. оно не должно выполняться

Ну вот, почему не выполняется, вы выяснили

Mysteriousapelsin
Offline
Зарегистрирован: 29.06.2022

v258 пишет:

Mysteriousapelsin пишет:
sadman41 пишет:
Serial.println(Key_read);
Я писал эту команду и монитор порта показывает Key_read больше чем значения в условии, т.е. оно не должно выполняться

Ну вот, почему не выполняется, вы выяснили


Так оно наоборот выполняется. Значение в условии от 870 до 890, а в мониторе порта показывает 1023, т.е. не должно выполняться условие

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Тогда сделайте, как вам посоветовали в #12 сообщении. Похоже, что таки and в условии не работает

Mysteriousapelsin
Offline
Зарегистрирован: 29.06.2022

v258 пишет:

Тогда сделайте, как вам посоветовали в #12 сообщении. Похоже, что таки and в условии не работает


Ну вот я так и планирую когда доберусь до компьютера

kalapanga
Offline
Зарегистрирован: 23.10.2016

А что это тут сегодня все добрые телепаты такие? Взялись какой-то огрызок кода обсуждать. Mysteriousapels, выкладывайте  минимальный законченный скетч, в котором проявляется ошибка. Со вставленным выводом переменной условия в сериал. А то хз что там у Вас ещё происходит и где именно Вы её проверяете.

p.s. подобное условие вполне себе работает как есть - с and и без дополнительных скобок. Причина не в этом. Где-нибудь в логике проблема.

b707
Offline
Зарегистрирован: 26.05.2017

kalapanga пишет:

А что это тут сегодня все добрые телепаты такие? Взялись какой-то огрызок кода обсуждать.

и то верно...

Mysteriousapelsin
Offline
Зарегистрирован: 29.06.2022

kalapanga пишет:

А что это тут сегодня все добрые телепаты такие? Взялись какой-то огрызок кода обсуждать. 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);
}

 

Mysteriousapelsin
Offline
Зарегистрирован: 29.06.2022

kalapanga пишет:

А что это тут сегодня все добрые телепаты такие? Взялись какой-то огрызок кода обсуждать. Mysteriousapels, выкладывайте  минимальный законченный скетч, в котором проявляется ошибка. Со вставленным выводом переменной условия в сериал. А то хз что там у Вас ещё происходит и где именно Вы её проверяете.

p.s. подобное условие вполне себе работает как есть - с and и без дополнительных скобок. Причина не в этом. Где-нибудь в логике проблема.

Так в Serial как раз таки все нормально и значения, которые он показывает не попадают под условие. Открываю монитор порта, там значение 1023, if при этом все равно выполняется

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021


for (int h; h < 10; h++)

Надо бы int  h = 0; Или необязательно?

char Letters[3][9]={"ABCDEFGHI",
                    "JKLMNOPQR",
                    "STUVWXYZ-"};

Здесь компилятор ругается, надо не 9, а 10

void Clear_display(){
  if (ResetDisplay = true){
    display.clearDisplay();
  }  
}

Вот ещё ошибка

nevkon
Offline
Зарегистрирован: 20.01.2015

Зачем 192 строка если есть 204?

Условие 137 строки выполняется всегда? А 158 строки тоже получается выполняется? Вообще не люблю работу с глобальными переменными в подпрограммах - лучше передавать в виде параметра. Или все-таки они выполняются при нажатии на какие-то определенные кнопки?

Схему похоже тоже не помешает.

Код - мечта мазохиста.

b707
Offline
Зарегистрирован: 26.05.2017

Дим-мычъ пишет:



for (int h; h < 10; h++)

Надо бы int  h = 0; Или необязательно?

смотря для чего :) Чтобы программа работала так, как задумал автор - стоило бы :) Но вообще необязательно, ни к чему фатальному в этом участке кода это приводить не должно.

Цитата:

char Letters[3][9]={"ABCDEFGHI",
                    "JKLMNOPQR",
                    "STUVWXYZ-"};

Здесь компилятор ругается, надо не 9, а 10

Опять же в данном коде не имеет значения, буквы используются по отдельности, а не в составе строк.

 

Mysteriousapelsin
Offline
Зарегистрирован: 29.06.2022

nevkon пишет:

Зачем 192 строка если есть 204?

Условие 137 строки выполняется всегда? А 158 строки тоже получается выполняется? Вообще не люблю работу с глобальными переменными в подпрограммах - лучше передавать в виде параметра. Или все-таки они выполняются при нажатии на какие-то определенные кнопки?

Схему похоже тоже не помешает.

Код - мечта мазохиста.

158 строка выполняется как надо. Я использую аналоговую клавиатуру из 5 кнопок, т.е. у каждой свое сопротивление.
Upd: 192 не знаю как попала)
 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Я чего-то непонятно видать объяснил. Сейчас Вы можете видеть значение переменной в конце loop, но где подтверждение что срабатывает условие?

Автор, Вы утверждаете, что у Вас какой-то конкретный if выполняется, хотя по Вашему мнению не должен. Так вот не где попало, а прямо первым оператором в блоке, который выполняется по условию, нужно вывести в сериал эту Вашу переменную условия. Из других мест печать убрать, чтобы не путаться!

Т.е. например, если речь идёт об условии в строке 137, то печатайте Key_read в сериал перед строкой 138. И убедитесь, что дважды два всё-таки четыре, а не пять, раз уж Вы в этом засомневались.

А по существу, Вы бы лучше обычными словами (без ссылок на код) описали что программа должна делать, и что делается не так, как Вы ожидаете.

Mysteriousapelsin
Offline
Зарегистрирован: 29.06.2022

kalapanga пишет:

Я чего-то непонятно видать объяснил. Сейчас Вы можете видеть значение переменной в конце loop, но где подтверждение что срабатывает условие?

Автор, Вы утверждаете, что у Вас какой-то конкретный if выполняется, хотя по Вашему мнению не должен. Так вот не где попало, а прямо первым оператором в блоке, который выполняется по условию, нужно вывести в сериал эту Вашу переменную условия. Из других мест печать убрать, чтобы не путаться!

Т.е. например, если речь идёт об условии в строке 137, то печатайте Key_read в сериал перед строкой 138. И убедитесь, что дважды два всё-таки четыре, а не пять, раз уж Вы в этом засомневались.

А по существу, Вы бы лучше обычными словами (без ссылок на код) описали что программа должна делать, и что делается не так, как Вы ожидаете.


Не умею я объяснять проблему, это правда. Программа по сути представляет из себя кодовый замок. На экран выводится буквы, с помощью аналоговой клавиатуры мы вводим пароль. Как только комбинация совпадает сервоприводы открывают затвор, на экран выводится сообщение "Нажать ввод для закрытия", после чего сервоприводы закрывают затвор и плата перезагружается в начало. То, что указано в условии соответствует значениям кнопки ввода на аналоговой клавиатуре.
Вы оказались правы, считывание аналогового входа останавливается после вызова функции Open(). Key_Read запоминала последнее значение, которое и было вводом. Спасибо за подсказку, на самом деле мой первый серьезный код, который я три месяца писал через интернет)

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

~2 строки в день ...

kalapanga
Offline
Зарегистрирован: 23.10.2016

Mysteriousapelsin пишет:

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

Кнопки видимо соответствуют стрелкам влево, вправо, вверх, вниз и ввод. Чтобы выбрать букву, нужно выделить её стрелками и нажать ввод. Видимо так?

А как планировалось проверять пароль? Принимать символы до первого неправильного и выдавать ошибку? Или принимать какое-то количество символов и после сверять введёное с паролем? Или ещё как?

Когда разберёмся, что хотели сделать, станет понятно что именно реализовано не так.

Mysteriousapelsin
Offline
Зарегистрирован: 29.06.2022

kalapanga пишет:

Mysteriousapelsin пишет:

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

Кнопки видимо соответствуют стрелкам влево, вправо, вверх, вниз и ввод. Чтобы выбрать букву, нужно выделить её стрелками и нажать ввод. Видимо так?

А как планировалось проверять пароль? Принимать символы до первого неправильного и выдавать ошибку? Или принимать какое-то количество символов и после сверять введёное с паролем? Или ещё как?

Когда разберёмся, что хотели сделать, станет понятно что именно реализовано не так.

Да, кнопками выбираются буквы. Проверка пароля путем сравнения, но это уже потом, если руки дойдут. Самое главное сделано.