/************************************************************* This is a simple demo of sending and receiving some data. Be sure to check out other examples! *************************************************************/ /* nodemcu, CD74HC4067 16 채널 멀티플렉서 디지털 PCB 모듈을 이용한 16채널릴레이 제어 선연결은 아래와 같음 (nodemcu) GND ------ GND (16 channel relay) (nodemcu) GND ------ GND (CD74HC4067) (nodemcu) 3V3 ------ VCC (CD74HC4067) (nodemcu) D7 ------ s0 (CD74HC4067) (nodemcu) D6 ------ s1 (CD74HC4067) (nodemcu) D5 ------ s2 (CD74HC4067) (nodemcu) D2 ------ s3 (CD74HC4067) (nodemcu) D0 ------ SIG (CD74HC4067) 2022/11/29 기존에 거꾸로 되어있어서 수정함. (nodemcu) D1 ------ EN (CD74HC4067) (CD74HC4067)c0~c15 ------ 1~16 (16 channel relay) (16 channel relay)에 추가적으로 24dc 전원 연결하기. */ const int SIG = D0;// SIG pin const int EN = D1;// Enable pin const int controlPin[4] = {D7, D6, D5, D2}; // 4 pins used for binary output ( nodemcu에서 쓸수있는 디지털 핀 d1,d2,d5,d6,d7) int loopDelay = 1000;// delay in loop const int muxTable[16][4] = { // s0, s1, s2, s3 channel {0, 0, 0, 0}, // 0 {1, 0, 0, 0}, // 1 {0, 1, 0, 0}, // 2 {1, 1, 0, 0}, // 3 {0, 0, 1, 0}, // 4 {1, 0, 1, 0}, // 5 {0, 1, 1, 0}, // 6 {1, 1, 1, 0}, // 7 {0, 0, 0, 1}, // 8 {0, 1, 0, 1}, // 9 9랑 10이 이상하게 바뀌어서 나옴 그래서 위치를 바꾸어봄 9->10 {1, 0, 0, 1}, // 10 10->9 {1, 1, 0, 1}, // 11 {0, 0, 1, 1}, // 12 {1, 0, 1, 1}, // 13 {0, 1, 1, 1}, // 14 {1, 1, 1, 1} // 15 }; // Template ID, Device Name and Auth Token are provided by the Blynk.Cloud // See the Device Info tab, or Template settings #define BLYNK_TEMPLATE_ID "blynk에서 발급받을수 있다." #define BLYNK_DEVICE_NAME "교반기16채널" #define BLYNK_AUTH_TOKEN "blynk에서 발급받을수 있다." // Comment this out to disable prints and save space #define BLYNK_PRINT Serial #include #include //#include #include char auth[] = BLYNK_AUTH_TOKEN; // Your WiFi credentials. // Set password to "" for open networks. char ssid[] = "와이파이아이디"; char pass[] = "와이파이비번"; int flag=0; BlynkTimer timer; // This function is called every time the Virtual Pin 0 state changes BLYNK_WRITE(V0) //전진 { if(flag==1){ cleanAllState(); } // Set incoming value from pin V0 to a variable int value = param.asInt(); if(value ==1){ digitalWrite(EN, LOW); channelControl(0); flag=1; } else if(value == 0){ digitalWrite(EN, HIGH); flag=0; } // Update state Blynk.virtualWrite(V0, value); } BLYNK_WRITE(V1) //후진 { if(flag==1){ cleanAllState(); } // Set incoming value from pin V1 to a variable int value = param.asInt(); if(value ==1){ digitalWrite(EN, LOW); channelControl(1); flag=1; } else if(value == 0){ digitalWrite(EN, HIGH); flag=0; } // Update state Blynk.virtualWrite(V1, value); } BLYNK_WRITE(V2) //좌회전 { if(flag==1){ cleanAllState(); } int value = param.asInt(); if(value ==1){ digitalWrite(EN, LOW); channelControl(2); flag=1; } else if(value == 0){ digitalWrite(EN, HIGH); flag=0; } // Update state Blynk.virtualWrite(V2, value); } BLYNK_WRITE(V3) //우회전 { if(flag==1){ cleanAllState(); } // Set incoming value from pin V0 to a variable int value = param.asInt(); if(value ==1){ digitalWrite(EN, LOW); channelControl(3); flag=1; } else if(value == 0){ digitalWrite(EN, HIGH); flag=0; } // Update state Blynk.virtualWrite(V3, value); } BLYNK_WRITE(V4) //콘베아상승 { if(flag==1){ cleanAllState(); } // Set incoming value from pin V0 to a variable int value = param.asInt(); if(value ==1){ digitalWrite(EN, LOW); channelControl(4); flag=1; } else if(value == 0){ digitalWrite(EN, HIGH); flag=0; } // Update state Blynk.virtualWrite(V4, value); } BLYNK_WRITE(V5) //콘베아하강 { if(flag==1){ cleanAllState(); } // Set incoming value from pin V0 to a variable int value = param.asInt(); if(value ==1){ digitalWrite(EN, LOW); channelControl(5); flag=1; } else if(value == 0){ digitalWrite(EN, HIGH); flag=0; } // Update state Blynk.virtualWrite(V5, value); } BLYNK_WRITE(V6) //좌이동 { if(flag==1){ cleanAllState(); } // Set incoming value from pin V0 to a variable int value = param.asInt(); if(value ==1){ digitalWrite(EN, LOW); channelControl(6); flag=1; } else if(value == 0){ digitalWrite(EN, HIGH); flag=0; } // Update state Blynk.virtualWrite(V6, value); } BLYNK_WRITE(V7) //우이동 { if(flag==1){ cleanAllState(); } // Set incoming value from pin V0 to a variable int value = param.asInt(); if(value ==1){ digitalWrite(EN, LOW); channelControl(7); flag=1; } else if(value == 0){ digitalWrite(EN, HIGH); flag=0; } // Update state Blynk.virtualWrite(V7, value); } BLYNK_WRITE(V8) //유압모타 { if(flag==1){ cleanAllState(); } // Set incoming value from pin V0 to a variable int value = param.asInt(); if(value ==1){ digitalWrite(EN, LOW); channelControl(8); flag=1; } else if(value == 0){ digitalWrite(EN, HIGH); flag=0; } // Update state Blynk.virtualWrite(V8, value); } BLYNK_WRITE(V9) //콘베아모타 { if(flag==1){ cleanAllState(); } // Set incoming value from pin V0 to a variable int value = param.asInt(); if(value ==1){ digitalWrite(EN, LOW); channelControl(9); flag=1; } else if(value == 0){ digitalWrite(EN, HIGH); flag=0; } // Update state Blynk.virtualWrite(V9, value); } BLYNK_WRITE(V10) //비상정지 { if(flag==1){ cleanAllState(); } // Set incoming value from pin V0 to a variable int value = param.asInt(); if(value ==1){ digitalWrite(EN, LOW); channelControl(10); flag=1; } else if(value == 0){ digitalWrite(EN, HIGH); flag=0; } // Update state Blynk.virtualWrite(V10, value); } BLYNK_WRITE(V11) { if(flag==1){ cleanAllState(); } // Set incoming value from pin V0 to a variable int value = param.asInt(); if(value ==1){ digitalWrite(EN, LOW); channelControl(11); flag=1; } else if(value == 0){ digitalWrite(EN, HIGH); flag=0; } // Update state Blynk.virtualWrite(V11, value); } // This function is called every time the device is connected to the Blynk.Cloud BLYNK_CONNECTED() { } // This function sends Arduino's uptime every second to Virtual Pin 2. void myTimerEvent() { } void setup() { // Debug console Serial.begin(9600); Blynk.begin(auth, ssid, pass); // You can also specify server: //Blynk.begin(auth, ssid, pass, "blynk.cloud", 80); //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080); // Setup a function to be called every second timer.setInterval(1000L, myTimerEvent); for(int i=0; i<4; i++) { pinMode(controlPin[i], OUTPUT);// set pin as output digitalWrite(controlPin[i], HIGH); // set initial state as HIGH } pinMode(SIG, OUTPUT);// set SIG pin as output digitalWrite(SIG, LOW); // set SIG sends what should be the output // for low trigger relay it should be LOW // for HIGH trigger high it should be HIGH pinMode(EN, OUTPUT);// set EN pin as output digitalWrite(EN, HIGH); // set EN in (enable pin) Low to activate the chip ,High to deactivate } void loop() { Blynk.run(); timer.run(); // You can inject your own code or combine it with other sketches. // Check other examples on how to communicate with Blynk. Remember // to avoid delay() function! } void channelControl(int relayChannel) { digitalWrite(controlPin[0], muxTable[relayChannel][0]); digitalWrite(controlPin[1], muxTable[relayChannel][1]); digitalWrite(controlPin[2], muxTable[relayChannel][2]); digitalWrite(controlPin[3], muxTable[relayChannel][3]); /* Serial.print(relayChannel); Serial.print (": "); Serial.print(muxTable[relayChannel][3]); Serial.print(muxTable[relayChannel][2]); Serial.print(muxTable[relayChannel][1]); Serial.println(muxTable[relayChannel][0]); */ } void cleanAllState(){ Blynk.virtualWrite(V0, 0); Blynk.virtualWrite(V1, 0); Blynk.virtualWrite(V2, 0); Blynk.virtualWrite(V3, 0); Blynk.virtualWrite(V4, 0); Blynk.virtualWrite(V5, 0); Blynk.virtualWrite(V6, 0); Blynk.virtualWrite(V7, 0); Blynk.virtualWrite(V8, 0); Blynk.virtualWrite(V9, 0); Blynk.virtualWrite(V10, 0); Blynk.virtualWrite(V11, 0); }