Motion (PIR), actuator and Temp sensor
-
Hi,
I'm trying to make and sensor, as subject says. I've got temp (DS18B20) and actuator working, but not the PIR (HC-SR501).
PINs as follow:
RADIO IRQ = PIN2
Temp = PIN3
PIR data = PIN4
Actuator = PIN 5,6My question is now, does a PIR require an Interrupt PIN on the arduino (PIN 2,3) , or can I use any PIN?
-
If you want to sleep the node, then using pin-interrrupt is a great way of waking the node when motion is detected.
You can use use the radio-irq pin for you sensors. It is currently not used by the mysensors library.
@hek said:
If you want to sleep the node, then using pin-interrrupt is a great way of waking the node when motion is detected.
You can use use the radio-irq pin for you sensors. It is currently not used by the mysensors library.
So, not need to wire the radio IRQ PIN at all?
-
@hek said:
If you want to sleep the node, then using pin-interrrupt is a great way of waking the node when motion is detected.
You can use use the radio-irq pin for you sensors. It is currently not used by the mysensors library.
So, not need to wire the radio IRQ PIN at all?
-
Ok, finally got it to work with this:
// Example sketch showing how to control physical relays. // This example will remember relay state even after power failure. #include <MySensor.h> #include <SPI.h> #include <DallasTemperature.h> #include <OneWire.h> #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected #define MAX_ATTACHED_DS18B20 16 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); float lastTemperature[MAX_ATTACHED_DS18B20]; int numSensors=0; //boolean receivedConfig = false; boolean metric = true; #define RELAY_1 5 // Arduino Digital I/O pin number for first relay (second on pin+1 etc) #define RELAY_2 6 #define RELAY_ON 1 // GPIO value to write to turn on attached relay #define RELAY_OFF 0 // GPIO value to write to turn off attached relay // Motion sensor defs unsigned long SLEEP_TIME = 10000; // Sleep time between reports (in milliseconds) #define DIGITAL_INPUT_SENSOR 4 // The digital input you attached your motion sensor. (Only 2 and 3 generates interrupt!) //#define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway) #define CHILD_ID 3 // Id of the sensor child boolean lastTrippedState; MySensor gw; // MyMessage msgTemp(0, V_TEMP); MyMessage msgRelay2(2, V_LIGHT); MyMessage msgMotion(3, V_TRIPPED); void setup() { gw.begin(incomingMessage, AUTO, true); gw.sendSketchInfo("Temp/Relay/Motion Sensor", "1.0"); // gw.present(1, S_LIGHT); pinMode(RELAY_1, OUTPUT); // gw.present(2, S_LIGHT); pinMode(RELAY_2, OUTPUT); digitalWrite(RELAY_1, gw.loadState(1)? RELAY_ON : RELAY_OFF); digitalWrite(RELAY_2, gw.loadState(1)? RELAY_ON : RELAY_OFF); pinMode(DIGITAL_INPUT_SENSOR, INPUT); // sets the motion sensor digital pin as input // gw.present(CHILD_ID, S_MOTION); // Fetch the number of attached temperature sensors //numSensors = sensors.getDeviceCount(); // Present all sensors to controller //for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { gw.present(0, S_TEMP); //} } // void loop() { gw.process(); boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; if (tripped != lastTrippedState) { Serial.println(tripped? "tripped" : "not tripped"); gw.send(msgMotion.set(tripped?"1":"0")); // Send tripped value to gw// //digitalWrite(RELAY_1, tripped? 1 : 0); } lastTrippedState = tripped; // Fetch temperatures from Dallas sensors sensors.requestTemperatures(); // Read temperatures and send them to controller //for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { // Fetch and round temperature to one decimal float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(0):sensors.getTempFByIndex(0)) * 10.)) / 10.; // Only send data if temperature has changed more then 1 degC and no error if (int(lastTemperature[0]) != int(temperature) && temperature != -127.00) { //added integer // Send in the new temperature gw.send(msgTemp.setSensor(0).set(temperature,1)); lastTemperature[0]=temperature; } //} } void incomingMessage(const MyMessage &message) { // if (message.type==V_LIGHT && message.sensor == 2) { // Change relay state digitalWrite(RELAY_2, message.getBool()?RELAY_ON:RELAY_OFF); // Store state in eeprom gw.saveState(message.sensor, message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } }
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login