Transcript
This transcript was autogenerated. To make changes, submit a PR.
What if you could work with some of the world's most innovative companies,
all from the comfort of a remote workplace?
Andela has matched thousands of technologists across the globe
to their next career adventure. We're empowering new talent
worldwide, from sao paulo to Egypt and Lagos
to Warsaw. Now the future of work is
yours to create. Anytime, anywhere. The world
is at your fingertips. This is andela.
Hello everybody, and become to my talk today.
I'm super excited to be here. I'm really, really excited
to show you what I've been working on over the past couple of months.
So without further ado, let's jump into it.
Today my talk is called go to the Edge.
And I'm going to be talking about Tinygo, essentially a version
of Golang, but for IoT quick
agenda. So I'm going to tell you a little bit about me, who I am,
where I've come from, and what I do today, where I found
Tinygo, what I do with Tinygo, and the projects
that I create in Tinygo, with a little bit of a hands on to show
you how I do that as well.
So who am I? What do I do? So, my name is Liam Hampton and
I'm a Microsoft regional cloud advocate here in the UK, based at
the London reactor. I'm an open youre contributor
and through that I have been a software engineer. Prior to this role
as an advocate, I was working at IBM and I wrote a
lot of golang, a lot of node, and I was technical blogging.
I'm also an IoT enthusiast, hence why I'm doing this talk
today. And I'm a public speaker. I have spoken at a number of conferences and
meetups around the globe over the past couple of years.
So how did I find Tinygo?
Now that's a really interesting question, because I actually knew nothing
about Iot about a year ago. That's a bit crazy if
you think about it, somebody in tech not really knowing anything about IoT.
All I thought it was was just smart tech and little sort of event
driven boards, essentially. But I
actually wanted to get into home and smart tech.
Now, I didn't know how to do it. I'd never written c language, I've never
written micropython. I just wanted to learn.
So the best way to do that was I went and bought a whole bunch
of these boards. I went and bought a number of arduinos.
Pretty expensive for someone who knew nothing about
them, whether I was even getting the right things, but I went and bought them
nonetheless. And that kind of forced my hand into learning now,
I didn't want to learn a new language, so I ended up like
every other developer would, went onto Google and said, how do I put go on
an Arduino? And lo and behold, I found something called Tinygo,
which is essentially a subversion of go being
a go developer. I was pretty familiar with this and I was kind of like,
hallelujah, I have saved it. I am now able to do what I've wanted to
do. So what is Tinygo now?
Tinygo, if you go to the website, it is a go compiler for small places,
and you're going to see this scattered everywhere. Whether it's on the GitHub repository,
whether it's on the website, whether it's in people's blogs,
it is a compiler for small places, it's still a go compiler.
So like I said, if you go to the website, you'll be faced with something
that looks a little bit like this, where you'll see the sort
of landing page and you can see the boards, the documentation for it.
You can even go to the GitHub because IoT is open youre like most
things now, which is fantastic. And there's even quick getting
started guides as well. So what
is it? It is essentially what this slide
shows you. You have a smaller compiler which comprises,
sorry, excuse me is a smaller compiler which comprises of a number
of libraries from the main language itself. So for
example, you have got IoT, you have got the bytes package, you have
got archive and zip, but you don't have things like HTML and template
or the net package because you're not likely to use them with a microcontroller or
webassembly or anything else that you're likely to build with Tinygo.
So it is very compact, it is
very quick, and it kind of just takes what you
need from the main language. It uses
the LLVM technologies. So what LLVM is,
is a strategy to support static and dynamic compilation for languages.
It is essentially a toolchain of technologies,
modular and reusable. It's open youre and it
kind of works a little bit like the diagram. So this is very overhead and
very simplistic, but kind of get the gist of it.
Language you type goes through LLVM, which then
allows you to run it on an architecture x 86
arm power pc, et cetera. If you
want to read more about this, and I really sincerely hope you do really
interesting read, you can go to the website llvm.org.
So what is Tinygo used for itself? Where do you
most commonly see it used, well, microcontrollers is
the main use at the moment. It is anyway. And a microcontroller
is something that looks a little bit like these. It's a board.
It's like an input output board. So an arduino or
an microbit or an artifruit playground or an
x nine smartwatch, for example, something that you can code,
something which will take in, you can manipulate with it,
you can write a lot of programs for, is essentially a small board. And this
is where tiny go really excels. Being a
really small compiler, it is able to fit and execute or
run code on these small chipsets.
And with that being said, it supports over 70 boards now.
And this is what I love about this technology or this project,
should we say. It has got a fantastic community and with that
you get fantastic support. So every single release something new is
happening and the boards are growing. I think I started looking into this maybe about
a year ago and maybe we were up to like 50 boards. We're now way
above that, up to 70 plus boards, which is fantastic.
The second use case is webassembly.
Now, webassembly is essentially this diagram here
where you can write your program in the code that you like, I.
E. In this instance we're going to say Tinygo. You can pass it through a
webassembly compiler, which will then change that
and sort of manipulate the code to be interpreted by a web browser.
And a web browser will interpret code as like HTML, Javascript,
CSS, your standard sort of interpretations for web.
However, wasm allows you to do that with different code.
So let's take a dashboard. If I want to build a dashboard or something,
I could write that in tinygo and it could then be interpreted
by the web browser with a Wasm compiler.
Thirdly, and finally,
you may see people write small lightweight clis with
tiny go. It's not so common now, but it definitely was about
a year ago when I was looking into this. And a Cli is a command
line interface, and it just allows you to have maybe
lower level control at a system level if youre want to be sort of
interacting with your host machine, for example.
So where do I use tinygo? And this was kind of looping back
to the beginning. Why did I buy all those Arduinos now? I had
a number of problems in my home that I wanted to solve. One of them
most, well, one of the bigger ones being dead plants.
Now, I went away for a month with a
trip and I came back and my plant looked a little bit like this.
Wilted, dead, looking under the weather.
Pretty far gone, really. And I always forgot to water them.
So I wanted something which would tell me when I needed
to water my plants. Therefore, I made a soil moisture
sensor. So the sensor goes in the plant pot, takes a
reading, sends it to the arduino, who then calculates it
and sends it back to me for human readable output. And in this
example, it is saying soil moisture is 71%.
Fantastic. And for this plant, I think it needed to be around 50%
or above. 50 is the ideal, which.
So this is good. So the plant ended up looking, or still does
look like this, nice and fresh. And it's behind me now. You can
still see it poking behind my head.
So that's just one example of where I use tiny go,
really simple project, really small, but it allows me to get my foot in the
door and build bigger and better things. The next
step for this is to have it water itself. So, like I said, I want
to build a dashboard. I would like to have a sort of a self watering
pump. So if I was away, then I could log in and I could press
a button, and it would be able to trigger the water pump
for me and water the plant itself. So that's the next step for
this one. Now, another one is a post
notification. Now, this is the bane of my life. I do not live in the
Burj Khalifa by any shot, but I do live in a block of flats,
which are pretty tall, right? So for this sake,
or for this, we're just going
to pretend that I live in the top, right? And when the post
comes, it's at the bottom. So every single day, I have to run up and
down the stairs and I have to go and collect my post. And sometimes it
isn't there. There's no standard time for my post delivery,
which to me, is pretty annoying.
So I want a post notification where the postie comes,
drops the post off, lands in the letterbox, which would
then trigger the Arduino to do something for me
that would then tell me that I have some post in my
letterbox, and then I can run down to the bottom and
collect it. Now, that is a really simple sort
of diagram here, and this is a really simple project to be building,
but it's really fun and actually really useful for me.
So I'm excited to get into phase two. And I say phase
two because I've already created phase number one. Now, phase one
is an Arduino, which is connected to a breadboard, like we can see on this
diagram, it's got a couple of resistors, it's got a photoresistor
to detect light in the environment, and a number of leds. So essentially
a binary on off switch depending on
the light in the environment. And I am
going to show you how I have done that. To do
that, I'm going to open up some code in a second.
But the syntax is no different to go. So I want to stress it is
exactly the same as what you would typically be writing if you're writing a
Go program. I'm using an Arduino uno r three, so it doesn't
have any wifi. So anything I do would need to be connected
through a third party board or like a connector hat
or something. I'm using visual studio code and the Tinygo
vs code plugin. And the versions are here on the screen.
I'm using Go version 1.17 and Tinygo version
00:22 now, you can't have tinygo without go
installed because it kind of piggybacks off of it. It cherry picks the
libraries, remember? So I am
going to hide my slides and get up some code,
like so. So vs code is open and
what I can do here. So before we get going into the code, I'm just
going to show you the plugin that I'm using. So over here on the vs
code marketplace, if I was to type in tiny go, you can
see here, this is the plugin that I'm using, and it is installed and
it is globally available for me, which is fantastic.
And secondly, to use that, I then sort
of jump down to the bottom. You can see I'm using go version 1.17.6
and next to it we have tiny go, and it already says Arduino.
But if I was to click on that, you can see a drop down of
a number of boards that I can choose from. So there's
a whole load of them in vs code or in this plugin which it supports.
And all you do is you select the one that you're using and the one
that you want to flash. Now let's
run through some code. As you can see, it is really no different to
go code. We have Iot, a package main, and some imports.
But the timely thing that I need to make you aware of is
this is using machine. This is the one library which is kind of detrimental
to this project. Without it, Iot would just be regular go code.
So here we can see in the function main
we are initializing some analog pins. I have then got
a light sensor and some leds which are here and
I am sort of attributing them to the corresponding pins
on the board. So the light sensor is in ADC zero and the
led pins are in d seven, eight, nine and ten.
After that I'm going to configure the leds as outputs.
So it's going to loop around that slice and
it's going to say hey, for every single LEd I'm going to make sure you're
in output so you can emit some light when sort of an event happens,
when it's triggered. After that I'm going
to check the environment for the light in the room. So this is where I'm
looking at the light sensor now. And I'm saying if
there's over 8000, and I believe this might be nits, but whatever this
sensor is actually measuring in, I just found 8000 to be perfect
for my environment. It's going to say if there is enough
light or if the light is over 8000, then make sure those leds are turned
off. I. E set the LEd to false otherwise,
or else set them to true. It's a real simple
statement saying if, else, if it's greater than this,
make sure they're off. If it's not, make sure they're on. And then I'm
just going to do a timer. So I'm going to sleep for a couple of
seconds or a second here. And this is just
so that the sensor isn't completely overloading me with data
every millisecond because without this it would just consistently run super fast,
there'd be too much data and it would just not be good for me.
I don't need that, it's not necessary for this project.
So to flash it we need to find out what ports we're connected to.
And to do that I am going to type in the command ls
Devcustar and that's going to tell me where
or all the ports that are connected to my machine. As we can see
here, I've got the Bluetooth incoming port, I've got some headphones and
I've got a USB modem. The USB modem is what the Arduino
is connected to via a USB cable. And the next step
is to flash it by using that port. So I need to connect
to it. Now the command for that is Tinygo
flash and then you have target and then the board name and in this case
I'm saying Arduino. Then you have the port name or the port
number. And in this case it is Devcu USB
modem 11301. And as you can see,
that corresponds to the port above. And then I'm just going to use
or specify the file that I want to flash the board. And in this case
it is conf 42 demo go.
So if I press enter, that should flash the board for
me. And it takes about a second or two
Iot, doesn't take too long. There we are, it's done.
Now if I was to hide this and show a different
camera over here, you can see the leds are turned off.
But if I was to cover up the sensor, they turn
on. And that is essentially what this
project is doing. It's on off for some leds.
Now if we go back to my slides,
we can see how that kind of correlates to
the phase one of my project. Now imagine the postee
wants to open up the letter box, puts the letter in.
When they open up the letter box, some light is going to come in with
the letter as well. And that would just be a triggering point for
this project. So when there's post, send a
trigger, send me a notification, whether that's via the cloud,
through maybe Azure Iot hub or some
pub sub event driven architecture that I'd like to build out with this,
this is how it's correlating to what I want it to do.
So this is a first pass. Again, this is phase number one,
and I'm excited to take this a little bit further.
So what are my coding projects now? I've actually got a number of things
that I want to play with. One of them is in front of me,
I've got a macro pad. So when I'm streaming I can sort
of hook this up to obs or a
different program and have some shortcuts while I'm coding or
streaming or something like that. And that uses RP 200:40 board,
so I believe that is actually a raspberry PI. And again,
Tinygo supports that. If I was to look in vs code, I can see the
board that I could flash and it is under that as well. The next one
is a Lego wheel for GitHub notifications. I'm a sucker for always
missing out on notifications. Whenever I get asked to do a pull request or review
some code, I always miss it. I get the email, but it just always goes
over my head. And I'm so busy with some certain
things that I'm playing with at the moment sometimes don't get around to doing it.
So I'd love a physical notification very much. If I saw a lego
wheel moving on my desk, then I would know that I've got a GitHub notification
and to go and check it out. I've done this before with text
messages, but the text messages, I'm really good at ignoring those.
So I thought, let's have something really obtrusive on
my desk. So that's the second one, and the third one is a dashboard
with some youre home sensors. I would love to be able to tell the moisture,
the temperature, all these smart things that the average smart home has.
Now I'd like to build that myself and build a dashboard with
that. I can then hook all the other existing things up that I've got my
post notification, my smart plant, all these kind of things and
have a dashboard which is just sort of on my wall in my hallway,
and I can see everything that's going on. And I'd love to do that.
And if you want to give tinygo a go,
you can as well, because there is a tinygo playground much like the go playground.
All you have to do is go to play tinygo.org and
you can use this as a sandbox or a simulator. You don't need any equipment.
I just chose to go out and buy it myself because then I can learn
it sort of hands on. That's how I learn. That's how I'd love to do
it. But you can do this yourself through a web browser, really quick
and simple and it's really, really fun. You can create some
really cool projects in the playground, much like you can with the go
playground. And with that, I'd like to say thank
you very much for listening to my talk. It's an absolute pleasure and I
can't wait to see where I'm going next with this. If you have any questions,
please do feel free to reach out to me on social media,
and I will always get back to you as soon as possible. My dms
messages are always open. Thank you very much. Take care.