정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

lcd 및 시리얼 출력 외부 입력시 실행토록 하는 구문 동작안함
멍밍이 | 2020-09-03

 

짜집기 해서 이렇게 만들었는데 

PLC 출력 신호를 입력을 받을 때만 실행하려는데 

디지탈7 번 핀을 입력으로 잡아서 실행하려고 

아래와 같이     while(digitalRead(a==HIGH)) 부분 관련 문구를 추가 했는데 

입력 유무와 관계없이 계속 동작합니다 7번핀에 5v 입력 또는 gnd 입력과 무관합니다

무엇이 잘못된건지요

 

 

#include <LiquidCrystal_I2C.h>

#include <Wire.h>

 

#define RANGE 50 

LiquidCrystal_I2C lcd(0x27, 16, 2);

 

// 실측한 최소값과 최대값을 얻어 이를 min과 max 값에 넣습니다: 

int min = 3;     // 최소 값 

int max = 1001;  // 최대 값 

int value;       // 센서 읽은 값 

int plotX, gauss; 

char c; 

 

int a = 7;

int b = 8;

 

void setup() { 

  // 시리얼 모니터 출력을 위한 시리얼 통신 초기화를 합니다 

  pinMode (a, INPUT);

  pinMode (b, OUTPUT);

  lcd.init();   // I2C LCD를 초기화 합니다..

  lcd.backlight(); // I2C LCD의 백라이트를 켜줍니다.

  Serial.begin(9600); 

 

void loop() { 

    while(digitalRead(a==HIGH))

    {  

      // 센서 값을 읽어 들입니다: 

      value = analogRead(A0); 

     

      // X 축의 0 ~ 49 사이 값으로 변환합니다:  

      plotX = constrain(map(value, min, max, 0, RANGE - 1), 0, RANGE - 1); 

      // 가우스 값으로 변환합니다: 

      gauss = constrain(map(value, min, max, -800, 800), -800, 800); 

      // 시리얼 모니터에 다음 2줄과 같이 출력하기 위하여 '|'를 먼저 출력 

      // 하고, plotX 값은 'O'로 나머지는 '-'로 가운데와 맨 끝은 '|'로 

      // 출력합니다. 

      // 

      // |------------O-----------|-------------------------|-400 Gauss 

      // |------------------------|-------------O-----------|400 Gauss 

      // 제일 처음을 위한 '|'를 출력합니다 

      Serial.print("|"); 

      // 가운데가 아니면 '-'를 출력하고 중앙일 경우에는 '|'를 출력합니다 

      for(int i=0; i < plotX ; i++) { 

        if(i == (RANGE/2 - 1)) {c = '|'; 

        }

        else c = '-'; 

      Serial.print(c); 

      } 

      

      // plotX 위치에는 'O'를 출력합니다  

      Serial.print("O"); 

      for(int i= plotX + 1; i < RANGE; i++) { 

        // 만약 중앙이라면 '|'를 출력하고 아니라면 '-'를 출력합니다 

        if(i == (RANGE/2 - 1)) c = '|'; 

        else c = '-'; 

        Serial.print(c);     

      } 

      // 맨 끝에는 '|'를 출력합니다 

      Serial.print("|"); 

      // 가우스 값을 출력합니다 

      Serial.print(gauss); 

      Serial.print(" Gauss"); 

      Serial.println(); 

        

      // lcd 절대값으로 판단

        lcd.clear();                                        // lcd의 화면을 지웁니다.

        if (gauss >= 0) 

        {

          lcd.setCursor(0, 0);                            // lcd의 0,0을 지정합니다.

          lcd.print("N pole");

          if (abs(gauss) >= 400)

          {

              lcd.print("= 1");

          }

          else 

          {

              lcd.print("=0");

          }

        lcd.setCursor(10, 0);                            // lcd의 0,0을 지정합니다.

        lcd.print(abs(gauss));lcd.print("G");

        }

    

    

        if (gauss < 0) 

        {

          lcd.setCursor(0, 1);                            // lcd의 0,0을 지정합니다.

          lcd.print("S pole");

          if (abs( gauss) >= 400)

          {

              lcd.print("= 1");

          }

          else 

          {

              lcd.print("=0");

          }

        lcd.setCursor(10, 1);                            // lcd의 0,0을 지정합니다.

        lcd.print(abs(gauss));lcd.print("G");

        }

    }

 

  delay(100); 

 

프로필사진

판다마니아 2020-09-03 14:14:02

while 조건문에 digitalRead(a) == HIGH 로 바꿔보세요.

 

현재 : digitalRead(a == HIGH)

바꿀것 : digitalRead(a) == HIGH

프로필사진

멍밍이 2020-09-03 14:51:17

답변 감사합니다 

대학때 128 좀 해보다가 손놓은지가 15년이 되서 잘 기억이 나지 않는데 

혹시 

현재 문구와 바꿀 문구의 차이가 뭔지좀 설명해주실 수 있으신가요?

프로필사진

판다마니아 2020-09-03 17:45:40

괄호의 위치에 따라 어느 코드를 먼저 실행하는지 정합니다.

 

digitalRead(a == HIGH) 이 경우 우선 a값을 1이랑 같은지 아닌지 비교한 후 같으면 digitalRead(1), 다르면 digitalRead(0) 을 실행하게 됩니다.

 

 

digitalRead(a) == HIGH 의 경우 우선 digitalRead(7) 을 해서 신호값을 입력 받고 그다음 그 신호값을 HIGH인지 비교하게 됩니다.

 

이 차이입니다.

프로필사진

멍밍이 2020-09-04 08:51:57

감사합니다 이해가 쏙쏙 되네요

이전글   |    아두이노 NRF24L01 1:N 2020-09-02
다음글   |    오렌지보드 블루투스 2020-09-03