Created
March 30, 2022 07:21
-
-
Save gingemonster/c26cc07c30614d414e84294cc6d4dd89 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This #include statement was automatically added by the Particle IDE. | |
#include <MQTT.h> | |
MQTT client("XXX.XXX.XXX.XXX", 1883, callback); | |
Servo myservo; // create servo object to control a servo | |
// a maximum of eight servo objects can be created | |
int pos = 0; // variable to store the servo position | |
int count = 0; | |
char previousmoves[10] = {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0'};; | |
void setup() | |
{ | |
Serial.begin(9600); | |
Serial.println("setting up"); | |
Particle.function("moveclock", moveclock); | |
Particle.function("playlast", playbackPreviousTenMoves); | |
Serial.println("connecting mqqt client"); | |
connectmqqtclient(); | |
} | |
void connectmqqtclient(){ | |
if(!client.isConnected() ) { | |
client.connect("weaslyclock", "username", "password"); | |
if( client.isConnected() ) { | |
Serial.println( "Connected." ); | |
client.subscribe("topicname"); | |
} | |
} | |
} | |
void loop() { | |
if( client.isConnected() ) { | |
client.loop(); | |
} | |
else{ | |
// reconnect | |
connectmqqtclient(); | |
} | |
} | |
int moveclock(String command){ | |
myservo.attach(D0); // attaches the servo on the D0 pin to the servo object | |
addMoveToPreviousMoves(command.charAt(0)); | |
moveServo(command); | |
return 0; | |
} | |
void moveServo(String command){ | |
moveServo(command, true); | |
} | |
void moveServo(String command, bool pauses){ | |
Serial.println("moving servo with command - " + command); | |
if(command == "1") // home | |
{ | |
myservo.write(45); | |
} | |
else if(command == "2") // work | |
{ | |
myservo.write(15); | |
} | |
else if(command == "3") // london | |
{ | |
myservo.write(9); | |
} | |
else if(command == "4") // travelling | |
{ | |
myservo.write(29); | |
} | |
else if(command == "5") // meeting | |
{ | |
myservo.write(74); | |
} | |
else if(command == "6") // church | |
{ | |
myservo.write(88); | |
} | |
else if(command == "7") // tweeting | |
{ | |
myservo.write(56); | |
if(pauses){ | |
delay(5000); | |
myservo.detach(); // to stop servo straining | |
delay(60000); // wait 1 minute | |
} | |
myservo.attach(D0); | |
moveServo(findPreviousMoveNotMeetingOrTweeting()); // go back to previous location | |
} | |
if(pauses){ | |
delay(5000); | |
myservo.detach(); // to stop servo straining | |
} | |
} | |
String findPreviousMoveNotMeetingOrTweeting(){ | |
for(int i=1;i<10;i++){ // start a 1 as zero contains current move | |
if(String(previousmoves[i]) != "5" && String(previousmoves[i]) != "7" ){ | |
return String(previousmoves[i]); | |
} | |
} | |
return "1"; // its possible all 10 previous moves are meetings or tweeting so got to return something! | |
} | |
void addMoveToPreviousMoves(char move){ | |
// move items in previous moves along one and insert latest move at position zero | |
Serial.println("adding move to previous moves - " + String(move)); | |
char tmpArray[10]; | |
tmpArray[0] = move; | |
for(int i=0;i<9;i++){ | |
tmpArray[i+1] = previousmoves[i]; | |
} | |
memcpy(previousmoves, tmpArray, 10); | |
} | |
int playbackPreviousTenMoves(String command){ | |
Particle.publish("playback last ten start"); | |
for(int i=1;i<10;i++){ | |
Particle.publish(String(i) + " move is " + String(previousmoves[i])); | |
if(previousmoves[i] != '0'){ | |
myservo.attach(D0); | |
moveServo(String(previousmoves[i])); | |
delay(500); | |
myservo.detach(); // to stop servo straining | |
} | |
else{ | |
break; | |
} | |
} | |
return 0; | |
} | |
void callback(char* topic, byte* payload, unsigned int length) { | |
Serial.println("mqqtcallback"); | |
char p[length + 1]; | |
memcpy(p, payload, length); | |
p[length] = NULL; | |
Particle.publish("mqqtcallback: " + String(p)); | |
if(String(p) == "playback"){ | |
playbackPreviousTenMoves(p); | |
} | |
else{ | |
moveclock(p); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment