Particle Photon IoT Labs: LEDs, Buttons, Interrupts and Cloud Projects
🔹 LAB 1a — LED blink
#define LED0 D7
void setup(){pinMode(LED0,OUTPUT);}
void loop(){digitalWrite(LED0,HIGH);delay(1000);digitalWrite(LED0,LOW);delay(1000);}
🔹 LAB 1b — LED0 + LED1 blink
#define LED0 D7
#define LED1 D0
void setup(){pinMode(LED0,OUTPUT);pinMode(LED1,OUTPUT);}
void loop(){digitalWrite(LED0,HIGH);digitalWrite(LED1,HIGH);delay(200);digitalWrite(LED0,LOW);digitalWrite(LED1,LOW);delay(200);}
🔹 LAB 1c — Button controls flashing (while pressed)
#define LED0 D7
#define LED1 D0
#define BTN1 A1
int flashEnabled=0;
void setup(){pinMode(LED0,OUTPUT);pinMode(LED1,OUTPUT);pinMode(BTN1,INPUT_PULLDOWN);}
void loop(){flashEnabled=digitalRead(BTN1);
if(flashEnabled==HIGH){digitalWrite(LED0,HIGH);digitalWrite(LED1,HIGH);delay(200);digitalWrite(LED0,LOW);digitalWrite(LED1,LOW);delay(200);}
else{digitalWrite(LED0,LOW);digitalWrite(LED1,LOW);}}
🔹 LAB 2a — Potentiometer controls LED brightness
#define POT A5
#define LED1 D0
int adcVal=0;
int pwmVal=0;
void setup(){pinMode(LED1,OUTPUT);}
void loop(){adcVal=analogRead(POT);
pwmVal=map(adcVal,0,4095,0,255);
analogWrite(LED1,pwmVal);}
🔹 LAB 2a — Pot controls LED + motor
#define POT A5
#define PWM_OUT D0
int adcVal=0;
int pwmVal=0;
void setup(){pinMode(PWM_OUT,OUTPUT);}
void loop(){adcVal=analogRead(POT);
pwmVal=map(adcVal,0,4095,0,255);
analogWrite(PWM_OUT,pwmVal);}
🔹 LAB 2b — Pot controls LED + buzzer
#define POT A5
#define LED1 D0
#define BUZZER A7
int adcVal=0;
int pwmVal=0;
int freqVal=0;
void setup(){pinMode(LED1,OUTPUT);}
void loop(){adcVal=analogRead(POT);
pwmVal=map(adcVal,0,4095,0,255);
freqVal=map(adcVal,0,4095,20,20000);
analogWrite(LED1,pwmVal);
tone(BUZZER,freqVal);}
🔹 LAB 2b — Pot controls LED + buzzer + servo
#include <Servo.h>
#define POT A5
#define LED1 D0
#define BUZZER A7
#define SERVO D2
Servo myServo;
int adcVal=0;
int pwmVal=0;
int freqVal=0;
int angleVal=0;
void setup(){pinMode(LED1,OUTPUT);
myServo.attach(SERVO);}
void loop(){adcVal=analogRead(POT);
pwmVal=map(adcVal,0,4095,0,255);
freqVal=map(adcVal,0,4095,20,20000);
angleVal=map(adcVal,0,4095,0,180);
analogWrite(LED1,pwmVal);
tone(BUZZER,freqVal);
myServo.write(angleVal);}
🔹 LAB 3a — Toggle flashing (polling edge detection)
#define LED0 D7
#define LED1 D0
#define BTN1 A1
int flashEnabled=0;
int btn1Status=0;
int btn1PrevStatus=0;
void setup(){pinMode(LED0,OUTPUT);pinMode(LED1,OUTPUT);pinMode(BTN1,INPUT_PULLDOWN);}
void loop(){btn1Status=digitalRead(BTN1);
if(btn1Status==HIGH && btn1PrevStatus==LOW){flashEnabled=!flashEnabled;}
btn1PrevStatus=btn1Status;
if(flashEnabled){digitalWrite(LED0,HIGH);digitalWrite(LED1,HIGH);delay(200);digitalWrite(LED0,LOW);digitalWrite(LED1,LOW);delay(200);}
else{digitalWrite(LED0,LOW);digitalWrite(LED1,LOW);}}
🔹 LAB 3b — Interrupt toggle
#define LED0 D7
#define LED1 D0
#define BTN1 A1
volatile int flashEnabled=0;
void toggleFlashEnabled(){flashEnabled=!flashEnabled;}
void setup(){pinMode(LED0,OUTPUT);pinMode(LED1,OUTPUT);pinMode(BTN1,INPUT_PULLDOWN);attachInterrupt(BTN1,toggleFlashEnabled,RISING);}
void loop(){if(flashEnabled){digitalWrite(LED0,HIGH);digitalWrite(LED1,HIGH);delay(200);digitalWrite(LED0,LOW);digitalWrite(LED1,LOW);delay(200);}
else{digitalWrite(LED0,LOW);digitalWrite(LED1,LOW);}}
🔹 LAB 3c — Timer interrupt flashing LEDs
#define LED0 D7
#define LED1 D0
#define BTN1 A1
volatile int flashEnabled=0;
void toggleFlashEnabled(){flashEnabled=!flashEnabled;}
void flashLEDs(){if(flashEnabled){digitalWrite(LED0,!digitalRead(LED0));digitalWrite(LED1,!digitalRead(LED1));}
else{digitalWrite(LED0,LOW);digitalWrite(LED1,LOW);}}
Timer timer(200,flashLEDs);
void setup(){pinMode(LED0,OUTPUT);pinMode(LED1,OUTPUT);pinMode(BTN1,INPUT_PULLDOWN);attachInterrupt(BTN1,toggleFlashEnabled,RISING);timer.start();}
void loop(){}
🔹 LAB 3c — Timer LED0 + PWM LED1
#define LED0 D7
#define LED1 D0
#define BTN1 A1
#define POT A5
volatile int flashEnabled=0;
int adcVal=0;
int pwmVal=0;
void toggleFlashEnabled(){flashEnabled=!flashEnabled;}
void flashLEDs(){if(flashEnabled){digitalWrite(LED0,!digitalRead(LED0));}
else{digitalWrite(LED0,LOW);}}
Timer timer(200,flashLEDs);
void setup(){pinMode(LED0,OUTPUT);pinMode(LED1,OUTPUT);pinMode(BTN1,INPUT_PULLDOWN);attachInterrupt(BTN1,toggleFlashEnabled,RISING);timer.start();}
void loop(){adcVal=analogRead(POT);
pwmVal=map(adcVal,0,4095,0,255);
analogWrite(LED1,pwmVal);}
🔹 LAB 4a — Cloud variable
#define LED0 D7
#define LED1 D0
#define BTN1 A1
#define POT A5
volatile int flashEnabled=0;
int adcVal=0;
int pwmVal=0;
void toggleFlashEnabled(){flashEnabled=!flashEnabled;}
void flashLEDs(){if(flashEnabled){digitalWrite(LED0,!digitalRead(LED0));}
else{digitalWrite(LED0,LOW);}}
Timer timer(200,flashLEDs);
void setup(){pinMode(LED0,OUTPUT);pinMode(LED1,OUTPUT);pinMode(BTN1,INPUT_PULLDOWN);Particle.variable("adcValue",adcVal);attachInterrupt(BTN1,toggleFlashEnabled,RISING);timer.start();}
void loop(){adcVal=analogRead(POT);
pwmVal=map(adcVal,0,4095,0,255);
analogWrite(LED1,pwmVal);}
🔹 LAB 4b — Cloud function
#define LED0 D7
#define LED1 D0
#define BTN1 A1
#define POT A5
volatile int flashEnabled=0;
int adcVal=0;
int pwmVal=0;
void toggleFlashEnabled(){flashEnabled=!flashEnabled;}
int cloudToggleFlash(String cmd){flashEnabled=!flashEnabled; return 0;}
void flashLEDs(){if(flashEnabled){digitalWrite(LED0,!digitalRead(LED0));}
else{digitalWrite(LED0,LOW);}}
Timer timer(200,flashLEDs);
void setup(){pinMode(LED0,OUTPUT);pinMode(LED1,OUTPUT);pinMode(BTN1,INPUT_PULLDOWN);Particle.variable("adcValue",adcVal);Particle.function("toggleFlash",cloudToggleFlash);attachInterrupt(BTN1,toggleFlashEnabled,RISING);timer.start();}
void loop(){adcVal=analogRead(POT);
pwmVal=map(adcVal,0,4095,0,255);
analogWrite(LED1,pwmVal);}
🔹 LAB 4c — Publish event
#define LED0 D7
#define LED1 D0
#define BTN1 A1
#define POT A5
volatile int flashEnabled=0;
volatile bool publishFlag=false;
int adcVal=0;
void toggleFlashEnabled(){flashEnabled=!flashEnabled; publishFlag=true;}
int cloudToggleFlash(String cmd){flashEnabled=!flashEnabled; return 0;}
void flashLEDs(){if(flashEnabled){digitalWrite(LED0,!digitalRead(LED0));
digitalWrite(LED1,!digitalRead(LED1));}
else{digitalWrite(LED0,LOW);
digitalWrite(LED1,LOW);}}
Timer timer(200,flashLEDs);
void setup(){pinMode(LED0,OUTPUT);pinMode(LED1,OUTPUT);pinMode(BTN1,INPUT_PULLDOWN);Particle.variable("adcValue",adcVal);Particle.function("toggleFlash",cloudToggleFlash);attachInterrupt(BTN1,toggleFlashEnabled,RISING);timer.start();}
void loop(){adcVal=analogRead(POT);
if(publishFlag){Particle.publish("btnPressed",String(adcVal),PRIVATE);publishFlag=false;}}
ThingSpeak and Node-RED Integration
1) ThingSpeak Photon code (INLINE)
#include "Particle.h"
#include "ThingSpeak.h"
TCPClient client;
unsigned long channelID=YOUR_CHANNEL_ID;
const char *writeAPIKey="YOUR_WRITE_API_KEY";
int sensorPin=A0;
void setup(){Serial.begin(9600);ThingSpeak.begin(client);}
void loop(){int rawValue=analogRead(sensorPin);
float voltage=(rawValue*3.3)/4095.0;
float temperatureC=(voltage-0.5)*100.0;
int response=ThingSpeak.writeField(channelID,1,temperatureC,writeAPIKey);
if(response==200){Serial.println("Data sent successfully!");}
else{Serial.println("Failed to send data.");}
delay(15000);}
2) Photon publish (Node-RED) (INLINE)
#include "Particle.h"
#include "math.h"
int sensorPin=A0;
float temperatureC=0.0;
void setup(){pinMode(sensorPin,INPUT);}
void loop(){int sensorValue=analogRead(sensorPin);
temperatureC=(sensorValue*3.3/4095.0-0.5)*100.0;
Particle.publish("temperatureEvent",String(temperatureC),PRIVATE);
delay(5000);}
3) LED control with Particle.function (INLINE)
int ledPin=D7;
bool blinkActive=false;
void blinkLED(){while(blinkActive){digitalWrite(ledPin,HIGH);delay(500);digitalWrite(ledPin,LOW);delay(500);}}
int controlBlink(String command){if(command=="START"){blinkActive=true;blinkLED();return 1;}
else if(command=="STOP"){blinkActive=false;return 0;}
return -1;}
void setup(){pinMode(ledPin,OUTPUT);Particle.function("controlBlink",controlBlink);}
void loop(){}
4) Node-RED function node (INLINE)
msg.payload = { field1: msg.payload.data };
return msg;
5) Node-RED HTTP request URL (INLINE)
https://api.particle.io/v1/devices/events?access_token=YOUR_ACCESS_TOKEN
6) Node-RED install + run commands (INLINE)
node --version && npm --version
npm install -g --unsafe-perm node-red
node-red
npm install node-red-dashboard
7) curl command (INLINE)
curl https://api.particle.io/v1/devices/<deviceId>/controlBlink -d access_token=<accessToken> -d "args=START"
Task 1 — Classroom Counter, Buzzer, Servo Lock and Remote Dashboard
#include "Servo.h"
#define BTN0 D2
#define BTN1 D3
#define BUZZER A7
#define SERVO D4
volatile int enterFlag=0;
volatile int exitFlag=0;
int peopleEntered=0;
int peopleLeft=0;
int peopleCount=0;
int roomCapacity=25;
Servo myServo;
void sensor0Handler(){enterFlag=1;}
void sensor1Handler(){exitFlag=1;}
void setup(){pinMode(BTN0,INPUT_PULLDOWN);
pinMode(BTN1,INPUT_PULLDOWN);
pinMode(BUZZER,OUTPUT);
myServo.attach(SERVO);
myServo.write(90);
attachInterrupt(BTN0,sensor0Handler,RISING);
attachInterrupt(BTN1,sensor1Handler,RISING);
Particle.variable("peopleCount",peopleCount);
Particle.variable("peopleEntered",peopleEntered);
Particle.variable("peopleLeft",peopleLeft);}
void loop(){if(enterFlag){enterFlag=0;
if(peopleCount<roomCapacity){peopleEntered++;peopleCount++;myServo.write(90);}
else{tone(BUZZER,1000);myServo.write(0);delay(500);noTone(BUZZER);}
Particle.publish("roomUpdate",String(peopleCount),PRIVATE);}
if(exitFlag){exitFlag=0;
if(peopleCount>0){peopleLeft++;peopleCount--;}
if(peopleCount<roomCapacity){myServo.write(90);}
Particle.publish("roomUpdate",String(peopleCount),PRIVATE);}}
Attendance with Pipedream / Google Sheet
#include "Particle.h"#define POT A5
#define BTN1 D3
volatile int sendFlag=0;
int studentID=0;
void btnHandler(){sendFlag=1;}
void setup(){pinMode(BTN1,INPUT_PULLDOWN);
attachInterrupt(BTN1,btnHandler,RISING);
Particle.variable("studentID",studentID);}
void loop(){if(sendFlag){sendFlag=0;
studentID=analogRead(POT);
Particle.publish("attendanceEvent",String::format("{\"studentID\":%d}",studentID),PRIVATE);}}
3) Potentiometer as Temperature Sensor
#define POT A5
float tempValue=0;
int adcVal=0;
void setup(){Particle.variable("tempValue",tempValue);}
void loop(){adcVal=analogRead(POT);
tempValue=map(adcVal,0,4095,150,450)/10.0;
Particle.publish("tempUpdate",String(tempValue),PRIVATE);
delay(5000);}
4) Remote LED Brightness, Blinking and Motor Speed
#define LED0 D7
#define LED1 D0
#define MOTOR D3
volatile int flashEnabled=0;
int ledVal=0;
int motorVal=0;
unsigned long prevTime=0;
int cloudToggleFlash(String cmd){flashEnabled=!flashEnabled;return 0;}
int cloudSetLED(String cmd){ledVal=cmd.toInt();
if(ledVal<0) ledVal=0;
if(ledVal>255) ledVal=255;
analogWrite(LED1,ledVal);return 0;}
int cloudSetMotor(String cmd){motorVal=cmd.toInt();
if(motorVal<0) motorVal=0;
if(motorVal>255) motorVal=255;
analogWrite(MOTOR,motorVal);return 0;}
void setup(){pinMode(LED0,OUTPUT);
pinMode(LED1,OUTPUT);
pinMode(MOTOR,OUTPUT);
Particle.function("toggleFlash",cloudToggleFlash);
Particle.function("setLED",cloudSetLED);
Particle.function("setMotor",cloudSetMotor);
Particle.variable("ledValue",ledVal);
Particle.variable("motorValue",motorVal);}
void loop(){if(flashEnabled && millis()-prevTime>=200){prevTime=millis();
digitalWrite(LED0,!digitalRead(LED0));}
if(!flashEnabled){digitalWrite(LED0,LOW);}}
5) Elevator Task
#define LED0 D7
#define LED1 D0
#define LED2 D1
#define LED3 D2
#define BUZZER A7
void setup(){pinMode(LED0,OUTPUT);
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
pinMode(BUZZER,OUTPUT);}
void beep(){tone(BUZZER,1000);delay(500);noTone(BUZZER);}
void blinkNext(pin_t LEDx){for(int i=0;i<5;i++){digitalWrite(LEDx,HIGH);delay(500);digitalWrite(LEDx,LOW);delay(500);}}
void loop(){digitalWrite(LED0,HIGH);digitalWrite(LED1,LOW);digitalWrite(LED2,LOW);digitalWrite(LED3,LOW);
beep();delay(2000);
blinkNext(LED1);
digitalWrite(LED0,LOW);digitalWrite(LED1,HIGH);
beep();delay(2000);
blinkNext(LED2);
digitalWrite(LED1,LOW);digitalWrite(LED2,HIGH);
beep();delay(2000);
blinkNext(LED3);
digitalWrite(LED2,LOW);digitalWrite(LED3,HIGH);
beep();delay(2000);}
8) One-Push-Button Light Intensity Controller
#define LED1 D0
#define BTN1 A1
#define SENSOR D2
int lightLevel=0;
int direction=1;
volatile int peopleCount=0;
void peopleHandler(){peopleCount++;}
void setup(){pinMode(LED1,OUTPUT);
pinMode(BTN1,INPUT_PULLDOWN);
pinMode(SENSOR,INPUT_PULLDOWN);
attachInterrupt(SENSOR,peopleHandler,RISING);}
void loop(){static int btn1PrevStatus=0;
int btn1Status=digitalRead(BTN1);
if(btn1Status==HIGH && btn1PrevStatus==LOW){lightLevel=lightLevel+direction;
if(lightLevel>=5){lightLevel=5;direction=-1;}
if(lightLevel<=1){lightLevel=1;direction=1;}
analogWrite(LED1,lightLevel*51);delay(200);}
btn1PrevStatus=btn1Status;
static unsigned long prevTime=0;
if(millis()-prevTime>=5000){prevTime=millis();
if(peopleCount<3 && lightLevel>1){lightLevel--;analogWrite(LED1,lightLevel*51);}
peopleCount=0;}}
6) Home Security System
#define BTN1 A1
#define LDR A4
#define BUZZER0 A7
#define BUZZER1 D2
#define BUZZER2 D3
int armed=0;
int intruderDetected=0;
int LDRval=0;
unsigned long prevTime=0;
int buzzerStep=0;
void setup(){pinMode(BTN1,INPUT_PULLDOWN);
pinMode(BUZZER0,OUTPUT);
pinMode(BUZZER1,OUTPUT);
pinMode(BUZZER2,OUTPUT);}
void loop(){static int btn1PrevStatus=0;
int btn1Status=digitalRead(BTN1);
if(btn1Status==HIGH && btn1PrevStatus==LOW){armed=!armed;
if(!armed){intruderDetected=0;
digitalWrite(BUZZER0,LOW);digitalWrite(BUZZER1,LOW);digitalWrite(BUZZER2,LOW);}
delay(200);}
btn1PrevStatus=btn1Status;
LDRval=analogRead(LDR);
if(armed && LDRval<2000){intruderDetected=1;}
if(intruderDetected && millis()-prevTime>=300){prevTime=millis();
digitalWrite(BUZZER0,LOW);digitalWrite(BUZZER1,LOW);digitalWrite(BUZZER2,LOW);
if(buzzerStep==0) digitalWrite(BUZZER0,HIGH);
if(buzzerStep==1) digitalWrite(BUZZER1,HIGH);
if(buzzerStep==2) digitalWrite(BUZZER2,HIGH);
buzzerStep=(buzzerStep+1)%3;}
if(armed && LDRval>=2000){intruderDetected=0;
digitalWrite(BUZZER0,LOW);digitalWrite(BUZZER1,LOW);digitalWrite(BUZZER2,LOW);}}
7) Adaptive Traffic Light
#define RED D0
#define YELLOW D1
#define GREEN D2
#define PEDRED D3
#define PEDGREEN D4
#define BTN1 A1
#define POT A5
int adcVal=0;
int pedRequest=0;
int pedServed=0;
void setup(){pinMode(RED,OUTPUT);
pinMode(YELLOW,OUTPUT);
pinMode(GREEN,OUTPUT);
pinMode(PEDRED,OUTPUT);
pinMode(PEDGREEN,OUTPUT);
pinMode(BTN1,INPUT_PULLDOWN);}
void loop(){pedServed=0;
adcVal=analogRead(POT);
int greenTime=map(adcVal,0,4095,4000,10000);
int redTime=map(adcVal,0,4095,10000,4000);
digitalWrite(PEDRED,HIGH);digitalWrite(PEDGREEN,LOW);
digitalWrite(RED,LOW);digitalWrite(YELLOW,LOW);
digitalWrite(GREEN,HIGH);
unsigned long startTime=millis();
while(millis()-startTime<greenTime){if(digitalRead(BTN1)==HIGH && !pedServed){pedRequest=1;pedServed=1;}}
digitalWrite(GREEN,LOW);
digitalWrite(YELLOW,HIGH);
delay(2000);
digitalWrite(YELLOW,LOW);
digitalWrite(RED,HIGH);
if(pedRequest){digitalWrite(PEDRED,LOW);
digitalWrite(PEDGREEN,HIGH);
delay(5000);
digitalWrite(PEDGREEN,LOW);
digitalWrite(PEDRED,HIGH);
pedRequest=0;}
delay(redTime);}