Movement – simple

The Passive Infra-red (PIR) motion sensor, more commonly recognised as the ‘office/classroom/toilet light sensor’, is a relatively simple device that makes use of a diffusing fresnel lens to pick up any infra-red radiation (i.e. heat) that stands out from the surroundings. Due to the level of integration of this sensor, you'll find that it registers movement rather accurately, but timing/sensitivity adjustments are possibly limiting – they are after all used mainly in checking for presence of people in a room before switching on/off the lights. That said they can still be useful for simple, hardy movement detectors.

Code-wise we are back to the A/D Blackbox, because we are simply using an digital input for sensing. Notice a trend here? Yes, for ‘simple’ sensors like these we are basically attaching their analogue/digital outputs to an analogue/digital INPUT pin on the Photon, and having our Photon read the value in code before churning it out to both Blynk and publishing it to the Particle Cloud – where IFTTT can ‘listen’ in and log it in Google Spreadsheets.

If that still sounds overwhelming, compare the differences between this recipe and other A/D Blackbox recipes – you'll find very little difference between them.


Libraries Used

(learn how to import them in the Build IDE):


Code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// how long between each log update? feel free to change this value,
// but this must not be anything less than 1000 milliseconds!
#define INTERVAL_BETWEEN_LOGS 5000

// initialise the timer
Timer dataTimer(INTERVAL_BETWEEN_LOGS, doDataUpdate);


// code in this setup function runs just once, when Photon is powered up or reset
void setup() {
    Serial.begin(9600);         // Open a connection via the Serial port / USB cable – useful for debugging
    delay(5000);                // Common practice to allow board to 'settle' after connecting online

    dataTimer.start();

    pinMode(D0, INPUT_PULLDOWN); // tell the Photon we're using D0 as an INPUT (pulldown resistor enabled)

    // if you're adding more digital pins as INPUT, add lines similar to the above accordingly.

    // note: analogue pins do not need to be initialised as they are INPUTs by default
}

// code in this loop function runs forever, until you cut power!
// for the A/D blackbox, there is nothing to do in here because data updates are handled by our timer
void loop() {

}

// doDataUpdate runs every interval set in INTERVAL_BETWEEN_LOGS
void doDataUpdate() {
    // IMPORTANT: to prevent server overload, the Particle cloud can only accept
    // update rates of once per second, with the option to 'burst' 4 updates in a
    // second (but then you'll get blocked for the next 4 seconds). 'Ration' your
    // INTERVAL_BETWEEN_LOGS and the number of readings you are publishing; in our
    // default example, we are frugally using just 1 publish, by concatenating
    // all the data we want into a single publish statement

    // first we save what we want to read into temporary variables first.
    // feel free to add/remove these lines as you see fit in your application:

    bool D0State = digitalRead(D0); // read a digital true/false state from D0

    // now we form the concatenated string to put them all together. This String
    // must NOT exceed 255 characters!
    String output = "D0:" + String(D0State);

    // prints this out the Serial port (coolterm) for us HUMANS to verify and
    // debug; comment the next line if you don't want to see it in Coolterm
    Serial.println(output);

    // finally, send it out (and have sensored.mdit.space receive it):
    Particle.publish("sensorData", output);
}