Advertisement
Guest User

node1

a guest
Dec 14th, 2014
315
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.88 KB | None | 0 0
  1. * RS485 Node
  2.  For controlling relays and talking to temperature/humidity sensors.
  3.  Will have several onewire buses for different sensor locations.
  4.  DHT22 will be replaced with sensirion SHT75
  5.  
  6.  MCP23017 is used to give more GPIO's for the pro mini, 8 ports is used for relay outputs
  7. the remaining 8 is used as inputs to check output states.
  8. */
  9.  
  10. #include "DHT.h"
  11. #include <Wire.h>
  12. #include "Adafruit_MCP23017.h"
  13. #include <EasyTransfer.h>
  14.  
  15. #define led 13
  16.  
  17. #define DHTPIN 5
  18. #define DHTTYPE DHT22
  19.  
  20. DHT dht(DHTPIN, DHTTYPE);
  21.  
  22.  
  23. EasyTransfer ETin, ETout;
  24.  
  25. struct RECEIVE_DATA_STRUCTURE{
  26.  int address;
  27.  int id;
  28.  int port;
  29.  int highlow;
  30. };
  31.  
  32. struct SEND_DATA_STRUCTURE{
  33.  //put your variable definitions here for the data you want to receive
  34.  //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
  35.  int id;
  36.  int port;
  37.  int buttonstate;
  38. };
  39.  
  40. RECEIVE_DATA_STRUCTURE rxdata;
  41. SEND_DATA_STRUCTURE txdata;
  42.  
  43. int ownaddress = 1;
  44.  
  45.  
  46. //Reading ID's
  47. int relay = 0;      
  48. int temp =  1;
  49. int hum  =  2;
  50. int dr   =  3;
  51.  
  52. long previousMillis = 0;        // will store last time LED was updated
  53.  
  54. // Storage for temperature and humidity
  55. float h;
  56. float t;
  57.  
  58. // the follow variables is a long because the time, measured in miliseconds,
  59. // will quickly become a bigger number than can be stored in an int.
  60. long interVal = 5000;           // interval at which to blink (milliseconds)
  61.  
  62. Adafruit_MCP23017 mcp;     // Initialize MCP
  63.  
  64. void setup(){
  65.   mcp.begin();             // Start MCP23017
  66.   dht.begin();             // Start DHT
  67.   Serial.begin(115200);    // Start serial for RS485
  68.  
  69.   // Start the library, pass in the data details and the name of the serial port.
  70.   ETin.begin(details(rxdata), &Serial);
  71.   ETout.begin(details(txdata), &Serial);
  72.   delay(5);
  73.  
  74.   // Set ports 0 - 7 on MCP as outputs, and write LOW to them.
  75.   for (int thisPin = 0; thisPin < 8; thisPin++)  {
  76.     mcp.pinMode(thisPin, OUTPUT);    
  77.     mcp.digitalWrite(thisPin, LOW);  
  78.   }
  79.  
  80.   // Set ports 8 - 15 on MCP as inputs.
  81.   for (int thisPin = 8; thisPin < 16; thisPin++)  {
  82.     mcp.pinMode(thisPin, INPUT);  
  83.   }
  84.   // Set led pin as output.
  85.   pinMode(led, OUTPUT);
  86.  
  87. }
  88.  
  89. void loop(){
  90.  
  91.   dhtMillis(); // Take readings from DHT22 as often as interVal says
  92.  
  93.     // Check for incoming data
  94.   if(ETin.receiveData()){
  95.     drRequest();      // Check if there are digitalRead requests from master
  96.     tempHum();        // Check for temperature or humidity requests from master
  97.  
  98.     if(rxdata.address == ownaddress && rxdata.id == relay){ // If address matches the node, and id == relay
  99.       relaySwitch();  // Run relay function
  100.     }
  101.   }
  102.   delay(1);
  103. }
  104.  
  105. void dhtMillis(){
  106.   // Save millis
  107.   unsigned long currentMillis = millis();
  108.  
  109.   // If enough time has passed take sensor reading.
  110.   if(currentMillis - previousMillis > interval) {
  111.     // Save the last time sensor reading was taken
  112.     previousMillis = currentMillis;  
  113.  
  114.     // Read humidity
  115.     h = dht.readHumidity();
  116.     // Read temperature as Celsius
  117.     t = dht.readTemperature();
  118.  
  119.     // If there is something wrong with reading DHT22 blink led.
  120.     if (isnan(h) || isnan(t)) {
  121.       pinMode(13, HIGH);
  122.       delay(100);
  123.       pinMode(13, LOW);
  124.       return;
  125.     }
  126.   }
  127. }
  128.  
  129. void drRequest(){
  130.   if(rxdata.id == dr){      // If id == digitalRead, read port and send info back
  131.     txdata.id = rxdata.id;  // Send id requested back to master
  132.     txdata.port = rxdata.port; // Send port requested back to master
  133.     txdata.buttonstate = mcp.digitalRead(16-rxdata.port);  // Read output port
  134.     ETout.sendData();       // Send data
  135.   }
  136. }
  137.  
  138. void relaySwitch(){
  139.   mcp.digitalWrite(rxdata.port-1, rxdata.highlow);  // Subtract -1 to get port 0 when turning on relay 1
  140.   txdata.id = rxdata.id;                            // Send id back to master
  141.   txdata.port = rxdata.port;                        // Send port back to master
  142.   txdata.buttonstate = rxdata.highlow;              // Send state received from master back for confirmation
  143.   if(mcp.digitalRead(16-rxdata.port) != rxdata.highlow){  // If output of port does not match received state
  144.     mcp.digitalWrite(rxdata.port-1, rxdata.highlow);      // Do a new digitalWrite to port with received state
  145.   }
  146.   ETout.sendData();       // Send data back
  147. }
  148.  
  149. void tempHum(){
  150.   if(rxdata.id == temp){
  151.     switch(rxdata.port){
  152.     case 0:
  153.       txdata.id = temp;
  154.       txdata.port = int(t)*100;    // Cast from float to int, multiply by 100 to keep decimals
  155.       txdata.buttonstate = false;
  156.       ETout.sendData();
  157.       break;
  158.       // Fake sensor
  159.     case 1:
  160.       txdata.id = temp;
  161.       txdata.port = 33.5;
  162.       txdata.buttonstate = false;
  163.       ETout.sendData();
  164.       break;
  165.     default:              // If sensor does not exist
  166.       txdata.id = temp;
  167.       txdata.port = 0.0;
  168.       txdata.buttonstate = true;  // Send a true back, and master will know
  169.       ETout.sendData();
  170.       break;
  171.     }
  172.   }
  173.  
  174.   if(rxdata.id == hum){
  175.     switch(rxdata.port){
  176.     case 0:
  177.       txdata.id = hum;
  178.       txdata.port = int(h*100);    // Cast from float to int, multiply by 100 to keep decimals
  179.       txdata.buttonstate = false;
  180.       ETout.sendData();
  181.       break;
  182.       // Fake sensor
  183.     case 1:
  184.       txdata.id = hum;            
  185.       txdata.port = 34.23;
  186.       txdata.buttonstate = false;
  187.       ETout.sendData();
  188.       break;
  189.     default:            // If sensor does not exist
  190.       txdata.id = hum;
  191.       txdata.port = 0.0;
  192.       txdata.buttonstate = true;  // Send a true back, and master will know
  193.       ETout.sendData();
  194.       break;
  195.     }
  196.   }
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement