Isabel - Networking

Made by Isabel Fleck

Learning how to use events to network and share data across devices and publish.

Created: December 12th, 2024

0

In working to network, we initially started by ensuring that each device had the same working code, and that each device was wired and worked the exact same to each other. This is because, when we network, we wanted the devices to imitate each other in real time. 

0
// This #include statement was automatically added by the Particle IDE.
#include <neopixel.h>

#include "Particle.h"
#include "neopixel.h"

SYSTEM_MODE(AUTOMATIC);

// Define pin and NeoPixel configuration for Photon 2
#if (PLATFORM_ID == 32)
#define NEOPIXEL_PIN SPI // Use MOSI for Photon 2
#else
#define NEOPIXEL_PIN D3 // Use D3 for other Particle devices
#endif

#define NUM_PIXELS 8     // Number of LEDs in the NeoPixel strip
#define PIXEL_TYPE WS2812B // Specify the NeoPixel type

// Pressure sensor pin
#define PRESSURE_PIN A0

// Create a NeoPixel object
Adafruit_NeoPixel strip(NUM_PIXELS, NEOPIXEL_PIN, PIXEL_TYPE);

void setup() {
    strip.begin();   // Initialize NeoPixel strip
    strip.show();    // Turn off all LEDs initially
    Serial.begin(9600); // Debugging

    // Subscribe to events from the Particle Cloud
    Particle.subscribe("weatherEvent", weatherEventHandler);
}

// Function prototypes for weather effects
void thunderEffect();
void rainEffect();
void cloudyEffect();
void sunnyEffect();

// Function to publish weather events
void publishWeatherEvent(const char* eventName) {
    String event = String("weatherEvent/") + eventName;
    Particle.publish(event);  // Publish the event with the prefix
    weatherEventHandler(event.c_str(), ""); // Call event handler immediately
}

// Particle event handler
void weatherEventHandler(const char* event, const char* data) {
    String eventString = String(event);

    if (eventString == "weatherEvent/sunny") {
        sunnyEffect(); // Call sunny effect function
    }
    else if (eventString == "weatherEvent/cloudy") {
        cloudyEffect(); // Call cloudy effect function
    }
    else if (eventString == "weatherEvent/rainy") {
        rainEffect(); // Call rainy effect function
    }
    else if (eventString == "weatherEvent/thunder") {
        thunderEffect(); // Call thunder effect function
    }
}

void loop() {
    // Read the pressure sensor value
    int pressure = analogRead(PRESSURE_PIN);
    Serial.println(pressure); // Debugging the sensor value

    // Determine weather event based on pressure level
    if (pressure > 3600) {
        publishWeatherEvent("thunder");
    } else if (pressure > 2700) {
        publishWeatherEvent("rainy");
    } else if (pressure > 1800) {
        publishWeatherEvent("cloudy");
    } else if (pressure > 900) {
        publishWeatherEvent("sunny");
    } else {
        strip.clear(); // Turn off LEDs when pressure is too low
        strip.show();
    }
}

// Thunder: Blue and yellow flash
void thunderEffect() {
    for (int i = 0; i < NUM_PIXELS; i++) {
        strip.clear();
        if (i % 2 == 0) {
            strip.setPixelColor(i, strip.Color(0, 0, 128)); // Dim blue
        } else {
            strip.setPixelColor(i, strip.Color(128, 128, 0)); // Dim yellow
        }
        strip.show();
        delay(50);
    }
    strip.clear();
    strip.show();
}

// Rain: Light dim blue light
void rainEffect() {
    for (int i = 0; i < NUM_PIXELS; i++) {
        strip.clear();
        strip.setPixelColor(i, strip.Color(0, 0, 128)); // Dim blue
        strip.show();
        delay(100);
    }
}

// Cloudy: Dim violet/lavender light
void cloudyEffect() {
    static int brightness = 0;
    static int direction = 5;

    brightness += direction;
    if (brightness >= 100 || brightness <= 0) {
        direction = -direction;
    }

    uint32_t color = strip.Color(75 + brightness, 50 + brightness, 150 + brightness); // Dim lavender/violet
    for (int i = 0; i < NUM_PIXELS; i++) {
        strip.setPixelColor(i, color);
    }
    strip.show();
    delay(50);
}

// Sunny: Warm orange light
void sunnyEffect() {
    static int brightness = 0;
    static int direction = 5;

    brightness += direction;
    if (brightness >= 255 || brightness <= 50) {
        direction = -direction;
    }

    uint32_t color = strip.Color(255, 140, 0); // Warm orange
    for (int i = 0; i < NUM_PIXELS; i++) {
        strip.setPixelColor(i, color);
    }
    strip.show();
    delay(50);
}
Click to Expand
0

As we worked, I made sure to separate each of the pattern for light settings representing weather, into separate events, in this way we could publish each event. However, when I created a webhook, and copied this code to the second device, we found that they still would not respond to each other, and thought it could be an issue with the way in which the events where titled. So, changing the titles to numbers, we could try to identify where to source of the issue was coming from. Asking for help from our TA, we eventually were able to get the devices networked. However, the first setting for sunny, and the second for cloudy would only flash for a second at the start for each time the event was called, instead of carrying out the pattern for longer within each setting. Since the rain and the thunder effects were already similiar in this way, we did not need to change this. But for the first two, we used milis and a delay after each was called, in order to try and imitate the outcome we were looking for.

0
#include "Particle.h"
#include "neopixel.h"

SYSTEM_MODE(AUTOMATIC);

// Define pin and NeoPixel configuration for Photon 2
#if (PLATFORM_ID == 32)
#define NEOPIXEL_PIN SPI // Use MOSI for Photon 2
#else
#define NEOPIXEL_PIN D3 // Use D3 for other Particle devices
#endif

#define NUM_PIXELS 8     // Number of LEDs in the NeoPixel strip
#define PIXEL_TYPE WS2812B // Specify the NeoPixel type

// Pressure sensor pin
#define PRESSURE_PIN A0

// This value will store the last time we published an event
long lastPublishedAt = 0;
// this is the time delay before we should publish a new event
int publishAfter = 10000;

// Create a NeoPixel object
Adafruit_NeoPixel strip(NUM_PIXELS, NEOPIXEL_PIN, PIXEL_TYPE);

void setup() {
    strip.begin();   // Initialize NeoPixel strip
    strip.show();    // Turn off all LEDs initially
    Serial.begin(9600); // Debugging

    // Subscribe to shared events
    Particle.subscribe("weatherEvent/shared", weatherEventHandler);
}

// Function prototypes for weather effects
void thunderEffect();
void rainEffect();
void cloudyEffect();
void sunnyEffect();

// Function to publish weather events
void publishWeatherEvent(const char* eventName) {
    String event = String("weatherEvent/shared/") + System.deviceID() + "/" + eventName;
    Particle.publish(event);  // Publish the shared event
    weatherEventHandler(event.c_str(), ""); // Call event handler immediately for local effect
    delay(1000);
}

// Particle event handler
void weatherEventHandler(const char* event, const char* data) {
    String eventString = String(event);
    Serial.println(eventString);
    // Ignore events originating from this device
    // if (eventString.indexOf(System.deviceID()) != -1) return;

    // Parse the event name to determine the weather condition
    if (eventString.endsWith("/sunny")) {
        sunnyEffect();
    } else if (eventString.endsWith("/cloudy")) {
        cloudyEffect();
    } else if (eventString.endsWith("/rainy")) {
        rainEffect();
    } else if (eventString.endsWith("/thunder")) {
        thunderEffect();
    }
}

void loop() {
    // Read the pressure sensor value
    int pressure = analogRead(PRESSURE_PIN);
    // Serial.println(pressure); // Debugging the sensor value

    // Determine weather event based on pressure level
    if (pressure > 3600) {
        publishWeatherEvent("thunder");
    } else if (pressure > 2700) {
        publishWeatherEvent("rainy");
    } else if (pressure > 1800) {
        publishWeatherEvent("cloudy");
    } else if (pressure > 900) {
        publishWeatherEvent("sunny");
    } else {
        strip.clear(); // Turn off LEDs when pressure is too low
        strip.show();
    }
}

// Thunder: Blue and yellow flash
void thunderEffect() {
    for (int i = 0; i < NUM_PIXELS; i++) {
        strip.clear();
        if (i % 2 == 0) {
            strip.setPixelColor(i, strip.Color(0, 0, 128)); // Dim blue
        } else {
            strip.setPixelColor(i, strip.Color(128, 128, 0)); // Dim yellow
        }
        strip.show();
        delay(50);
    }
    strip.clear();
    strip.show();
}

// Rain: Light dim blue light
void rainEffect() {
    for (int i = 0; i < NUM_PIXELS; i++) {
        strip.clear();
        strip.setPixelColor(i, strip.Color(0, 0, 128)); // Dim blue
        strip.show();
        delay(100);
    }
}

// Cloudy: Dim violet/lavender light
void cloudyEffect() {
    static int brightness = 0;
    static int direction = 5;

    brightness += direction;
    if (brightness >= 100 || brightness <= 0) {
        direction = -direction;
    }

    uint32_t color = strip.Color(75 + brightness, 50 + brightness, 150 + brightness); // Dim lavender/violet
    for (int i = 0; i < NUM_PIXELS; i++) {
        strip.setPixelColor(i, color);
    }
    strip.show();
    delay(50);
}

// Sunny: Warm orange light
void sunnyEffect() {
    static int brightness = 0;
    static int direction = 5;

    brightness += direction;
    if (brightness >= 255 || brightness <= 50) {
        direction = -direction;
    }

    uint32_t color = strip.Color(255, 140, 0); // Warm orange
    for (int i = 0; i < NUM_PIXELS; i++) {
        strip.setPixelColor(i, color);
    }
    strip.show();
    delay(50);
}
Click to Expand
x
Share this Project


About

Learning how to use events to network and share data across devices and publish.