Vibration/Knock

A piezo element generates a low-current, high voltage spike when knocked, flexed or through some mechanical means. Be gentle with it though, the element is not designed for stomping directly on! Using the simple piezo sensor board and some additional protection resistors, find ways to attach the piezo element to panels, floorboards, boxes and see what results you get. Humans need not necessarily be the only elements interacting with the sensors – what else could?

Code-wise we are back to the A/D Blackbox, because we are simply using an analogue input for sensing. Notice a trend here? Yes, for ‘simple’ sensors like these we are basically attaching their analogue outputs to an analogue 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 compatible services can ‘listen’ in and log it in Google Spreadsheets, for example.

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.

Sensor details: https://www.dfrobot.com/product-399.html


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
// 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();

    // 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:

    int A0State = analogRead(A0); // read an analogue range (0-4095) from A0

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

    // 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);
}