Advertisement
Guest User

AVR Sketch

a guest
Jan 12th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 16.25 KB | None | 0 0
  1. #include <dht.h>
  2. #include <IRremote.h>
  3. #include <SPI.h>
  4. #include <Ethernet.h>
  5. #include <PubSubClient.h>
  6.  
  7. #define CaFan 22 //AV Rack fan
  8. #define RmFan 23 //Room fan
  9. #define Sub 24 //subwoofer
  10. #define Motion 26 //motion detector
  11. #define RMTemp 27 //Room temp/humidity sensor
  12. #define IRIn 28  //IR receiver
  13. #define AVTemp 29 //AV Rack Temp/humidity sensor
  14. #define doorbell 30  //door bell relay
  15.  
  16. //define global variables
  17. unsigned long TempMillis = millis(); //holds millis count for temp sensing
  18. unsigned long mMillis = 0; //holds millis count for motion sensor
  19. unsigned long UpdateMillis = millis() - 1800000; //holds millis count for sending MQTT status updates
  20. unsigned long dbMillis = 0; //holds millis count for doorbell delay
  21. int motionstatus = 0;
  22. int motionlast = 0;
  23. int dbStatus = 1;
  24. int dbLast = 1;
  25. float AVt = 0;//av and room temp/humidity variables
  26. float AVh = 0;
  27. float RMt = 0;
  28. float RMh = 0;
  29. float AVtL = 0;//av and room temp/humidity last state variables
  30. float AVhL = 0;
  31. float RMtL = 0;
  32. float RMhL = 0;
  33. char message_buff[100];
  34.  
  35. dht DHT;
  36.  
  37. IRrecv irrecv(IRIn);
  38. decode_results results;
  39.  
  40. // Ethernet shield
  41. byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
  42. //IPAddress ip(10, 0, 0, 10);
  43. IPAddress server(10, 0, 0, 20);
  44. EthernetClient ethClient;
  45. PubSubClient client(ethClient);
  46.  
  47.  
  48. //MQTT CALLBACK FUNCTION----------------------------------------------------------------------------
  49. void callback(char* topic, byte* payload, unsigned int length) {
  50.   Serial.print("Message arrived [");
  51.   Serial.print(topic);
  52.   Serial.print("] ");
  53.   for (int i=0;i<length;i++) {
  54.     Serial.print((char)payload[i]);
  55.   }
  56.   Serial.println();
  57.  
  58.   if (strcmp(topic,"/theater/AVR/CaFan")==0) //evaluate payload
  59.   {
  60.     if (payload[0] == '0') //turn off
  61.     {
  62.       digitalWrite(CaFan, HIGH);
  63.       delay(100);
  64.       client.publish("/theater/AVR/CaFan/state","OFF");
  65.       Serial.println("Case Fan OFF");
  66.     }
  67.     else if (payload[0] == '1') //turn on
  68.     {
  69.       digitalWrite(CaFan, LOW);
  70.       delay(100);
  71.       client.publish("/theater/AVR/CaFan/state","ON");
  72.       Serial.println("Case Fan ON");
  73.     }
  74.     else if (payload[0] == '2') //status update
  75.     {
  76.       if (digitalRead(CaFan)==0) client.publish("/theater/AVR/CaFan/state","ON");
  77.       else client.publish("/theater/AVR/CaFan/state","OFF");
  78.     }
  79.  }
  80. if (strcmp(topic,"/theater/AVR/RmFan")==0) //evaluate payload
  81.   {
  82.     if (payload[0] == '0') //turn off
  83.     {
  84.       digitalWrite(RmFan, HIGH);
  85.       delay(100);
  86.       client.publish("/theater/AVR/RmFan/state","OFF");
  87.       Serial.println("Room Fan OFF");
  88.     }
  89.     else if (payload[0] == '1') //turn on
  90.     {
  91.       digitalWrite(RmFan, LOW);
  92.       delay(100);
  93.       client.publish("/theater/AVR/RmFan/state","ON");
  94.       Serial.println("Room Fan ON");
  95.     }
  96.     else if (payload[0] == '2') //status update
  97.     {
  98.       if (digitalRead(RmFan)==0) client.publish("/theater/AVR/RmFan/state","ON");
  99.       else client.publish("/theater/AVR/RmFan/state","OFF");
  100.     }
  101.  }
  102.  
  103.    if (strcmp(topic,"/theater/AVR/Sub")==0) //evaluate payload
  104.   {
  105.     if (payload[0] == '0') //turn off
  106.     {
  107.       digitalWrite(Sub, HIGH);
  108.       delay(100);
  109.       client.publish("/theater/AVR/Sub/state","OFF");
  110.       Serial.println("Sub OFF");
  111.     }
  112.     else if (payload[0] == '1') //turn on
  113.     {
  114.       digitalWrite(Sub, LOW);
  115.       delay(100);
  116.       client.publish("/theater/AVR/Sub/state","ON");
  117.       Serial.println("Sub ON");
  118.     }
  119.     else if (payload[0] == '2') //status update
  120.     {
  121.       if (digitalRead(Sub)==0) client.publish("/theater/AVR/Sub/state","ON");
  122.       else client.publish("/theater/AVR/Sub/state","OFF");
  123.     }
  124.  }  
  125. }
  126. //END MQTT CALLBACK FUNCTION----------------------------------------------------------------------------
  127.  
  128. //MQTT RECONNECT FUNCTION
  129. void reconnect() {
  130.   // Loop until we're reconnected
  131.   while (!client.connected()) {
  132.     Serial.print("Attempting MQTT connection...");
  133.     // Attempt to connect
  134.     if (client.connect("arduinoClient")) {
  135.       Serial.println("connected");
  136.       client.subscribe("/theater/AVR/#"); //subscribe to all messages aimed for this device
  137.     } else {
  138.       Serial.print("failed, rc=");
  139.       Serial.print(client.state());
  140.       Serial.println(" try again in 5 seconds");
  141.       // Wait 5 seconds before retrying
  142.       delay(5000);
  143.     }
  144.   }
  145. }
  146. //END MQTT RECONNECT FUNCTION----------------------------------------------------------------------------
  147.  
  148. //SETUP----------------------------------------------------------------------------
  149. void setup() {
  150.   //setup pins
  151.   pinMode(CaFan, OUTPUT);
  152.   pinMode(RmFan, OUTPUT);
  153.   pinMode(Sub, OUTPUT);
  154.   pinMode(Motion, INPUT);
  155.   pinMode(doorbell, INPUT);
  156.   //set outputs to HIGH
  157.   digitalWrite(CaFan, HIGH);
  158.   digitalWrite(RmFan, HIGH);
  159.   digitalWrite(Sub, HIGH);
  160.   digitalWrite(doorbell, HIGH);
  161.   //setup serial and print header
  162.   Serial.begin(9600);
  163.   Serial.println("MoxieSoft 'TM'");
  164.   Serial.println("Theater Control Module");
  165.   Serial.println("Version 1.3\n\n");
  166.   irrecv.enableIRIn(); // Start the IR receiver
  167.   client.setServer(server, 1883);  //MQTT setup
  168.   client.setCallback(callback);
  169.   if (Ethernet.begin(mac) == 0) {
  170.     Serial.println("Failed to configure Ethernet using DHCP");
  171.     // no point in carrying on, so do nothing forevermore:
  172.     for (;;)
  173.       ;
  174.   }
  175.   // print your local IP address:
  176.   Serial.print("My IP address: ");
  177.   for (byte thisByte = 0; thisByte < 4; thisByte++) {
  178.     // print the value of each byte of the IP address:
  179.     Serial.print(Ethernet.localIP()[thisByte], DEC);
  180.     Serial.print(".");
  181.   }
  182.   Serial.println();
  183. }
  184. //END SETUP----------------------------------------------------------------------------
  185.  
  186. //MAIN LOOP----------------------------------------------------------------------------
  187. void loop() {
  188. //MOTION SENSOR----------------------------------------------------------------------------
  189.   if (millis() > mMillis+500) //monitor motion every 500ms
  190.   {
  191.     motionstatus = digitalRead(Motion);
  192.     mMillis = millis();
  193.     if (motionlast != motionstatus) { //avoid resending state
  194.       motionlast = motionstatus;  //reset state
  195.       Serial.print("Motion is: ");
  196.       Serial.println(motionstatus);
  197.       if (motionstatus==1) client.publish("/theater/AVR/Motion/state","OPEN"); //send MQTT update to openhab
  198.       else client.publish("/theater/AVR/Motion/state","CLOSED");
  199.       mMillis = millis() + 4000; //delay keeps from a bounce & flooding openhab
  200.  
  201.     }
  202.   }
  203. //END MOTION SENSOR----------------------------------------------------------------------------
  204. //STATUS UPDATES----------------------------------------------------------------------------
  205.   if (millis() > UpdateMillis+1800000) //send status updates once every 30 minutes
  206.   {
  207.     if (motionstatus==1) client.publish("/theater/AVR/Motion/state","OPEN");
  208.     else client.publish("/theater/AVR/Motion/state","CLOSED");
  209.     if (digitalRead(Sub)==0) client.publish("/theater/AVR/Sub/state","ON");
  210.     else client.publish("/theater/AVR/Sub/state","OFF");
  211.     if (digitalRead(RmFan)==0) client.publish("/theater/AVR/RmFan/state","ON");
  212.     else client.publish("/theater/AVR/RmFan/state","OFF");    
  213.     if (digitalRead(CaFan)==0) client.publish("/theater/AVR/CaFan/state","ON");
  214.     else client.publish("/theater/AVR/CaFan/state","OFF");
  215.     UpdateMillis = millis();
  216.   }
  217. //END STATUS UPDATES----------------------------------------------------------------------------
  218. //IR RECEIVER----------------------------------------------------------------------------
  219.   if (irrecv.decode(&results)) {
  220.     switch(results.value)
  221.       {    
  222.       case 0x3A2A: Serial.println("Projector ON"); break;
  223.       case 0x7A2A: Serial.println("Projector OFF");    break;
  224.       case 0x542A: Serial.println("Projector Toggle");    break;
  225.       case 0x4BB620DF: Serial.println("Receiver ON");   break;
  226.       case 0x4B36E21D: Serial.println("Receiver OFF"); break;
  227.       case 0x4B36D32C: Serial.println("Receiver Toggle");    break;
  228.       case 0x4BB640BF: Serial.println("Receiver Volume Up");    break;
  229.       case 0x4BB6C03F: Serial.println("Receiver Volume Down");    break;
  230.       case 0x4BB6A05F: Serial.println("Receiver Mute");    break;
  231.       case 0x11B6897: Serial.println("Xbox One Play");    break;
  232.       case 0x11B18E7: Serial.println("Xbox One Pause");    break;
  233.       case 0x11B9867: Serial.println("Xbox One Stop");    break;
  234.       case 0xA25D807F: Serial.println("Sub ON");    //turn on sub relay and update openhab via MQTT,  this is numeric '1' on toshiba se-r0121 remote
  235.         digitalWrite(Sub, LOW); //turn on sub
  236.         client.publish("/theater/AVR/Sub/state","ON");
  237.         break;
  238.       case 0xA25D40BF: Serial.println("Sub OFF");   //turn off sub relay and update openhab via MQTT, this is numeric '2' on toshiba se-r0121 remote
  239.         digitalWrite(Sub, HIGH); //turn off sub
  240.         client.publish("/theater/AVR/Sub/state","OFF");
  241.         break;
  242.       case 0xA25DC03F: Serial.println("Sub Toggle");   //toggle the state of the sub relay and update openhab via MQTT  
  243.         if (digitalRead(Sub) == LOW)
  244.           {
  245.             digitalWrite(Sub, HIGH);
  246.             client.publish("/theater/AVR/Sub/state","OFF");
  247.           }
  248.         else
  249.           {
  250.             digitalWrite(Sub, LOW);
  251.             client.publish("/theater/AVR/Sub/state","ON");
  252.           }
  253.         break;
  254.       case 0xA25D20DF: Serial.println("room Light on"); //turn room light on, 4 on remote
  255.         client.publish("/theater/AVR/OHL/state","1");
  256.         break;
  257.       case 0xA25DA05F: Serial.println("room Light off"); //turn room light off, 5 on remote
  258.         client.publish("/theater/AVR/OHL/state","0");
  259.         break;
  260.       case 0xA25D609F: Serial.println("room Light up"); //turn room light up, 6 on remote
  261.         client.publish("/theater/AVR/OHL/state","2");
  262.         break;
  263.       case 0xA25DE01F: Serial.println("room Light down"); //turn room light down, 7 on remote
  264.         client.publish("/theater/AVR/OHL/state","3");
  265.         break;
  266.       case 0xFFFFFFFF: break;  
  267.       default:  //outputs remote code to serial if unrecognized
  268.         Serial.print("Unknown IR Value: 0x");
  269.         Serial.println(results.value, HEX);
  270.       break;
  271.   }// End Case
  272.     irrecv.resume(); // Receive the next value
  273.   }
  274. //END IR RECEIVER----------------------------------------------------------------------------
  275. //DOORBELL----------------------------------------------------------------------------
  276. if (millis() > dbMillis) //check every loop but reset millis one button is pushed to delay 1 minute
  277. {
  278.   dbStatus = digitalRead(doorbell);
  279.   if (dbStatus != dbLast)  //state changed
  280.   {
  281.     if (dbStatus == 0) //button is pressed
  282.     {
  283.       //doorbell rang, do something
  284.       client.publish("/theater/AVR/DB/state","ON");//send MQTT doorbell pushed
  285.       Serial.println("Doorbell Pressed");
  286.       dbLast = dbStatus;
  287.       dbMillis = millis() + 2000;  //wait 1 second to look for button release
  288.     }
  289.     else //button was released
  290.     {
  291.       client.publish("/theater/AVR/DB/state","OFF");//send MQTT doorbell released
  292.       dbMillis = millis() + 60000; //wait 1 minute to keep from receiving several doorbell notifications in a row
  293.       Serial.println("Doorbell Released");
  294.       dbLast = dbStatus;
  295.     }
  296.   } else
  297.   {
  298.     dbMillis = millis() + 100; //check every 10ms (reduce load on proc but still catch super short presses)
  299.   }
  300. }
  301. //END DOORBELL----------------------------------------------------------------------------
  302. //ETHERNET RECONNECT----------------------------------------------------------------------------
  303.   if (!client.connected()) {
  304.     reconnect();
  305.   }
  306.   client.loop();
  307. //END ETHERNET RECONNECT----------------------------------------------------------------------------
  308. //TEMP SENSORS----------------------------------------------------------------------------
  309.   if (millis() > TempMillis+30000) //read temp sensors once every 30 seconds
  310.   {
  311.     int chk = NULL;
  312.     //AV Sensor handling------
  313.     chk = DHT.read22(AVTemp); //read from av sensor
  314.     AVt = Fahrenheit(DHT.temperature);
  315.     AVh = DHT.humidity;
  316.     switch (chk)
  317.     {
  318.       case 0:
  319.       {
  320.         if (AVtL <= (AVt-1) || AVtL >= (AVt+1)) //evaluate temperature
  321.         {
  322.           Serial.print("AV Temperature = ");
  323.           Serial.print(AVt);
  324.           Serial.print(", Rounded: ");
  325.           Serial.println(AVt, 0);
  326.           AVtL = AVt;
  327.           String pubString = String(AVt,0);
  328.           pubString.toCharArray(message_buff, pubString.length()+1);
  329.           client.publish("/theater/AVR/AVT/state", message_buff);
  330.         }
  331.         if (AVhL <= (AVh-1) || AVhL >= (AVh+1)) //evaluate humidity
  332.         {
  333.           Serial.print("AV Humidity = ");
  334.           Serial.print(AVh);
  335.           Serial.print(", Rounded: ");
  336.           Serial.println(AVh, 0);
  337.           AVhL = AVh;
  338.           String pubString = String(AVh, 0);
  339.           pubString.toCharArray(message_buff, pubString.length()+1);
  340.           client.publish("/theater/AVR/AVH/state", message_buff);
  341.         }
  342.         break;
  343.       }
  344.       case -1:
  345.       {
  346.         Serial.println("AVR DHT Checksum error");
  347.         break;
  348.       }
  349.       case -2:
  350.       {
  351.         Serial.println("AVR DHT Time out error");
  352.         break;
  353.       }
  354.       default: Serial.println("Unknown AVR DHT Read error"); break;
  355.     }
  356.     //ROOM Sensor handling------
  357.     chk = NULL;
  358.     chk = DHT.read22(RMTemp); //read from av sensor
  359.     RMt = Fahrenheit(DHT.temperature);
  360.     RMh = DHT.humidity;
  361.     switch (chk)
  362.     {
  363.       case 0:
  364.       {
  365.         if (RMtL <= (RMt-1) || RMtL >= (RMt+1)) //evaluate temperature
  366.         {
  367.           Serial.print("Room Temperature = ");
  368.           Serial.print(RMt);
  369.           Serial.print(", Rounded: ");
  370.           Serial.println(RMt, 0);
  371.           RMtL = RMt;
  372.           String pubString = String(RMt, 0);
  373.           pubString.toCharArray(message_buff, pubString.length()+1);
  374.           client.publish("/theater/AVR/RMT/state", message_buff);
  375.         }
  376.         if (RMhL <= (RMh-1) || RMhL >= (RMh+1)) //evaluate humidity
  377.         {
  378.           Serial.print("Room Humidity = ");
  379.           Serial.print(RMh);
  380.           Serial.print(", Rounded: ");
  381.           Serial.println(RMh, 0);
  382.           RMhL = RMh;
  383.           String pubString = String(RMh, 0);
  384.           pubString.toCharArray(message_buff, pubString.length()+1);
  385.           client.publish("/theater/AVR/RMH/state", message_buff);
  386.         }
  387.         break;
  388.       }
  389.       case -1:
  390.       {
  391.         Serial.println("Room DHT Checksum error");
  392.         break;
  393.       }
  394.       case -2:
  395.       {
  396.         Serial.println("Room DHT Time out error");
  397.         break;
  398.       }
  399.       default: Serial.println("Unknown Room DHT Read error"); break;
  400.     }
  401.    
  402.     TempMillis = millis();  //set TempMillis to current millis to restart "timer"
  403.   }
  404. //END TEMP SENSORS----------------------------------------------------------------------------
  405. //START ETHERNET IP MAINTAIN-------------------------------------------------------------------
  406. switch (Ethernet.maintain())
  407.   {
  408.     case 1:
  409.       //renewed fail
  410.       Serial.println("Error: renewed fail");
  411.       break;
  412.     case 2:
  413.       //renewed success
  414.       Serial.println("Renewed success");
  415.       //print your local IP address:
  416.       printIPAddress();
  417.       break;
  418.     case 3:
  419.       //rebind fail
  420.       Serial.println("Error: rebind fail");
  421.       break;
  422.     case 4:
  423.       //rebind success
  424.       Serial.println("Rebind success");
  425.       //print your local IP address:
  426.       printIPAddress();
  427.       break;
  428.     default:
  429.       //nothing happened
  430.       break;
  431.   }
  432. //END ETHERNET IP MAINTAIN-------------------------------------------------------------------
  433.  
  434. }
  435. //END MAIN LOOP----------------------------------------------------------------------------
  436.  
  437.  
  438. //CELSIUS TO FAHRENHEIT CONVERSION----------------------------------------------------------------------------
  439. double Fahrenheit(double celsius)
  440. {
  441.         return 1.8 * celsius + 32;
  442. }
  443. //END CELSIUS TO FAHRENHEIT CONVERSION----------------------------------------------------------------------------
  444.  
  445. void printIPAddress()
  446. {
  447.   Serial.print("My IP address: ");
  448.   for (byte thisByte = 0; thisByte < 4; thisByte++) {
  449.     // print the value of each byte of the IP address:
  450.     Serial.print(Ethernet.localIP()[thisByte], DEC);
  451.     Serial.print(".");
  452.   }
  453.  
  454.   Serial.println();
  455. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement