# Tracy Hall 12/14/2021 lots of code remnants. Needs Arduino Mega and ESP-01 module. Uses prevous E1.31 Code. #There was a lot of trial and error to get this code to operate at speed. #include #include #include #include #define ETHERNET_BUFFER_MAX 638 #define E131_SUBNET 0 #define E131_START_ADDRESS 126 //Byte 126 in the packet contains channel 1 values. Offset is set to one prior. #define NUM_RELAYS 16 //total number of relays used int channel; // channel increment //Relay Pins array int Relay[] = {22,24,26,28,30,32,34,36,23,25,27,29,31,33,35,37,}; //Timer Setup volatile byte currentcounter = 0; //counter for data reception byte previouscounter = 0; //counter for data reception unsigned long currentDelay = 0; //current time value for ArtNet and E1.31 reception E131 e131; // WiFiUdpSender Udp; WiFiEspUDP Udp; // Create an instance of the WiFiUDP class to send and receive int responseTime = 1000; //communication timeout int cnt = 0; //Create a counter int epack = 0; int Lcnt = 0; int postcnt = 1; //#include //use mega Serial 2 for serial monitor; Serial 1 on pins 19 (RX) and 18 (TX);// Serial2 on pins 17 (RX) and 16 (TX), Serial3 on pins 15 (RX) and 14 (TX). // #define SSID "********" #define PASS "********" const char ssid[] = "********"; // The network SSID (name) you're connecting to const char pass[] = "********"; // The passwrod of the network you're connecting to byte mac[] = { 0x48, 0x3F, 0xDA, 0x43, 0xD9, 0x48 }; const PROGMEM byte ACN_ID[12] = { 0x41, 0x53, 0x43, 0x2d, 0x45, 0x31, 0x2e, 0x31, 0x37, 0x00, 0x00, 0x00 }; IPAddress ip(192, 168, 1, 120); //IP address of ethernet shield IPAddress gateway(192,168,1,1); IPAddress netmask(255,255,255,0); IPAddress dns(192,168,1,1); // buffer to hold E1.31 and Artnet data unsigned char pBuf[ETHERNET_BUFFER_MAX]; // Sender Data for info unsigned char sender[36]; int status = WL_IDLE_STATUS; // the Wifi radio's status // String HostIp = "192.168.1.58"; uint16_t localPort = 5568; // local port to listen on uint16_t remPort = 0; String port = "5568"; char packetBuffer[255]; //buffer to hold incoming packet char ReplyBuffer[] = "acknowledged"; // a string to send back #define DST_IP "192.168.1.58" //baidu.com //SoftwareSerial dbgSerial(10, 11); // RX, TX void setup() { // Open serial communications and wait for port to open: Serial.begin(230400); while (!Serial); //serial 2 is to esp8266 Serial2.begin(115200);//9600 (mine), 57600, 115200, 250000, 230400 Serial2.setTimeout(3000); //serial 0 is to usb while(!Serial); while(!Serial2); Serial.println("ESP8266 Demo on Mega2560"); delay(1000); sendToWifi("AT+GMR",50); //test if the module is ready Serial.println("Resetting module"); delay(1000); sendToWifi("AT+CWMODE_DEF=1",responseTime); sendToWifi("AT+CWLAP",2000); sendToWifi("AT+CIPSTA_DEF=\"192.168.1.120\"",50); sendToWifi("AT+CIFSR",responseTime); sendToWifi("AT+RST",50); sendToWifi("AT+CWJAP_CUR=\"neongreen_G\",\"********\"",50); delay(2000); Serial2.flush(); sendToWifi("AT+CWMODE_DEF=1",50); Serial2.flush(); sendToWifi("AT+CIPDOMAIN=\"192.168.1.1\"",50); delay(1000);//...("AT+CIPSTART=4,\"TCP\",\"192.168.1.19\",80"); WiFi.init(&Serial2); // pins 16 and 17 e131.begin("E131_UNICAST"); // attempt to connect to WiFi network while ( status != WL_CONNECTED) { Serial.print("Attempting to connect to WPA SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network WiFi.config(ip); /* Choose one to begin listening for E1.31 data */ status = WiFi.begin(ssid, pass); // e131.beginUnicast(ssid, pass, ip, netmask,gateway, dns); delay(1000); } Serial.print("Firmware "); Serial.println(WiFi.firmwareVersion()); Serial.print("Status "); Serial.println(WiFi.status()); Serial.print("SSID "); Serial.println(WiFi.SSID()); Serial.println(WiFi.localIP()); Serial.print("Signal strength (RSSI):"); Serial.print(WiFi.RSSI()); Serial.println(" dBm"); // printCurrentNet(); delay(3000); StartUDP(); // Start listening for UDP messages on port 5568 InitRelays(); POST(); //Run Power On Self Test Function POST1(); //Run Power On Self Test Function POST2(); //Run Power On Self Test Function //set the single connection mode // Serial2.println("AT+CIPMUX=0"); } void loop() { epack = 0; // postcnt = 0; Lcnt++; readFromWifi( 100 ); E1_31data2relays(pBuf,NUM_RELAYS); // Timer check Serial.print("currentcounter "); Serial.print(currentcounter); Serial.print(" prevcnt "); Serial.print(previouscounter); Serial.print(" curDly "); Serial.println(currentDelay); if(currentcounter != previouscounter) //has the value changed? { currentDelay = millis(); //store the time since the value has increased previouscounter = currentcounter; //set the previous value equal to the current value } if(millis() - currentDelay > 30000) //is the time since the value changed greater than 30 seconds? { // digitalWrite(STATUS_LED, LOW); //turn LED off. Not receiving E1.31 or ArtNet. Serial.print("Pcnt "); Serial.print(postcnt); Serial.print(" "); Serial.println("No E1.31 Data"); switch (postcnt){ case 0: POST(); postcnt++; break; case 1: POST1(); postcnt++; break; case 2: POST2(); postcnt++; break; case 3: postcnt = 0; break; // POST1(); // POST1(); } } } void sendToWifi(String command, const int timeout){ // only send command, not intereted in response String response = ""; // Serial.print("Sent command to ESP8266-E12: "); // Serial.print(command); delay(50); Serial2.println(command); long int time = millis(); while( (time+timeout) > millis()) { while(Serial2.available()) { char c = Serial2.read(); response+=c; } } Serial.print("cmd To: "); Serial.print(command); Serial.print(" resp ESP-01: "); Serial.print(response.substring(1,25)); Serial.print(" "); Serial.print(response); Serial.print("\n"); } void readFromWifi( const int timeout){ // only send command, not intereted in response String response = ""; // String IPsender = ""; char s[60]; char t[60]; char u[60]; char v[60]; long int time = millis(); while( (time+timeout) > millis()) { cnt = 0; while(Serial2.available()) { currentcounter++; cnt++; // delay(50); int packsize1 = Udp.parsePacket(); int len = Udp.read(pBuf, 255); // int packsize1 = Udp.parsePacket(); IPAddress remotIp = Udp.remoteIP(); // int packsize1 = Udp.parsePacket(); Udp.endPacket(); Serial.print(" Lcnt " ); Serial.print(Lcnt); Serial.print(" pktln " ); Serial.print(len); Serial.print(" SZ "); Serial.print(packsize1); Serial.print(" Tim "); Serial.print(millis()); Serial.print(" "); Serial.print("remIP "); Serial.print(remotIp); Serial.print(" : "); // delay(10); remPort = Udp.remotePort(); Serial.print(remPort); char c = Serial2.read(); // delay(10); Serial.print(" 125>"); sprintf(s,"%02x %02x %02x %02x %02x %02x %02x %02x -9> %02x %02x %02x %02x %02x %02x %02x %02x %02x",pBuf[125],pBuf[126],pBuf[127],pBuf[128],pBuf[129],pBuf[130],pBuf[131],pBuf[132],pBuf[133],pBuf[134],pBuf[135],pBuf[136],pBuf[137],pBuf[138],pBuf[139],pBuf[140],pBuf[141],pBuf[142]); Serial.print(s); // Troubleshooting info for data at speed // Serial.print(" 107> "); // sprintf(t,"%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",pBuf[107],pBuf[108],pBuf[109],pBuf[110],pBuf[111],pBuf[112],pBuf[113],pBuf[114],pBuf[115],pBuf[116],pBuf[117],pBuf[118],pBuf[119],pBuf[120],pBuf[121],pBuf[122],pBuf[123],pBuf[124],pBuf[125]); // Serial.print(t); // if (pBuf[0]== 0x00 && pBuf[1] == 0x10 && pBuf[2] == 0x00 && pBuf[3] == 0x00) { // Serial.print(" Epacket> "); // } // sprintf(u,"00> %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",pBuf[0],pBuf[1],pBuf[2],pBuf[3],pBuf[4],pBuf[5],pBuf[6],pBuf[7],pBuf[8],pBuf[9],pBuf[10],pBuf[11],pBuf[12],pBuf[13],pBuf[14],pBuf[15],pBuf[16],pBuf[17],pBuf[18]); // Serial.print(u); // Serial.print(" 113 e131subnet> "); // Serial.print(pBuf[113],HEX); Serial.print(" 114 univ> "); Serial.print(pBuf[114],DEC); Serial.print(" 111 pkgSeq> "); Serial.println(pBuf[111],DEC); } // char sendr[28]; // Serial.println(response); // sprintf(s," %02x %02x %02x %02x %02x %02x",pBuf[126],pBuf[127],pBuf[128],pBuf[129],pBuf[130],pBuf[131]); // Serial.print(s); // Serial.print("sender> "); // Serial.println((char*)sender); / if(cnt >= 681) cnt = 0; } //While Available // while(!Serial2.available()){ // Serial.println(" Not Avail "); // delay(50); // break; // } // } // while timeout // Serial.println(response); } //Funtion call void printWifiData() { // print your WiFi shield's IP address IPAddress ip = WiFi.localIP(); Serial.print("IPaddrs_pwfd: "); Serial.print(ip); // print your MAC address byte mac[6]; WiFi.macAddress(mac); char buf[18]; sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]); Serial.print(" MAC addrss: "); Serial.print(buf); Serial.print(" RSSI:"); Serial.print(WiFi.RSSI()); Serial.println(" dBm"); } void StartUDP() { Serial.print("Starting UDP "); Udp.begin(localPort); // Start listening for UDP messages on port 5568 Serial.println(" Local port:\t 5568"); } void printCurrentNet() { // print the SSID of the network you're attached to Serial.print("SSID: "); Serial.println(WiFi.SSID()); // print the MAC address of the router you're attached to byte bssid[6]; WiFi.BSSID(bssid); char buf[20]; sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", bssid[5], bssid[4], bssid[3], bssid[2], bssid[1], bssid[0]); Serial.print("BSSID: "); Serial.println(buf); // print the received signal strength long rssi = WiFi.RSSI(); Serial.print("Signal strength (RSSI): "); Serial.println(rssi); } void E1_31data2relays(unsigned char* pBuf, int count) { if ( pBuf[113] == E131_SUBNET ) //simple check for valid data { int addressOffset = 125; //first 125 bytes of packet are header information if ( pBuf[addressOffset] == 0 ) //start code must be 0 { channel = 0; //reset channel offset to 0 each time through loop //loop turns relay on/off based on channel value starting at E1.31 start address for(int c = 0; c < NUM_RELAYS; c++) { if(pBuf[E131_START_ADDRESS + channel] > 127) //if channel value is greater then 127 { digitalWrite(Relay[c], HIGH); //turn relay on flipped } else { digitalWrite(Relay[c], LOW); //turn relay off flipped } channel++; //increment channel offset by 1 } } } } //end sacnDMXReceived \ void InitRelays() { for(int a = 0; a < NUM_RELAYS; a++) {//loop to initialize relay control pins pinMode(Relay[a], OUTPUT); //initialize relay output pins digitalWrite(Relay[a], LOW); //set pins to high for ON delay(700); digitalWrite(Relay[a], HIGH); //set pins to LOW for off } Serial.println("InitRelays Completed"); } void POST() { digitalWrite(Relay[0], LOW); digitalWrite(Relay[1], LOW); digitalWrite(Relay[2], LOW); digitalWrite(Relay[3], LOW); delay(1000); digitalWrite(Relay[0], HIGH); digitalWrite(Relay[1], HIGH); digitalWrite(Relay[2], HIGH); digitalWrite(Relay[3], HIGH); delay(1000); digitalWrite(Relay[4], LOW); digitalWrite(Relay[5], LOW); digitalWrite(Relay[6], LOW); digitalWrite(Relay[7], LOW); delay(1000); digitalWrite(Relay[4], HIGH); digitalWrite(Relay[5], HIGH); digitalWrite(Relay[6], HIGH); digitalWrite(Relay[7], HIGH); // // Serial.println("Bank One Complete"); // digitalWrite(Relay[8], LOW); digitalWrite(Relay[9], LOW); digitalWrite(Relay[10], LOW); digitalWrite(Relay[11], LOW); delay(1000); digitalWrite(Relay[8], HIGH); digitalWrite(Relay[9], HIGH); digitalWrite(Relay[10], HIGH); digitalWrite(Relay[11], HIGH); delay(1000); digitalWrite(Relay[12], LOW); digitalWrite(Relay[13], LOW); digitalWrite(Relay[14], LOW); digitalWrite(Relay[15], LOW); delay(1000); digitalWrite(Relay[12], HIGH); digitalWrite(Relay[13], HIGH); digitalWrite(Relay[14], HIGH); digitalWrite(Relay[15], HIGH); // Serial.println("Post Complete"); } void POST1() { digitalWrite(Relay[0], LOW); digitalWrite(Relay[1], HIGH); digitalWrite(Relay[2], LOW); digitalWrite(Relay[3], HIGH); digitalWrite(Relay[4], LOW); digitalWrite(Relay[5], HIGH); digitalWrite(Relay[6], LOW); digitalWrite(Relay[7], HIGH); digitalWrite(Relay[8], LOW); digitalWrite(Relay[9], HIGH); digitalWrite(Relay[10], LOW); digitalWrite(Relay[11], HIGH); digitalWrite(Relay[12], LOW); digitalWrite(Relay[13], HIGH); digitalWrite(Relay[14], LOW); digitalWrite(Relay[15], HIGH); delay(2000); digitalWrite(Relay[0], HIGH); digitalWrite(Relay[1], LOW); digitalWrite(Relay[2], HIGH); digitalWrite(Relay[3], LOW); digitalWrite(Relay[4], HIGH); digitalWrite(Relay[5], LOW); digitalWrite(Relay[6], HIGH); digitalWrite(Relay[7], LOW); digitalWrite(Relay[8], HIGH); digitalWrite(Relay[9], LOW); digitalWrite(Relay[10], HIGH); digitalWrite(Relay[11], LOW); digitalWrite(Relay[12], HIGH); digitalWrite(Relay[13], LOW); digitalWrite(Relay[14], HIGH); digitalWrite(Relay[15], LOW); // Serial.println("POST1 Complete"); // // Serial.println("POST1 Complete"); } void POST2() { // Serial.println("POST2 Started"); for(int a = 0; a < NUM_RELAYS; a++) //loop to initialize relay control pins { pinMode(Relay[a], OUTPUT); //initialize relay output pins digitalWrite(Relay[a], LOW); //set pins to LOW for off delay(300); digitalWrite(Relay[a], HIGH); //set pins to high for ON delay(300); digitalWrite(Relay[a], LOW); //set pins to LOW for off } Serial.println("POST2 Completed"); }