#include #include #include #include #include //Ethernet byte mac[] = {0xAA, 0xDD, 0xBB, 0x10, 0x01, 0x01}; IPAddress ip(192, 168, 178, 30); //IP of the ATEM switcher ATEM AtemSwitcher(IPAddress(192, 168, 178, 20), 56417); //program boolean programStat[4] = {1,1,1,1}; # define programStatLength 4 //preview boolean previewStat[4] = {1,1,1,1}; # define previewStatLength 4 //program LEDs const int programLED[] = {2,4}; # define programLEDlength 2 //preview LEDs const int previewLED[] = {3,5}; # define previewLEDlength 2 //init NRF RF24 radio (7, 8); const uint16_t address = 0xADB5; uint16_t datasend = 0; //define min interval to send data unsigned long currentTime = millis(); unsigned long previousTime = 0; const long intervalTime = 1000; void setup(){ for (int i=0; i < programLEDlength; i++){ pinMode(programLED[i], OUTPUT); digitalWrite(programLED[i], HIGH); } for (int i=0; i < previewLEDlength; i++){ pinMode(previewLED[i], OUTPUT); digitalWrite(previewLED[i], HIGH); } //start Ethernet Ethernet.begin(mac,ip); //start Serial Serial.begin(9600); Serial.println("start serial"); //connect to the switcher Serial.println("connect to ATEM"); AtemSwitcher.serialOutput(false); AtemSwitcher.connect(); //start NRF Serial.println("start NRF"); radio.begin(); radio.openWritingPipe(address); radio.setPALevel(RF24_PA_MIN); radio.setDataRate(RF24_1MBPS); //radio.disableDynamicPayloads(); radio.setAutoAck(false); radio.disableCRC(); radio.stopListening(); delay(100); } void loop(){ //check for new packages AtemSwitcher.runLoop(); currentTime = millis(); if (dataChanged() || currentTime - previousTime >= intervalTime){ sendNRF(); previousTime = currentTime; delay(20); } } void sendNRF(){ //program for (int i=0; i < programStatLength; i++) { datasend = (datasend << 1) + programStat[i]; } datasend = datasend << (8 - programStatLength); //preview for (int i=0; i < programStatLength; i++) { datasend = (datasend << 1) + previewStat[i]; } datasend = datasend << (8 - previewStatLength); //datasend = (datasend << 8) + getChecksum(datasend & 0xFF); Serial.print(" datasend: "); Serial.println(datasend, BIN); radio.writeFast(&datasend, sizeof(datasend)); } boolean dataChanged(){ boolean changed = false; for (int i=0; i < programStatLength; i++){ if (AtemSwitcher.getProgramTally(i+1) != programStat[i]){ programStat[i] = AtemSwitcher.getProgramTally(i+1); if(programLEDlength > i)digitalWrite(programLED[i], programStat[i]); changed = true; } } for (int i=0; i < previewStatLength; i++){ if (AtemSwitcher.getPreviewTally(i+1) != previewStat[i]){ previewStat[i] = AtemSwitcher.getPreviewTally(i+1); if(previewLEDlength > i)digitalWrite(previewLED[i], previewStat[i]); changed = true; } } return changed; } byte getChecksum(byte data){ byte checksum = 0; for (int i=8; i<8; i++) checksum += (data >> i) & B1; return checksum; }