Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetInterface MQTT mbed-dsp mbed-rtos mbed
Fork of KL25Z_FFT_Demo_tony by
main.cpp
- Committer:
- Condo2k4
- Date:
- 2016-01-11
- Revision:
- 5:4152530c0cf5
- Parent:
- 3:54760764be66
- Child:
- 6:78106c78e577
File content as of revision 5:4152530c0cf5:
// Audio Spectrum Display
// Copyright 2013 Tony DiCola (tony@tonydicola.com)
// Code ported from the guide at http://learn.adafruit.com/fft-fun-with-fourier-transforms?view=all
// mods by Tony Abbey to simplify code to drive tri-colour LED as a "colour organ"
#include "mbed.h"
#include "EthernetInterface.h"
#include "MQTTEthernet.h"
#include "MQTTClient.h"
#define IP_RETRIES 2
#define HOSTNAME "192.168.0.1"
//#define HOSTNAME "doughnut.kent.ac.uk"
#define PORT 1883
enum Mode {RESPONCIVE, OVERRIDE};
//timer
Ticker timer;
//buffers
char mqtt_buffer[100];
MQTT::Message message;
//topics
char personTopic[] = "shed/masterclass/iot/crossing/person";
char modeTopic[] = "shed/masterclass/iot/crossing/mode";
//io
AnalogIn sensor(A0);
DigitalOut GND(A2);
DigitalOut pelican(D0);
Ticker presenceTimer;
//state
bool personPresent = false;
volatile Mode mode = RESPONCIVE;
volatile bool checkPresence = false;
void presenceTick() {
checkPresence = true;
}
void timeout() {
if(mode==RESPONCIVE) pelican = false;
timer.detach();
}
void messageArrived(MQTT::MessageData& md) {
MQTT::Message &msg = md.message;
if(msg.payloadlen>0) {
switch(*(char*)msg.payload) {
case 'r': case 'R': mode = RESPONCIVE; if(!personPresent) timer.attach(&timeout,3.0f); break;
case 'o': case 'O': mode = OVERRIDE; pelican=true; break;
}
}
}
int main() {
MQTTEthernet ipstack;
MQTT::Client<MQTTEthernet, Countdown> m_client(ipstack);
int ip_result;
for(int i=0; i<IP_RETRIES; i++) {
int ip_result = ipstack.connect(HOSTNAME, PORT);
if(ip_result==0) break;
}
if (ip_result != 0) {
error("IP stack failed");
}
if(m_client.connect()!=MQTT::SUCCESS) {
error("MQTT connection failed");
}
if(m_client.subscribe(modeTopic, MQTT::QOS0, messageArrived)!=MQTT::SUCCESS) {
error("MQTT subscribe failed");
}
GND = 0; //provide sensor with ground
presenceTimer.attach_us(&presenceTick,50000);
while(1) {
sleep();
if(checkPresence) {
float s = sensor;
if((s<0.5f)!=personPresent) { //state changed
personPresent = !personPresent;
sprintf(mqtt_buffer, "{\"personPresent\":%d}", personPresent);
message.qos = MQTT::QOS0; // Send at least once
// Do not null terminate -- we have a length field, and it will piss off the JS front end
message.payloadlen = strlen(mqtt_buffer);
message.payload = (void*)mqtt_buffer;
m_client.publish(personTopic, message);
if(personPresent) {
timer.attach(&timeout,3.0f);
pelican = true;
}
}
checkPresence = false;
}
m_client.yield(100);
}
/*
*/
}

