Talking MQTT

Ha! Today has been a good day. I’ve got my Air Quality sensor talking MQTT to the Connected Humber server and sending messages. This has been a bit of an adventure, mainly because I had to mess around with the libraries for the Heltec device that I’m using.

Anyhoo, I’m now sending messages over both LoRa and MQTT at the same time. Go me. Now I just need to add some configuration options and I think we might actually have a product here.

Incidentally, I’m using a Windows app called MQTTBox to view the messages on the server and post test messages to my sensor. Works rather nicely. And free.

Pointers to Functions in C# and Python

After the description of pointers to functions in C it occurred to me that you might like to know how to do function pointers in other languages. Then again you might not, in which case just look at the picture above that I took in Singapore a while back.

Pointers to methods in C#

If you want to make a reference to a function in C# you need to create a delegate type which contains the reference. Instances of the delegate type can then be made to refer to methods. It’s a bit more long-winded than the C way of doing things, but delegates can also be used as the basis of some quite powerful publish and subscribe mechanisms which I might mention later.

class Program
{
delegate void SimpleDelegate();
static void aMethod()
{
Console.WriteLine("Hello from a method");
}
static void Main(string[] args)
{
SimpleDelegate myDelegateInstance = aMethod;
myDelegateInstance();
}
}

This is a tiny example of a program that uses a delegate to make a reference to a method. The delegate type that I’ve created is called SimpleDelegate. Variables of this type (I made one called myDelegateInstance) can be made to refer to a a method and then called.

If you compare this with the C syntax, it’s not that different. The good news is that before the program runs the compiler can make sure a program will never call a method incorrectly using a delegate. Because SimpleDelegate is declared as returning void (i.e. nothing) and accepting no parameters it is impossible to make instances of SimpleDelegate refer to a method that returns a different type or has a different set of parameters. If you worry about these kind of things, this is a good thing.

Pointers to Functions in Python

If you want to make a pointer to a function in Python you just do it:

def a_function():
print("Hello from a function")

function_ref = a_function
function_ref()

The variable function_ref is made to refer to the function a_function and the function_ref variable can then be called as a function. Later in the program function_ref might store an integer, or string, or a reference to an object of type Cheese. That’s how Python is. This means that a Python program can fail in ways that a C# program won’t, because the errors that cause the Python program to fail would be picked up by the C# compiler.

This nicely encapsulates the difference between the cultures of C# and Python. C# is great because it forces you to invest effort to make sure that the objects in your programs can only ever be fitted together correctly. Python takes everything on trust. It lets the programmer just get on with expressing the actions to be performed and assumes that things will turn out OK. If they don’t the program will fail at runtime.

I love the way that C# forces me to think about my code, and I love the way that Python just lets me get on with writing, without me having to worry about adding lots of extra syntax to express what I know I want. You should know about both ways of working.

Crazy Rich Asians

Now, don’t spread this around, but I quite like a good Romantic Comedy every now and then. If you all you go to is superhero films you get a bit tired of great slabs of exposition about “Shifting into the Quantum Space and causing the end of the universe” in between huge, choreographed fight sequences. And occasionally it’s nice to see a film in which the none of the laws of physics are broken.

Crazy Rich Asians is about a bunch of people, most of whom are crazy rich. It has all the required rom-com ingredients and it mixes them together really well. For me the biggest star is Singapore, which looks awesome. I was lucky enough to go there a few years back and now I want to go all over again.

If you like a good comedy which is well played and (not really a plot spoiler) a nicely realised happy ending then it is well worth the trip. The exuberance of the cast and the flair of the production are really uplifting. Great fun.

Pointers to Functions in C

I’m re-writing my neopixel animation software for the new light. I’m using a C feature that is sometimes very useful. I’m using pointers to functions.

Note that this is quite strong magic. If you don’t use it properly your program will just stop with no errors or warnings. But then again, that’s pretty much how it is when you write Arduino code anyway, so feel free to have a go. You won’t break any hardware.

The reason why I’m using function pointers is that I want to make the program to select between different animations to control the lights. The update behaviour for each animation is a different function. For example, I’ve got two different displays, one which walks colours around the lights and one which just displays the text in a particular colour. That means I’ve got two update functions:

void update_coloured_message()
{
// update the coloured message
}

void update_text_message()
{
// update the text message
}

Each of these is a function that accepts no parameters and does not return a result. I can create a C variable that can refer to these methods as follows

void (*animation_update) ();

This rather convoluted syntax creates a variable called animation_update that can refer to methods that accept no parameters and don’t return a value. I can make this variable refer to one of my update methods by using a simple assignment:

animation_update = update_text_message;

Note that normally when you want to create a reference to a value in C or C++ you need to put an ampersand (&) in front of the thing you are getting a pointer to. In the case of function references you can leave this out. This is either a neat trick to make C programming easier or a nasty trick to make C programming more confusing. I’ll let you decide.

Anyhoo, once I’ve set animation_update to refer to a function I can call the pointer just as I would the function:

animation_update();

I’ve actually gone one more, in that I’m using function pointers in a structure. Go me. I’ve got a structure that describes an animation in terms of the function that sets up the animation, the function that updates the animation and the number of frames it should run for:

struct Animation_item
{
void(*animation_setup) ();
void(*animation_update)();
int duration;
};

I then create an array of these items that contain all the animations that I want to move between:

struct Animation_item animations[] = {
{ setup_coloured_message, update_coloured_message, 600 },
{setup_walking_colours, update_walking_colours, 600} };

Then just need to count around the array to move between animations.

animations[animation_number].animation_update();

This statement calls the animation update method for the animation that is selected by the value in animation_number. If I add more animations to the array my program just picks them up automatically with no need to change anything else.

"Do It For Josh" Light

Joshua (Josh) Barnfather is a lovely chap who needs your money. Really. You can find out here why he needs the cash. And also give him some. Please.

Josh is a member of c4di and I’ve been really moved by the way that the community has rallied round to help under the tag line “Do it for Josh”. We’ve had Nibble, the local eating place, pitching in with a “Josh” sandwich (which is delicious - I had one on Thursday) and lots of members coming up with neat ways to bring in the cash. Since I can’t make sandwiches as good as the ones that Nibble turn out, I’ve decided to make something electronic.

Behold, the “Do it for Josh” lamp. This prototype will be going in the c4di lobby later this week, but I’d be happy to make one for you. You can even tell me what words you want to put in the 4x4 matrix. A light will cost you fifty pounds with at least forty of that going to Josh. The lamp will be WiFi connected so that you can control the animations from your phone and tell it when to turn on and off. And I’m going to get the Connected Humber bods onto adding even more interesting features.

If you fancy one, just send me an email (rob@robmiles.com). If you want to just want to help, send some money through via the donation page.

Back in the Zone

New board in action

My Twilight Zone pinball machine is the nearest thing that I’ve got to a family heirloom. Rather sadly, it’s been poorly sick recently, owing to some leaky batteries. These are rather stupidly mounted over the main processor board and covered some important chips with corrosive liquid. Although I managed to get the board back to life by cleaning it up a while back, a few weeks ago the input connected to the game start button failed, which made it rather hard to get a game.

Fortunately, even though (or perhaps because) the machine was made in the mid nineties you can still get replacement circuit boards. These are re-manufactured using the same components as the original and, once I’d got one, my machine sprang back into life.

Hull Pixelbot at the Digital Awards

Hull Pixelbot finalist in two categories. Yay!

Hmm. Three blog posts in one day. What an interesting life I lead….

Anyhoo, today it was time to put on my best smart casual wear and head for the Bonus Arena for the finals of the Digital Awards. This was all rather exciting. Firstly because the Hull Pixelbot is a finalist in two of the competition strands, secondly because I really fancied having a look around the new Bonus Arena, which is where the event is being held.

Well, the arena is is splendid. After an lovely meal, accompanied by a saxophonist with a fantastic illuminated saxophone, we went through to the arena for the awards themselves. We had a few speeches at the start which were all shot through with a theme that this is a great place to do digital business. One speaker made the point that they were feeling a bit sad about being in the bottom 48% of Lightstream users in Hull for network performance. He was cheered up a lot when he found that this still meant he was in the top 2% of network users in the country.

And another fun fact stood out for me: A third of the optical fibre in the UK is under the streets of Hull. The government has set what it calls an ambitious project to get all households in the UK connected to fibre by twenty thirty something. KCOM (the telecoms company that provides home networking in Hull) will achieve this in Hull by the end of March next year. Other cities in the UK are now playing catch up with us. Big time. And, we don’t just have networks. We have talent too. As the awards were about to show.

Mark Dolan was a great compere

I’d not seen that much of Mark Dolan before to be honest. But by gum he’s good. After a brief (and very amusing) comic set to break the ice he got things going and presided over the proceedings with some wry observations and knowledgeable comments. The finalist in each award category was introduced by a short video of them in action. Which for me meant two sessions of squirming in my seat as I watched pictures of me and my stuff on the enormous screen. Although I loved the moment when the audience went “Ah…” when they saw a bunch of Hull Pixelbots doing one of their little dances.

I didn’t win. I didn’t expect to, to be honest. I’d taken a look at the field and come to the conclusion that there were much better entries in my categories than mine. But I was mightily honoured to have been picked to get into the finals. And I did get two lovely certificates in really nice frames. One for the office at c4di , one for home. And If you check the awards lineup you’ll see that the Hull Pixelbot was actually first in each category. Alphabetically…

It’s a measure of the confidence that I’m seeing in the area that it can put on what I consider to be a world standard awards ceremony. I’ve been to a few of these over the years and the whole setup, the organisation, the venue and the presentation really was world class. And, and this is the really wonderful bit, so were all the finalists. The winners were real stand-outs.

I was especially pleased to see Hayden Barton win “Young Digital Person of the Year”. I first met Hayden at a Hardware Meetup at c4di when he showed me a neat little device he’d brought along. “That’s nice” I said. “Where did you buy it?”. His reply marked him for greatness in my book. He said “I made it.”.

After the awards we staggered home tired and happy. Thanks to every one who put the event together. Great fun and great for the region.

Build another LoRa Node in a Day

Everyone looking happy at the start

In July we held a “Build a LoRa node” workshop at c4di. It was great fun for us, and those who took part. Today we did it again. I turned up, fresh from my media appearance and helped Robin set things up. As before, the aim was to get attendees to build a working LoRa node and finish up with a device sending environmental data to the cloud.

Everybody succeeded. It was great to watch them all convert a “bag of bits” into a working sensor node and then watch as they saw their readings appearing in their browsers.

We run the events when we get eight or nine people together who want to have a go. They are hosted in the lovely environment of the c4di and we only charge you for the parts that you take away. If you want to come along to our next one, just send me an email or a direct message on twitter and I’ll add you to the list.

Rob on Radio Humberside

The light first thing this morning was rather good

This morning I was up bright and early (oh, OK, just early) and heading into town to review the papers for the Radio Humberside breakfast program. I love doing radio. Apparently I have the perfect face for it. Anyhoo, I settled down with a pile of newsprint and started looking for some vaguely happy stories. There’s so much depressing stuff in the news at the moment that I figured folks would rather hear something a bit uplifting with their cereal.

It turns out that this was surprisingly hard to do. Papers seem to have got a lot more miserable over the years. However, I found a few things to talk about, wandered into the studio and did my bit, which was great fun.

Now, onto building some LoRa nodes….

Test Air Quality with the EMF Badge

The air here seems ok

One of the (many) wonderful things about the electromagnetic fields event I went to was the badge that everyone was given. This was an embedded device with a nice colour screen and a powerful processor that just happened to be a mobile phone as well…… I thought I’d turn it into an air quality display. So I 3D printed a case and make some modifications so that I could fit an air quality sensor and a battery to power it on the back of the badge. This is the back of the badge:

The hardware construction went fine, and I had the badge and the sensor exchanging messages quite nicely. Then I tried to write the software and it all went wrong. So I gave up and decided to enjoy the event instead….

However, I’m not a quitter. So, after a lot of fun and games, I’ve finally submitted my air quality app to the badge store for the emf badge. You can find it in amongst the other apps in the store here. It seems to work a treat and I can wear it around my neck with pride. Although I guess this would probably look a bit silly around Hull, where a lot fewer people seem to be wearing emf badges than there were at the event.

Anyhoo, one significant (at least for me) takeway is that if you want to use the serial port in MicroPython in binary mode (i.e. not have the driver mess around with carriage return and linefeed characters), you can use a special option to request this:

sensor_port = UART(2,9600, bits=8, mode=UART.BINARY, parity=None, stop=1)

This option is, of course, undocumented on the MicroPython pages for the UART class, leading to endless hours of “fun” for developers (like me) who spend ages wondering why their binary checksum values are all wrong…..

Rob at Ron Dearing UTC

Despite arriving a tiny bit late, I had a great time at the evening event at Ron Dearing UTC today. A whole bunch of folks came to see me to talk about technology and I showed off some Hull Pixelbots, my silly goggles and the prototype air quality sensor that we’re working on over at Connected Humber.

Of course, I totally forgot to take any pictures at the event. Silly me. That’s why there’s a rather splendid picture of Whitby pier at the top of this post instead of anything relevant to the night.

Anyhoo, I talked to a bunch of folks and gave out a bunch of advice. Summarised thusly (posh prose)

  • If you’re into computing, start playing with the Arduino device. It’s cheap to get started (much less than a video game) and extremely creative. Buy a Sintron Arduino kit (search ebay or Amazon for “Sintron Arduino” to see a selection of kits. The one that is around thirty pounds is good value. If you want to start cheaper, come along to a Connected Humber event (we have them on the first and third Thursday of the month at c4di starting at 6:00pm in the evening). We’ll sell you an Arduino and some hardware for five pounds and give you some things to do with it. You can find out more here.

  • Start learning about 3D design. Lots of people that I spoke to were already doing this. The ability to think in 3D will stand you in good stead whether you go into fields ranging from video games to product design. There are lots of free packages you can use, I quite like FreeCad, although it can be a brute to get to grips with. If you’re a programming type, take a look at OpenScad. If you want to use a free, professional level, tool take a look at Blender. It will really make your head hurt, but you can do awesome things with it. Take a look online for howto videos for these tools. If you don’t like the ones that you find, make some better ones of your own.

  • Which brings me to my third point. Lean to write and talk. When you start doing something, start writing about it too. Put your writings into a blog, a personal diary or a log. I don’t mind. The important thing is that you do this. I made the point lots of times that you can learn a good living, and have fun, as a programmer. But if you also have the ability to write well and are good at communicating your ideas this makes you much more useful and interesting to employers, getting you even more interesting and rewarding things to do. So you should work at getting those skills. Deliberately do things that take you out of your comfort zone. Practice talking to people (networking is a big part of success) and try to force yourself to speak in public. Trust me. It really pays off.

By the end of the evening my voice had just about worn out, as had the batteries in the robots. But it was great fun. And then I went home and had bananas and custard for supper. Such fun.

To the Moon!

Today we went to see the moon in Hull Minster. Awesome. It hangs from a large steel structure that they’ve set up . I don’t really want to know how it fits together inside or how they printed it. I just want to marvel at it.

We actually saw the moon for the first time last week, when I took along my expensive cameras and fancy lenses to try and get a nice picture. Today I just had my smartphone with me and I ended up with what I consider better pictures - which is an interesting comment on the state of photography.

Using a Line-us plotter with Hershey Fonts

Some time back I got a Line-us plotter. It's actually rather neat.  It comes with a super little program that lets you draw designs on your computer and then print them out in an attractive, if rather wobbly, way.

It is very easy to control the plotter from Python over the network, and I wanted to use it to draw some text. I was wondering how to do this when I remembered the Hershey fonts. These go back a very, very, long time. They were pretty much the only vector character designs available for plotting text for many years. They are based on simple graphic designs and, fortunately for me, someone has written some Python to work with them. 

I've made some modifications to their program so that it now drives the Line-us plotter and I'm rather pleased with how well it works. You can find the code on GitHub

Humber Care Tech Challenge Day 2

The winners being surprised by fireworks…

The second day of the competition was at least as much fun as the first. We actually got to spend some time getting some code to work. By the end we had some sensors sort of working and Amazon Echo behaviours that responded to commands for our application. And we also had a good plan for developing and deploying the application. We still didn’t win though. Mainly because the winning solution (and, to be honest, quite a few of the other 12 entrants) was quite a lot better than ours.

The winner, which started with the idea of giving everyone in a care home their own Amazon Alexa device, moved on to develop this in lots of interesting ways, and ended up with a fully working demonstration application, was just wonderful. It was chosen as the best by both the judges and the “People’s Choice Award” which was marked by all the teams present.

Thanks so much to the councils and healthcare organisations that put the event together. It was a wonderful occasion and I hope that it will be repeated some time in the future. I also really look forward to seeing some of the ideas that were presented going forward to do good.

One of the most impressive things to me about the whole competition has been the commitment of everyone involved to get the ideas into action. I’m really looking forward to seeing this happen.

Humber Care Tech Challenge Day 1

Getting started

From one fun event to another. Now it’s time for a bit of hacking. The Humber Care Tech Challenge started bright and early today. I’ve been involved with some of the organisation of the event. It’s one thing to sit in a meeting making plans and trying to think all the things that could go wrong so you can fix them in advance. It’s another thing to walk into Bridlington Spa Hall and see lots of teams set out and getting started on their solutions.

The level of enthusiasm and commitment at this event is astonishing. From the organisation group, who are trying to do something different to move things forwards to the healthcare professionals who have engaged with teams in a really positive way, to the teams themselves, who were quietly getting down to the business of making something awesome.

I was there with Robin and Keith thing to come up with something. Keith had done his homework, and had arrived with a fully formed solution that he wanted to run past the Subject Matter Experts at the event. Robin and I did a bit of planning and then came up with an exercise aid that tried to recreate the atmosphere of “A Good Walk” for people who have difficultly leaving home. We played with some ideas and sensors and the Amazon Echo that we’d been assigned and, by judging time we had an idea that we thought stood up rather well.

We didn’t win a prize. But I’m looking forward to finding out who wins tomorrow when the solutions are demonstrated.

Heading Home

We were up bright and early and on the road home by 8:00. The whole event was fantastic from start to finish. They say the next one will be in 2020. I’ll be there.

There is also talk of “electromagnetic pulse” events being organised in the gap between the “fields” events. It would be great to set up one of these in the Hull area.

Anyway, time to head for home and then to get the Air Quality sensor working with the badge…..

Day 3 of Electromagnetic Fields

Achievement Unlocked: Shower Ninja Level now at Master. Take a large waterproof bag for clean clothes and dry towel on the way in and dirty clothes and damp towel on the way out. Leave boots outside the shower cubicle, facing outwards so I can just step into them on the way out. I'm really getting the hang of this camping lark. Of course, it’s not rained at any point…..

Having settled into something of a routine the realisation is dawning that this won't go on forever and today is in fact the last day. Wah. I resolve to go to lots of sessions and get the badge air quality sensor working. 

After a great session on LoRa networking, and another on the scary way that you can hack into car keys, I went to some that were all about how the event itself. First up was a session on the making of the emf badge. It turns out that making a complete mobile phone device is actually quite tricky. Kudos that they actually managed to make it work. The next session was about power, amongst other things.

This is the power distribution to the tents in our area of the camp. There were a bunch of “Tardis” booths that contained nothing but distribution boards and, I suppose, a whole bunch of fuses and whatnot. These were connected to a backbone that was powered by a bunch of great big generators spread over the camp.

After the talks and another abortive attempt to get my badge to work with the Air Quality sensor, we went for a wander into the “Null Sector”. This was a seemingly haphazard collection of shipping containers that held, well, interesting stuff. The best time to see it is at night - of which more later - but there were quite a few things to take a look at, including a container from MSRaynsford that contained a kind of steam punk workshop with a laser cutter and some lovely things for sale. I ended up with a useless box (which I’ve always wanted) and a wifi controlled StrandBeest. Of which more later.

After some more coding we headed for the closing ceremony. Rather sad. There was enough content for several weeks I reckon, I wish there had been more of me to go to all the things that I know I missed out on.

The good news was that we still had the evening to enjoy, including some electric car racing that was great fun to watch. I was also able to practice my panning technique as the cars whizzed past.

I have no idea why there is a Christmas tree on the back…

As the night came down we ventured back into “Null Sector”. They had buttons you could press to send out great big gas flares, art installations, an RFID powered treasure hunt and a powerful laser light show. I did the best with my little camera, but the shots don’t really do the setup justice.

Lasers and gas flares

Mostly lasers

Then it was time for bed for the last night under canvas.