Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- * RS485 Node
- For controlling relays and talking to temperature/humidity sensors.
- Will have several onewire buses for different sensor locations.
- DHT22 will be replaced with sensirion SHT75
- MCP23017 is used to give more GPIO's for the pro mini, 8 ports is used for relay outputs
- the remaining 8 is used as inputs to check output states.
- */
- #include "DHT.h"
- #include <Wire.h>
- #include "Adafruit_MCP23017.h"
- #include <EasyTransfer.h>
- #define led 13
- #define DHTPIN 5
- #define DHTTYPE DHT22
- DHT dht(DHTPIN, DHTTYPE);
- EasyTransfer ETin, ETout;
- struct RECEIVE_DATA_STRUCTURE{
- int address;
- int id;
- int port;
- int highlow;
- };
- struct SEND_DATA_STRUCTURE{
- //put your variable definitions here for the data you want to receive
- //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
- int id;
- int port;
- int buttonstate;
- };
- RECEIVE_DATA_STRUCTURE rxdata;
- SEND_DATA_STRUCTURE txdata;
- int ownaddress = 1;
- //Reading ID's
- int relay = 0;
- int temp = 1;
- int hum = 2;
- int dr = 3;
- long previousMillis = 0; // will store last time LED was updated
- // Storage for temperature and humidity
- float h;
- float t;
- // the follow variables is a long because the time, measured in miliseconds,
- // will quickly become a bigger number than can be stored in an int.
- long interVal = 5000; // interval at which to blink (milliseconds)
- Adafruit_MCP23017 mcp; // Initialize MCP
- void setup(){
- mcp.begin(); // Start MCP23017
- dht.begin(); // Start DHT
- Serial.begin(115200); // Start serial for RS485
- // Start the library, pass in the data details and the name of the serial port.
- ETin.begin(details(rxdata), &Serial);
- ETout.begin(details(txdata), &Serial);
- delay(5);
- // Set ports 0 - 7 on MCP as outputs, and write LOW to them.
- for (int thisPin = 0; thisPin < 8; thisPin++) {
- mcp.pinMode(thisPin, OUTPUT);
- mcp.digitalWrite(thisPin, LOW);
- }
- // Set ports 8 - 15 on MCP as inputs.
- for (int thisPin = 8; thisPin < 16; thisPin++) {
- mcp.pinMode(thisPin, INPUT);
- }
- // Set led pin as output.
- pinMode(led, OUTPUT);
- }
- void loop(){
- dhtMillis(); // Take readings from DHT22 as often as interVal says
- // Check for incoming data
- if(ETin.receiveData()){
- drRequest(); // Check if there are digitalRead requests from master
- tempHum(); // Check for temperature or humidity requests from master
- if(rxdata.address == ownaddress && rxdata.id == relay){ // If address matches the node, and id == relay
- relaySwitch(); // Run relay function
- }
- }
- delay(1);
- }
- void dhtMillis(){
- // Save millis
- unsigned long currentMillis = millis();
- // If enough time has passed take sensor reading.
- if(currentMillis - previousMillis > interval) {
- // Save the last time sensor reading was taken
- previousMillis = currentMillis;
- // Read humidity
- h = dht.readHumidity();
- // Read temperature as Celsius
- t = dht.readTemperature();
- // If there is something wrong with reading DHT22 blink led.
- if (isnan(h) || isnan(t)) {
- pinMode(13, HIGH);
- delay(100);
- pinMode(13, LOW);
- return;
- }
- }
- }
- void drRequest(){
- if(rxdata.id == dr){ // If id == digitalRead, read port and send info back
- txdata.id = rxdata.id; // Send id requested back to master
- txdata.port = rxdata.port; // Send port requested back to master
- txdata.buttonstate = mcp.digitalRead(16-rxdata.port); // Read output port
- ETout.sendData(); // Send data
- }
- }
- void relaySwitch(){
- mcp.digitalWrite(rxdata.port-1, rxdata.highlow); // Subtract -1 to get port 0 when turning on relay 1
- txdata.id = rxdata.id; // Send id back to master
- txdata.port = rxdata.port; // Send port back to master
- txdata.buttonstate = rxdata.highlow; // Send state received from master back for confirmation
- if(mcp.digitalRead(16-rxdata.port) != rxdata.highlow){ // If output of port does not match received state
- mcp.digitalWrite(rxdata.port-1, rxdata.highlow); // Do a new digitalWrite to port with received state
- }
- ETout.sendData(); // Send data back
- }
- void tempHum(){
- if(rxdata.id == temp){
- switch(rxdata.port){
- case 0:
- txdata.id = temp;
- txdata.port = int(t)*100; // Cast from float to int, multiply by 100 to keep decimals
- txdata.buttonstate = false;
- ETout.sendData();
- break;
- // Fake sensor
- case 1:
- txdata.id = temp;
- txdata.port = 33.5;
- txdata.buttonstate = false;
- ETout.sendData();
- break;
- default: // If sensor does not exist
- txdata.id = temp;
- txdata.port = 0.0;
- txdata.buttonstate = true; // Send a true back, and master will know
- ETout.sendData();
- break;
- }
- }
- if(rxdata.id == hum){
- switch(rxdata.port){
- case 0:
- txdata.id = hum;
- txdata.port = int(h*100); // Cast from float to int, multiply by 100 to keep decimals
- txdata.buttonstate = false;
- ETout.sendData();
- break;
- // Fake sensor
- case 1:
- txdata.id = hum;
- txdata.port = 34.23;
- txdata.buttonstate = false;
- ETout.sendData();
- break;
- default: // If sensor does not exist
- txdata.id = hum;
- txdata.port = 0.0;
- txdata.buttonstate = true; // Send a true back, and master will know
- ETout.sendData();
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement