BASIC4MCU | 질문게시판 | 수위센서 솔벨브 제어 관련 질문드리겠습니다.
페이지 정보
작성자 자카르타정 작성일2020-04-04 01:48 조회106,176회 댓글12건본문
안녕하세요 아두이노 초보 입니다.
인도네시아 저소득층을 위해 현재 무상으로 정수기 설치 사업을 하고 있습니다.
어린 친구들이 정수된 물을 받아가기 위해 통에 물을 받는데
딱히 자동으로 급수하는 시스템이 없어 물을 다 받을때 까지 하염없이 기다려야 되는 상황입니다.
잠깐 한눈을 팔면 정수된 물이 넘쳐서 버리게 됩니다.ㅜㅜ
급하게 배워 여기 저기 붙혀넣기로 코딩을 했는데
푸시 버튼을 누르면 릴레이 동작, 솔벨브 on
수위센서에 물이 감지되면 릴레이 off 솔벨브 off
문제는 중간에 푸시버튼을 한 번 더 누르면 수위센서와 상관없이
물이 멈추게 하고 싶은데
아무리 해도 되질 않네요ㅠㅠ
그리고 물을 다 받고 수위 센서를 제거하면 바로 릴레이가 동작해 솔벨브가 열립니다.
물이 다 차서 수위센서가 감지되면
다시 푸시 버튼을 누를때 까지 릴레이가 멈출 수 있을까요?
전문가 분들의 도움을 부탁드리겠습니다.
우노보드 하나 가지고 릴레이 2개 솔벨브 2개 수위센서 2개도 동시에 제어가 가능한가요?
너무 초보적인 질문이라 죄송합니다. 50이 넘어서 처음으로 배우고 하다보니 많이 서툽니다
감사합니다. 좋은 저녁 되시고 건강한 하루 되십시오
댓글 12
조회수 106,176master님의 댓글
master 작성일
아두이노는 초등학생과 주부님도 합니다.
따라서 나이는 상관없고요...얼마나 공부했는지에 따라서 결과가 달라지게 됩니다.
그동안 작성했던 소스를 첨부하셔야지 도움을 드립니다.
전체 소스를 작성 해달라고 하신다면 무료가 아닌 유료로만 가능합니다.
자카르타정님의 댓글
자카르타정 작성일
아 네 죄송합니다 잘 몰랐습니다.
만들었던 소스 첨부드립니다. 감사합니다
int analogPin_01 = 0; // 1번 수위센서
/*
int analogPin_02 = 1; // 1번 수위센서
int analogPin_03 = 2; // 1번 수위센서
*/
int val = 0; // 전류변화 변수
int Relaypin_01 = 3; // 1번 릴레이
/*
int Relaypin_02 = 4; // 2번 릴레이
int Relaypin_03 = 5; // 3번 릴레이
*/
int Switch_01 = 9; // 1번 스위치
/*
int Switch_02 = 10; // 2번 스위치
int Switch_03 = 11; // 3번 스위치
*/
void setup()
{
pinMode(Relaypin_01,OUTPUT); // 1번 릴레이를 출력
pinMode(Switch_01,INPUT_PULLUP); // 1번 스위치 입력
/* pinMode(Switch_02,INPUT_PULLUP); // 2번 스위치를 입력
pinMode(Switch_03,INPUT_PULLUP); // 3번 스위치를 입력
Serial.begin (9600); // 시리얼모니터 설정*/
}
void loop()
{
if(digitalRead(Switch_01)==LOW) // 1번 버튼 스위치를 누르면
{
digitalWrite(Relaypin_01,HIGH); // 1채널 릴레이 ON
}
{
val = analogRead(analogPin_01); // analogPin 의 변화값(전류값)을 읽음
if (val > 100) // val 값이 100이 넘으면 (전류가 100이 넘으면)
{
digitalWrite(Relaypin_01,LOW); // 1채널 릴레이 off
}
}
}
자카르타정님의 댓글
자카르타정 작성일참 그리고 유료 의뢰를 하면 비용이 얼마정도들지 알 수 있을까요?
4004님의 댓글
4004 작성일
KOICA로 계신가 보군요.
로직이 어려워보이지는 않는데요.
1개의 버튼, 솔밸브, 릴레이, 수위센서
이렇게 됩니까?
솔밸브와 릴레이의 관계는 어떻게 되나요?
1) 버튼은 시작과 다시누르면 멈추는 기능을 동시에가져야 할듯하고
2) 버튼을 한번 누르면 릴레이가 작동하여 솔밸브를 열고, 다시누르면 멈춰야 하며
3) 버튼을 눌러 물이 나오는 상황(릴레이작동 및 솔밸브열림)에서 센서값이 100이상이면 무조건 멈추어야 하나요?
자카르타정님의 댓글
자카르타정
네 버튼 1개인데 3개 정도로 가능하면 늘이고 싶습니다.
중간에 버튼을 누르면 수위 센서와 상관 없이 물이 멈추게 하고 싶습니다.
릴레이가 on 되면 솔벨브는 열리게 되어있습니다.
그리고 지금 문제는 뚜껑에 수위센서를 달아 놓았는데 물이 다 차서 멈추는 것 까진 됩니다
그런데 뚜껑을 제거하면 다시 물이 쏟아져 나옵니다. 그래서 물을 수동으로 잠그고 뚜껑을 제거합니다
4004님의 댓글
4004
생각좀 해보구요.
아나로그 입력이 3개, 디지털 입력/출력이 각 3개네요
아두이노 우노 1개로 가능할것 같습니다.
문제는 로직인데, 제가 로직을 뚝딱만들수 있는 능력은 아니라서, 시간을 좀 주세요.
그리고 다른분이 도움을 바로 주실 수도 있을 겁니다.
수위센서값이 100이상이면 멈추는 것이죠?
4004님의 댓글
4004 작성일
int analogPin_01 = 0; // 1번 수위센서
int analogPin_02 = 1; // 1번 수위센서
int analogPin_03 = 2; // 1번 수위센서
int Relaypin_01 = 3; // 1번 릴레이
int Relaypin_02 = 4; // 2번 릴레이
int Relaypin_03 = 5; // 3번 릴레이
int val1 = 0; // 전류변화 변수
int val2 = 0; // 전류변화 변수
int val3 = 0; // 전류변화 변수
int Switch_01 = 9; // 1번 스위치
int Switch_02 = 10; // 2번 스위치
int Switch_03 = 11; // 3번 스위치
bool Switch_01TF = false; // 1번 스위치 설정값
bool Switch_02TF = false; // 1번 스위치 설정값
bool Switch_03TF = false; // 1번 스위치 설정값
void setup() {
pinMode(Relaypin_01,OUTPUT); // 1번 릴레이를 출력
pinMode(Relaypin_02,OUTPUT); // 1번 릴레이를 출력
pinMode(Relaypin_03,OUTPUT); // 1번 릴레이를 출력
pinMode(Switch_01,INPUT_PULLUP); // 1번 스위치 입력
pinMode(Switch_02,INPUT_PULLUP); // 2번 스위치를 입력
pinMode(Switch_03,INPUT_PULLUP); // 3번 스위치를 입력
Serial.begin (9600); // 시리얼모니터 설정*/
}
void loop() {
if(digitalRead(Switch_01)==LOW) {
Switch_01TF =!Switch_01TF;
if(Switch_01TF == true ) digitalWrite(Relaypin_01,HIGH); // 1채널 릴레이 ON
else digitalWrite(Relaypin_01,LOW); // 1채널 릴레이 OFF
}
if(digitalRead(Switch_02)==LOW) {
Switch_02TF =!Switch_02TF;
if(Switch_02TF == true ) digitalWrite(Relaypin_02,HIGH); // 1채널 릴레이 ON
else digitalWrite(Relaypin_02,LOW); // 1채널 릴레이 OFF
}
if(digitalRead(Switch_03)==LOW) {
Switch_03TF =!Switch_03TF;
if(Switch_03TF == true ) digitalWrite(Relaypin_03,HIGH); // 1채널 릴레이 ON
else digitalWrite(Relaypin_03,LOW); // 1채널 릴레이 OFF
}
val1 = analogRead(analogPin_01); // analogPin 의 변화값(전류값)을 읽음
val2 = analogRead(analogPin_02); // analogPin 의 변화값(전류값)을 읽음
val3 = analogRead(analogPin_03); // analogPin 의 변화값(전류값)을 읽음
if (val1 > 100) {
digitalWrite(Relaypin_01,LOW); // 1채널 릴레이 off
Switch_01TF = false;
}
if (val2 > 100) {
digitalWrite(Relaypin_02,LOW); // 1채널 릴레이 off
Switch_02TF = false;
}
if (val3 > 100) {
digitalWrite(Relaypin_03,LOW); // 1채널 릴레이 off
Switch_03TF = false;
}
}
버튼바운스 문제가 있긴 한데, 우선 해 보세요.
버튼은 한번 누르면 솔밸브 온, 한번 더 누르면 오프입니다.
자카르타정님의 댓글
자카르타정 작성일
아 정말 감사드립니다!!!!!!
적용해보겠습니다.!!!
감사합니다!!
감사합니다!!
자카르타정님의 댓글
자카르타정 작성일
네 결과 보고 드리겠습니다
1번 릴레이는 전원 켜자마자 on 버튼 및 수위센서 상관 없이 계속 ON
2번, 3번 릴레이는 전원 켜고 0,5초 뒤에 on 2번 버튼을 누를 시 off 떼면 바로 다시 on 버튼을 연타하면 꺼지고, 또 연타 하면 꺼짐 일정치 않음
수위센서는 123 전체 동작하지 않음
이상입니다
4004님의 댓글
4004
안녕하세요?
지금 제가드린 프로그램은, loop()함수가 빨리돌면 릴레이동작이 켜졌다 꺼졌다가 할수 있어서, 문제가 있습니다.
master님이 주신 코드를 해보시고 잘 안되면 제거를 다시 수정해 드리겠습니다.
그리고 LED하고 220ohm이나 330ohm저항을 가지고 계시면 릴레이 동작시 LED불들어오게 하면 사용자가 확인하기 쉬울것 같네요.
4004님의 댓글
4004
실재 확인해 보고 다시 작성한것을 보내 드립니다.
스위치가 문제인데, 릴레이 출력버튼에다 LED를 달아서 상태를 확인하는게 가장 좋아 보입니다.
그렇지 않으면 릴레이(연습은 LED)가 켜진상태인지 꺼진상태인지 확인하기가 힘드네요..
수위센서 A0가 1번, A1이 2번, A3가 3번
릴레이 D3이 1번, D4가 2번, D5가 3번,
스위치 D9가 1번, D10이 2번, D11이 3번 입니다.
스위치에다 10kohm저항은 다셨죠?
소스에서 debounceDelay는 스위치 안정될 때 까지 기다리는 것인데, 상황에 맞게 수정해 보세요..
debounce함수는 아두이노쿡북, 2nd판의 196p에서 차용한것입니다.
소스
const int debounceDelay = 50; // 안정된 상태가 될 때까지 기다리는 시간(밀리초)
int analogPin_01 = A0; // 1번 수위센서
int analogPin_02 = A1; // 2번 수위센서
int analogPin_03 = A2; // 3번 수위센서
int Relaypin_01 = 3; // 1번 릴레이
int Relaypin_02 = 4; // 2번 릴레이
int Relaypin_03 = 5; // 3번 릴레이
int val1 = 0; // 전류변화 변수
int val2 = 0; // 전류변화 변수
int val3 = 0; // 전류변화 변수
int Switch_01 = 9; // 1번 스위치
int Switch_02 = 10; // 2번 스위치
int Switch_03 = 11; // 3번 스위치
bool Switch_01TF = false; // 1번 스위치 설정값
bool Switch_02TF = false; // 1번 스위치 설정값
bool Switch_03TF = false; // 1번 스위치 설정값
void setup() {
pinMode(Relaypin_01,OUTPUT); // 1번 릴레이를 출력
pinMode(Relaypin_02,OUTPUT); // 1번 릴레이를 출력
pinMode(Relaypin_03,OUTPUT); // 1번 릴레이를 출력
pinMode(Switch_01,INPUT_PULLUP); // 1번 스위치 입력
pinMode(Switch_02,INPUT_PULLUP); // 2번 스위치를 입력
pinMode(Switch_03,INPUT_PULLUP); // 3번 스위치를 입력
Serial.begin (9600); // 시리얼모니터 설정*/
}
void loop() {
if(debounce(Switch_01)) {
Switch_01TF =!Switch_01TF;
if(Switch_01TF == true ) digitalWrite(Relaypin_01,HIGH); // 1채널 릴레이 ON
else digitalWrite(Relaypin_01,LOW); // 1채널 릴레이 OFF
}
if(debounce(Switch_02)) {
Switch_02TF =!Switch_02TF;
if(Switch_02TF == true ) digitalWrite(Relaypin_02,HIGH); // 1채널 릴레이 ON
else digitalWrite(Relaypin_02,LOW); // 1채널 릴레이 OFF
}
if(debounce(Switch_03)) {
Switch_03TF =!Switch_03TF;
if(Switch_03TF == true ) digitalWrite(Relaypin_03,HIGH); // 1채널 릴레이 ON
else digitalWrite(Relaypin_03,LOW); // 1채널 릴레이 OFF
}
val1 = analogRead(analogPin_01); // analogPin 의 변화값(전류값)을 읽음
val2 = analogRead(analogPin_02); // analogPin 의 변화값(전류값)을 읽음
val3 = analogRead(analogPin_03); // analogPin 의 변화값(전류값)을 읽음
if (val1 > 100) {
digitalWrite(Relaypin_01,LOW); // 1채널 릴레이 off
Switch_01TF = false;
}
if (val2 > 100) {
digitalWrite(Relaypin_02,LOW); // 1채널 릴레이 off
Switch_02TF = false;
}
if (val3 > 100) {
digitalWrite(Relaypin_03,LOW); // 1채널 릴레이 off
Switch_03TF = false;
}
Serial.print("val1 : ");
Serial.print(val1, DEC);
Serial.print(" val2 : ");
Serial.print(val2, DEC);
Serial.print(" val3 : ");
Serial.println(val3, DEC);
}
boolean debounce(int pin)
{
boolean state;
boolean previousState;
previousState = digitalRead(pin); // store switch state
for (int counter=0; counter < debounceDelay; counter++)
{
delay(1); // wait for 1 millisecond
state = digitalRead(pin); // read the pin
if (state != previousState)
{
counter = 0; // reset the counter if the state changes
previousState = state; // and save the current state
}
}
// here when the switch state has been stable longer than the debounce period
if(state == LOW)
return true;
else
return false;
}
자카르타정님의 댓글
자카르타정 작성일
감사합니다. 마스터님이 일단 주신 코드를 적용시켜 매우 잘 동작하고 있습니다.
이렇게 큰 도움 주셔서 정말 감사드립니다.
건강한 하루 되십시오!!
정말 다시한번 감사드립니다