Coding 101 56 (Transcript)
Netcasts you love, from people you trust. This is TWIT!
Bandwidth for Coding 101 Is provided by CacheFly. At
cachefly.com.
This
episode of Coding 101 is brought to you by HipChat Plus. Collaborate, save time
and be more productive with your teams. HipChat Plus is IM, video chat, plus
file, code and screen sharing all in one place. Invite your team members and
get a free 30 day trail of HipChat Plus at hipchat.com/c101.
And by Squarespace. The all in one platform that makes it fast and easy to create your
own professional website or online portfolio. Now
introducing SquareSpace 7 with even better site management tools and other
improvements. For a free two week trail and 10% off, go to
squarespace.com and use the offer code C101.
Father Robert Ballecer: Today on
Coding 101 we continue our Arduino steam clock with Mark Smith. Let’s get
coding. Welcome to Coding 101. It’s the TWIT show where we let you into the
wonderful world of the code monkey. I’m Father Robert Ballecer, the digital
Jesuit and with me today is super special guest cohost Lou Maresca. A senior
software lead from Microsoft. Lou, it’s great to have you back. Thanks for
coming back on the show.
Lou Maresca: Yeah
thanks for having me back, I appreciate it.
Fr. Robert: Now Lou, before we get into this
wonderful Arduino crossover that we’re doing with Coding 101 and Know How, I
thought it would be very important to talk about an idea that is central to the
code that goes into the time library. When I was speaking with Mark Smith he
talked about using a library to get information from the real time clock. And
in doing that he took it in something called a structure. What is a structure?
Lou: So I think Joe Heck in the Google+
community for Coding 101, he had a really good post on this so I urge you to go
check it out. But one thing that he said and the way he explained it was a
structure is a record, right. It’s containing one or more pieces of data that
are grouped together. That’s a quote from his. And that’s really exactly what
it is. It’s a record that- I like to think of it as a book that keeps track of
its attributes like its title and its author and its subject and spoke ID. And
that’s really how you kind of describe that record. And you can define a
structure in languages like C++, C, C Sharp, that represents that record and
all of its attributes and you can kind of define that and then you can add the
data to it. And the data can really be any type.
Fr. Robert: Right. Now there’s people who might say
wait a minute, why can’t I just have variables. I have variables, I already
know how to do that, why do I need a new structure in order to hold all of
those variables together?
Lou: So like structure in many languages are
very similar to like we’ve talked before about like classes and objects. And so
the way that structure works is basically it allows you to define and describe
something so that it’s reusable in many different ways. And structures and
classes are kind of identical in a way in many different languages. And like
many people use the word class to kind of define both of them. But when you
actually define a class you can create an instance of that and then you can
kind of use different instances. For instance I created a class called book and
then I have its attribute called title and its author and its number. And then
I can create many different instances of those books and have different titles
and authors and then I can store that somewhere like if I wanted to store it in
a list or some collection. And then I can go and retrieve that information from
your application. So it’s really just a way to classify what you’re actually
trying to do. It’s a way to describe your intentions when you’re building an
application.
Fr. Robert: Right and actually that would be the
second question I would have for you, which is, we’ve already talked about
structures and how we use classes. And it seems to me that there is a lot of
similarities, this idea of grouping together similar objects, similar pieces of
data, similar functions into one place so that I can declare it multiple times.
So I guess someone who went through the C Sharp module, the second one, and
learned all about classes, they’d be asking wait a minute, can’t I do
everything in a class that I would do in a structure?
Lou: Yeah and so structure is sort of like a
subset- so classes are like supersets of substructures I like to think of it
that way. Because structures are- everything you define in a structure is
normally what we call public. So like for instance, if you define a title or an
author, it’s public. Its public information so if you go and try to use an
instance of that book structure and create an instance of it, you can access
the title and author. Classes are kind of like a way to- you know you can
create a class- it’s identical to kind of to a structure but it allows you to
kind of define other things in the class. Like for instance, accessibility and
other things or you can privatize things and not have it accessible externally.
So if you want to like under the covers maybe change the language of the title
localization wise, under the covers, depending on what machine language they
have. So if they have like Chinese on their computer it would turn into Mandarin
or whatever. So there’s different ways to do that and classes can do that in
private methods or functions. So structures, everything is kind of public in a
way. So that’s kind of how they’re similar, but depending on what language you’re
using, like C and C ++ are very similar, but for instance in a language like C
Sharp, a structure is stored differently and its memory structure because C
Sharp is built on top of a run time. We go all into that in the C Sharp module,
so check that out. But they’re pretty much similar, it’s
just that the way that they kind of declare their stuff is a little different.
Fr. Robert: Right, exactly. I remember that
structures, at least in C Sharp, are always stored contiguously right. So you’re
going to have all those bits and pieces of data that are associated with each
other next to each other in contiguous memory blocks. Now here’s something else
I’d like to know. When we did Santa’s Little Helper, we talked about using this
JSON blob. This idea that we would get a bunch of information
and then somehow we had to parse it out. It seems to me that if we had a
way to pull a structure rather than a JSON blob, we wouldn’t have to go through
the process of parsing because it comes pre parsed.
Lou: Right. So the way that you kind of
define a structure, again, very similar to a class, you’re basically declaring
your intentions of what that’s supposed to look like and I guess JSON is kind
of the same way. It’s just text format or string format of your actually in
memory version. So like for instance, if I had a JSON blob of books and it has
different attributes in it, or properties, it would define a book and its title
or whatever, and that’s a big long string so you would store it in a piece of
memory and it would become one long stream. But with a structure you can define
an actual object that defines each property, each attribute, and again, like
you said, it’s stored in a continuous block of memory so if we ever did an
actual size of that object id be able to tell what
that is. And again, I’m defining exactly what it is, the compiler can say okay
this is the book and it’s got an author and a title and if I try to store like
a number within the title it’ll say no, you can’t store a number in the title
unless it’s a string and that kind of thing. So it creates a way for you to
describe your intentions when you’re building your application.
Fr. Robert: When I was learning C++ way back when,
one of the differentiating pieces of data that I took was that I would use
structures whenever I needed to separate different records. But as we move into
object oriented programming, I can have structures that contain data and
behaviors as well, which again, I’m going to go back to this, I know that you
answered this but I want a clearer answer for the people who are going to
struggle with this as they start to look at structures vs. classes, and that
again is, where do you use a structure and where do you use a class? If I can
have a structure that basically acts like a class, because it’s not just
handling data, but behaviors, then why do I need a structure? And vice versa. If I have a class that contains data and
behaviors, why do I need a structure?
Lou: That’s a good question. So classes allow you to do a lot of other things that normally
structures don’t do. for instance, you can hide things in them, you can
create different versions, you can create inheritance structures where you can
have many different versions of it so you can have a book and then you can have
another version of that where you can create a large format book or maybe a
Kindle book, that kind of thing and so you can create different inversions of
that using classes. Structures are really kind of basically defined for small
little things. For instance if you’re doing something in an application that
might require you to store small pieces of data or small functions or methods,
then that’s for when people use structures because they’re very easy to define.
You know that they’re a continuous block of memory so you’re not going to
fragment your memory. And so it’s very easy to use and they’re really made to
do very small things. Now classes on the other hand, are made to do potentially
a lot of different things so you can have a class that might be a book but then
you have another class that is made to sort the books and do other things. So they’re
made to do more functionality and they’re a little easier to define. You can
define things under the covers as well as above the covers. So it’s kind of
like if you have an audio receiver and on the outside you have a bunch of dials
and controls, but on the inside there is all these
different electronic components. So a class can define those internal
components and the dials on the outside. But a structure, really there is no
internal stuff. It’s just the outside. So it’s just a black box and you see all
the outside, you can define all the dials and controls but there is no internal
stuff. There is nothing hidden. So with a class you can hide a bunch of stuff
and you can hide a whole bunch of implementation and a bunch of details that
you don’t want somebody who like they were saying you can use a different class
and different libraries, and what it does, you can hide a bunch of things under
the covers that it actually does. So if you want to talk to hardware you can
hide all the hardware code and just have an interface for people to say send
signal or send a beep or that sort of thing. Very simple
things. So really kind of hiding things with classes, structures are more smaller function and very clear, concise function.
Fr. Robert: Yeah, absolutely. Thanks Lou. If you
want to know a bit more, I would suggest that you go to our G+ group, look for
Joe Hecht’s post. I believe that was last November. Because he does a really
good job of explaining why he would use a structure, what it is, and how it
works. Joe Hecht is a member of our community, really good guy, we’ve been
trying to get him on the show but he doesn’t answer emails. Joe, if you’re listening, reach out, because you’re actually quite a good
teacher and we want you on Coding 101. Lou, when we come back we’re going to be
going into our Arduino clock build. This is episode 3 of 4. We’re starting to
put everything together. In the last two episodes we explained what an Arduino
was, what embedded programming was. We showed you how it worked, how you can do
hello world and how you can get information off of the real time clock. Now
we’re going to start moving into how you actually put the bits and pieces
together and get the right inputs to the right outputs after being processed by
our software. Lou, are you interested at all in seeing that?
Lou: Absolutely, looking forward to it.
Fr. Robert: But before we do that can we take just a
moment to thank the first sponsor of Coding 101? Let me ask you a question. How
do you communicate? I know that’s a silly question in this day and age because
we’ve got so many different tools to communicate. It’s not just the phone and
email and text, but there’s every kind of social platform, both social and
business oriented that gives you so many different options. From video and
voice to text to screen sharing to data sharing that it’s funny these questions
that people don’t often ask. But let me ask you, how do you communicate
effectively? Here in the brick house we use HipChat. Now what is HipChat? It’s
fantastic. It’s business communications. I know there’s going to be people out
there going wait a minute, we communicate in my business. We’ve got email,
we’ve got text, and some of us have pagers. We have voicemail, we have video
calls. But even though that may work and even though that’s a good way to
communicate, there are plenty of sweets out there, HipChat is specifically
designed for businesses. And businesses are the ones who are going to love
HipChat because it allows you to keep a history of what your communication
looks like. I’ll explain why that’s important. When your team communicates,
when they use a variety of programs, from email, IM, texting, cloud storage,
document sharing apps, they have little bits of pieces of the answer
everywhere. And if you’ve ever had to do forensics on your project planning to
figure out where a good idea came from, or where a bad idea came from, you know
that you want an easy way to look back through time. Through the time of your
communications and figure out what happened when. That’s what HipChat lets you
do. It gives you a time machine so you can see the genesis of that next great
idea. They give you IM, video chat, document sharing, screen sharing, system
updates, and code sharing integration, which is important for our audience, in
one simple platform. Email is too slow, meetings get sidetracked and regular IM
doesn’t work well for groups, but HipChat keeps your team in synch. And it
works from any device no matter where you are. The best part is that HipChat
integrates with the top developer tools like GitHub, Gira, Zen Desk and more.
You go to their website and check out the 57 services that HipChat plays nice
with to see if maybe you don’t have to do much integration at all. Just turn on
HipChat and start working better. They bring your entire project and team
together in one communication suite. It’s easy to set up, its fun to use, and it makes you productive. Now here’s what we want you to do. We
want you to try HipChat Plus. You can get your team on the same page in
seconds. I want you to try them for free, no credit card required. Visit
HipChat.com/c101, click on “start chatting” to sign up now. Then invite a few
team members and all the features are free for 30 days. After the free trial
you can always stick with the freemium version. Remember, that’s
hipchat.com/c101 and here is a super-secret piece for everyone who wants to act
now. If you sign up now the first 100 signups are going to get their free trial
extended to 90 days. That’s hipchat.com/c101. Hipchat.com/c101. HipChat, your team, your project, in synch, instantly. And we thank HipChat for their support of Coding 101. Let’s get right to it.
We’ve got our code warrior, Mark Smith, back and he’s going to give us a little
Arduino action. When we last left this project Mark, we had just assembled the
shield on top of the Arduino, we had added the real time clock, added the
library so that we could get the data from the real time clock and you showed
us a very simple program that took that data, parsed it out so that we could
just get hours, minutes and seconds. Now of course, we want to end up with
something like this, so although it’s nice that we could get the time out of
the real time clock, eventually we’re going to have to push that to the outside
world. Going back to the first module, we have our inputs, now we need to
figure out our outputs.
Mark Smith: Before that though we also need to
confirm that the time is correct. They don’t actually set the time on the
modules when they leave the factory. And if they did you don’t know what time
zone you’re in, blah, blah blah. It’s not correct, you’ve got to set it. So what we’re going to do first is hook up some buttons
to our Arduino and tell it what time it is. So I have a button here. It’s the
same button we looked at last week. And I’m just going to put this on the
breadboard. Put the button on the breadboard there and we’ll go ahead and do
the other two while we’re at it. Just because. There’s
the third one. Like so. Now we need to hook those
buttons up to the Arduino. So I’m going to take some of these wires, these hook up wires that we have. And I’m going to take one
side of this button and I’m going to connect it to one of the digital inputs.
But before we do that, let’s look at which inputs we’re going to use. Now
remember last week or the week before we were talking about the PWN digital lode
lines and the ones that can do PWN, the analog outputs and the ones that can’t.
For buttons we don’t want to take one of the PWN lines because we’re going to
use those for the analog meters. So we’re going to use the lines that cannot do
PWN. So I’m going to start with 2, 4 and 7. I’m going to put the shield back on
top, and I’m going to hook up the wire between 0, 1 and 2. Right
there. Then I’m going to take that wire from another button, that’s 2,
3, 4 and 7. 4 and then we’ll take the 3rd button, push it back on the breadboard, from there to 7 which is the last one on that
block. So I’ve hooked up those 3 wires to their digital inputs. Now I’ve got to
hook up the other side of the buttons to somewhere. And we’re going to use
ground on the other side. So the buttons, when you push them, will connect that
digital IO pin to ground. And this big block of connectors up here, all 10 of
these are ground, so I can just plug in to any one of
them, it doesn’t matter which one. So now I’ve got 3 buttons hooked up to the 3
different inputs and they will connect to ground when you push that button.
Normally you would also hook up a resistor between the positive side, the blue
wire here, and the plus voltage over here. It’s called a pull up resistor. So
that when the button is not connected, the inputs to the Arduino will see a
high voltage instead of just a disconnected voltage with no voltage at all. It’s
called a pull up resistor. The Arduino can do internal pull ups. So we’re not
going to bother with that. We’ll see in the code where we turn on the internal
pull ups so that we don’t have to worry about that.
Fr. Robert: Okay so that’s the hardware that will
give us ground when we push the buttons. But now we need to do something inside
the sketch to actually get that in. let’s take a look.
Mark: So this is an updated version of the
sketch that we looked at last week. You’ll see the same #includes and some of the
same #defines, although I think I changed the name. I added PIN in front of it.
It’s more descriptive. But I added a couple of new ones. BUTTON_MINUTE
and BUTTON_HOUR. And we chose pins 2 and 4 for those. So those are the
digital inputs that we used to connect up those buttons. So we have a couple
more #defines. I am defining a few variables here, these are globally defined variables which means they will be available in both
the set up function and the loop function. If we defined them inside either set
up or loop, they could only be used inside that particular function. But
defining them outside of those functions, they are globally available. You can
be anywhere. If you’re writing normal software that’s not in an embedded
environment, you generally want to avoid globally scoped variables.
Fr. Robert: We’re using it here for ease of
programming.
Mark: For ease of programming and because the
scope is less than 100 lines of code. We can keep track of the scope of all of
the stuff in our head. It’s a small enough program we can get away with that. So
right here we are doing very similar- there’s the power to the RTC which we saw
last week. So we’re providing power to the RTC. Then we are configuring the
buttons that we just hooked up. So we’re saying BUTTON_MINUTE and BUTTON_HOUR
are inputs. So we are going to be reading data from those pins. And so we set
that in the pin mode. Then digitalWrite. So we are
writing to an input pin. Which seems somewhat
counterintuitive. But this is how you enable the pull up resistors. So
this is an 18 mega feature. If you write a high value to an input pin, that
will enable the internal pull up resistors.
Fr. Robert: Right. In other words, if it doesn’t
see anything, it doesn’t say there’s nothing there, it says oh, its high voltage
there.
Mark: Correct. It’s a high. It’s a high
input. And then when you push the button it’ll read a low. So that’s what we’re
going to do. Then we set up the serial port, just like we did last time. We do
our hello world but I say 02, so that I make sure that we know that we’re
reading the 2nd program that we’ve written. And then we’ve
initialized some of the global scoped variables that we defined earlier. The
lastTime, what the time was the last time we went through this loop, and then
what the state of the buttons was last time we went through the loop. Whether it was high or low. Remember, high means we are not
pushing it, low means we are pushing it. So we’re going to use that later to
detect when the button has been changed. Then we go into our loop. We are going
to, at the top of our loop, get the current time and put it into a variable
called thisTime. So that says right now, this time we’ve gone through the loop,
this is the time that it is. There are 2 different types of variables that time
can be put in. one is called a time_t, and one of them is the TM elements that
we saw last week. In this particular version of the code we’re going to want to
use both of them. They each have their advantages and disadvantages. The time elements makes it very easy to pull out minutes, seconds,
hours, and so on. But the time_t is just a giant integer. It is the number of
seconds since a given epoch. In eunuchs time_t is the number of seconds since
Jan 1st at midnight in 1970. It’s just an arbitrary date they said
and they’re going to count seconds all the way from there. That is very easy
for things like is this time greater than that time? Because then it’s just a
comparison of 2 different numbers. So I’m keeping time in both different
variables to make it easier. In some cases I want to use one, in some cases I
want to use the other. It does mean that we have to make sure to keep them in
synch, and we’ll see some code where I do that a little bit later. So we are
reading it as a time_t and then we are creating an element from it. So now we
have both of those. So again, here we are looking for an error from RTC.get. If
this time is = 0, that means that RTC.get returned an error. It said somethings
wrong, I don’t know what time it is and we do our error checking just like we
did last time. And then if we did get an error we return out of the loop and
start the loop again. We don’t do the rest of the processing. But if we didn’t
get an error then we have good time so we continue on. So we are going to look
for whether any of the time setting buttons have been
pressed. Remember, I put a comment here to remember that HIGH means it is not
being pushed, LOW means that it is being pressed. So I’m going to define a
temporary variable that we’re going to use. I’m going to do a digital read on
the button for the minute. ButtonMinute is the variable that holds what this
value was last time, so if before it was not being pressed, and now it is, that
means that this time through the loop, someone has
just pressed that button. So we are going to do something. Button was open, now
it’s being pushed. So we are going to figure out what time, what minute the
time objects thinks it is right now, we’re going to add 1 to it, so we’re going
to increment it by 1. But if it was 59 before, we don’t want it to read 60 now.
So we have to take modulo 60, 59+1=0. So this is the little bit of math that
we’re doing to set the variables. And then we’re going to assign that back to
the variable. And then we’re going to set this Tm.Minute=tmpMin. Now in reality
I could combine all three of these lines into a single line. But it’s a little
bit harder to understand.
Fr. Robert: Yeah. This is much easier for people to
actually figure out what’s going on.
Mark: Exactly. And honestly, for a compiler,
the compiler will optimize that into the exact same code. So there’s no need to
make your code overly complex to read, thinking that it’ll make the compiled
code more optimized, it’s not true. The compilers will optimize all of this out for you.
Fr. Robert: That’s actually worth noting because
there are some people who think your code gets uploaded into the Arduino. That
actually doesn’t happen. That’s why you’ve got the IDE. That’s the sketch you’re
making. Your sketch will be translated into something that actually can be
uploaded to the Arduino. So yeah, as Mark was saying, write it in one line or
three lines, the developer environment is going to turn it back into one line
of code for the Arduino.
Mark: Right. The important part is to write
it in a way that makes it easy for you to understand and for other people to understand
so that when you come back to this code 5 years from now and you’ve completely
forgotten about all the things that you did, you can easily figure out what it
was doing. That’s the most important part. So let’s keep going. So we have done
that. And then once we have made that change, we have incremented the minute,
we are going to then create a time T back from it using the makeTime function.
And all of these functions, the breakTime and makeTime, they’re documented in
the time library, which is one of the libraries that we installed last week. When we were talking about the RTC. So breakTime and
makeTime are from the time library. So we are going to take the time elements
which we just changed, and we’re going to create a timeT back out of it. And then
we’re going to tell the RTC this is your new time. So we have programmed the
RTC with the new value. We have to push it back out otherwise next time we read
it it’s just going to undo what it did. And then we
set buttonMinute, which is the variable we use to track whether the button has
been pressed or not. We set it to the value that we just wrote. So it is now
low. Effectively. Then we go down and do the exact
same thing for the button hour. So we’re reading from a different pin, we’re
using a different state variable. We’re setting thisTm.Hour instead of
thisTm.Minute. And otherwise it’s exactly the same code as right above it. Now
we have set the time. We’ve looked at the buttons and we’ve set the time. Then
if the time has changed since the last time we were through, and that’s where
we’re using thisTime and lastTime, so the lastTime was the global state
variable, thisTime was the time that we got at the top of this loop. If those
two are not the same, either because we’ve changed the time by hitting a button
or because the seconds have incremented since the time has changed from the
RTC, then we want to set lastTime to thisTime and then we want to output our
time to the serial console just like we did last time. So then we delay by 100.
So its 10 times a second.
Fr. Robert: And you would need this to guarantee
that it’s only going to update whenever there’s actually a change. Because otherwise, since this thing does loop 20 times a second, it
would just keep going.
Mark: It would just print 10 times a second
for every output. So I only want it to update when it needs to update. I am
going to go ahead and upload that code to the Arduino. So we got the time. I’m
going to go ahead and press the minute’s button. See how its incrementing the
minutes? Then I will press the hour’s button.
Fr. Robert: This shows you a couple of different
parts of the program. First is that it’s updated only every second. But also,
when you press a button, it does change it. So you could make this output as
many times as you can press it, even when it’s not taking the tick.
Mark: Correct. In fact, it will output it
every time I press the button. Even if it’s more than once a
second. Because remember, the code says I’m going to change if you press
a button, and then at the bottom below that it’s going to say if the time
changed. So every time you press the button it’ll immediately trigger a new
output.
Fr. Robert: Up to 20 times a second.
Mark: Up to 10. So it’s laying up 100 milliseconds
between each one. So 10 times a second.
Fr. Robert: Okay, so now we now the buttons are
working. They’re interacting with the code. Are we just limited to the screen?
Could we push this out elsewhere?
Mark: Let’s look out some meters. So this is
an analog panel meter. It is a meter- you’ve seen these. It’s an electro
magnet, it’s down here. And you pass a certain amount of current through that
and it deflects this needle around here. More current, more
deflection. Now you’ll notice that this one is measuring volts, and the
straight line means its DC volts. And it’s between 0 and 15. So that means that
this meter is configured to measure 15 volts DC full scale. But I just told you
that that meter is measuring current. All analog panel meters are actually
measuring current. And the way you can configure a current device like this to
measure voltage is by sticking a resistor in series with it.
Fr. Robert: If you actually want to see Mark do the
alterations to the meter so that it can measure current rather than voltage, go
ahead and jump over to Know How. This is a cross promotional series. He’s going
to be giving you exactly the step by step that you need to be able to take out
a certain resistor, and make sure that it’s going to measure the current which
is what we can actually output from the Arduino. Now Mark, having done that, we
now have a meter that can be used with the Arduino,
but we don’t have a connection between the Arduino and the meter. So how do we
do that?
Mark: So we had that resistor in there before
and it was set up to read 15 volts. We can’t get 15 volts and we don’t actually
know- some meters are 1 milliamp, some are 5, some are 100 micro amps, they all
vary. And so what we want is a circuit here that we can adjust to be able to
put out the correct amount of current for the meter that we’re using. So what I’m
going to do is use a 10killaohm resistor, potentiometer, a variable resistor
here, and I’m going to put it into our breadboard. Kind of part these wires
here. Remember that when you put these in, you want to put them in this way so
that they’re not shorted. If you put them in like this then
all three of the pins will be across on the same row. Each one of these
row of holes is all connected to each other. And so if I want to be able to get
to each of the pins, I need to put them in like that. So we are now looking at
the 3rd set of code. So we #defined the PWM pins. There they are. So
we are using 5, 6, and 9. I think I chose not to use 3 because it was kind of
huddled between some of the other pins and soldering was going to make it more
interesting. So we’re going to use 5, 6, and 9. So I’m going to take a pin from
0,1,2,3,4,5. Take that one there. Put it into one side of the resistor. I’m
going to go for seconds because it’s easier to see. So I’m going to move it
over to pin 9 where the seconds are. And then I’ve got that variable resistor
in there. And then I’ve got this one meter that I already rigged up with some
wires on the back. I just wrapped them around. And I’m going to hook this up to
the output of the potentiometer. And ground. Like that.
Fr. Robert: So this is the output that we see from
the Arduino right now. We’ve just connected the meter but we need to be able to
calibrate it so that it shows us the right output. Go ahead and show us what
we’re seeing on the meter. So what is this motion?
Mark: So you’ll notice that the meter is
changing ever so slowly. So what it’s doing is if we
were to open this up and change the facing of this meter to read seconds, 0-60,
then that’s what the meter would be showing you what second is on display right
now.
Fr. Robert: So at some point it’s going to hit 60
seconds, go back to 0 and that meter should drop back down.
Mark: Correct. So we’re doing this by sending
an analog voltage. Now I have it going through the 10killaohm potentiometer and
it’s kind of unset right now and it happens to be in a good enough area that we
can see it going up. I’m looking at the console and we’ve got 20 more seconds
before it kicks over. But it doesn’t look like it’s going to make it all the
way up in the time.
Fr. Robert: What I really want is I want 0 to be 0 seconds, I want 300 to be 60 seconds.
Mark: Exactly. And we’re going to get it
right now. You’ll notice the needle went back down.
Fr. Robert: So I need a way to be able to calibrate
this so that it will do the right range of motion. How do I do that?
Mark: So the way to do that is by adjusting
this resistor here.
Fr. Robert: I’m changing the resistance because it
is a potentiometer. Why does that allow me to calibrate?
Mark: So Ohm’s law, remember. V=IR. Voltage=
the current x resistance. So I’ve got a certain voltage that comes out of the
Arduino at “full scale”. So when the Arduino thinks I am pointing at 60, or
actually 59, that is full scale. You want that to be all the way over on the
right hand side of your dial. So what we need is a way to
tell the Arduino give me full scale on my meter. And then what we’ll do
is go in and adjust the potentiometer so that it is reading full scale. So go
back over to the code for a second, I want to show the code that we used to do
that. So we’ve added a few other things in here. Because I needed to be able to
count ticks, quarters of a second. The RTC doesn’t know about quarters of a
second. So I am using the imprecise clock on the Arduino counting the number of
milliseconds that the Arduino thinks has passed, just to count 200
milliseconds, 500 milliseconds, 750 milliseconds, and then we reset at the top
of each second. So there’s some extra code in here to do all of that. Which we can go over if we want. But otherwise, the code is
very similar. Here’s our set up. We have added another button for the calibrate
mode. Which we’ll go to in a second. Serial ports and some other things. And
then the loop, much of the same code. Calibrate the meters. So we’re
doing another thing. Digital read. If the calibrate button is low, that means
we are pushing the calibrate button. What I’m going to do is print out to the
console, calibration mode, adjust the potentiometer so that the needles read
full scale. Then I’m going to analogWrite an analog voltage of the PWM_MAX. It’s
a #define that I defined earlier. It defines what value is written at full
scale. And so we’re going to go ahead and analogWrite full scale out to all
three of the meters. And then we’re going to wait for the button to be
released, and then pushed again. And then when it is done being pushed, it will
have been released and that completes the calibration mode and it goes on with
life.
Fr. Robert: We’ll go through this code more in
depth in the next episode, but for now, let’s show them exactly how this works.
So you have added this code so it’s looking for a key press. And when you do
that key press, it goes low, it’s going to allow you to set the values for max
so you can calibrate that potentiometer to put the needle exactly where it
needs to be.
Mark: So I’m going to push this button, and
it swings the needle over to full scale. So then we’re going to take our
screwdriver and we’re going adjust that potentiometer. It has a 25 turn which
means it adjust very slowly. So you can get to it very precisely. And we’re
going to get that until right about there. That’s full scale.
Fr. Robert: So when it’s at its max current, it
will be at the max level on the meter, and when it goes to 0, it goes back to
0.
Mark: Exactly. So there is one other
calibration point we need to do. If you remove power, the meter will go down to
zero. Most meters come pretty well calibrated but that one actually looks a little
tiny bit off. There is a screw hole on the front and so you can physically
adjust the zero point down to actually zero. So that’s the zero point. You want
to adjust the zero point first. We’ve got it powered back up, it’s ticking. Let’s
press the calibrate button again. Now we need to recalibrate this because we’ve
changed the low end. And right there. That’s full scale. We are now calibrated.
You push the button to turn the calibration mode off and it goes back.
Fr. Robert: Now we are going to show them the code
that made all this possible in the next segment, but I’m afraid that’s all the
time we have for this week. Again, if you could tease the audience into what
they’ll be learning next week… yeah I think that’s all the tease you’re going
to have to do. Thank you again Mark Smith for being our code warrior. It is
always so much fun to talk to you because this is the programming I really get
into. Because it is hardware and software at the same time. Could you tell the folks at home where they can find you, where they can find
your work if they want to find out more about the things that you build?
Mark: I spend most of my time on twitter. @smittyhalibut. I don’t really have a blog or anything else.
Most of my online life is spent on twitter.
Fr. Robert: If you don’t follow him on twitter, it
means that you hate life and a cat has died. Thanks Mark for coming on. Back to you Padre. Thank you Padre. Remember, if you are
following along in this project you need to watch Know How episode 132. That’s
the one we just did before this show in order to find out how to mod the meters
so that you can make it register properly. This is a crossover so you’re going
to want to watch know how and Coding 101 to get the full experience of how you
do the hardware and the software and turn it into something magical. Speaking
of something magical, if you are working on a project, if you’ve got a special
passion that you want to get out to the world, you’re going to need a place to
put it on the internet. And we know it’s all about location, and about how you
present that information. Which is why we’ve got Squarespace
as the second sponsor of this episode of Coding 101. Squarespace is that
one place you can go to on the internet to easily get your project or portfolio
on the internet and I love Square Space because they’re always improving their
platform. In fact they just released Squarespace 7. That makes getting started
much easier and they have a unique web presence that is built up over templates
that they give you. It’s now more all in one, it’s simpler to navigate and it’s
simpler to operate in 1 seamless experience. Squarespace 7 allows you easier
editing. You can edit on 1 screen which means you no longer have to toggle
between site manager and preview mode. You can even preview designs in divide
modes - that you see exactly how it will look on tablets and mobiles. Now it
also offers instant access to professional stock photography from… It’s now
integrated into the package. They’ll allow direct purchases inside the platform
from getting images at just $10 each for your site. No more having to jump out,
get an image imported into Squarespace, make sure all your licensing is taken
care of. It’s all in 1 interface. You can get google branded email with
Squarespace 7 so you can have the branded email for your small business and
it’s automatically set up when you set up your Squarespace account. They’ve got
templates, designed for specific professions which this is a big one. All their
templates have been beautiful but now they give you the option to switch
between different classes of templates. You can move between templates for
musicians, artists, architects, chefs. They designed those templates, those
category specific templates so that you can find the one that looks right for
the project, for the business, for the industry that you’re trying to
represent. On Squarespace 7 the developer platform is now on a beta which means
that you can customize your site exactly as you wish. If you’re a developer you
have access to the same platform that Squarespace uses for its own site –
complete code control They also give you e-commerce with all subscription plan
levels that includes the ability to accept donations which is great for
non-profits, cash wedding registries and school fund drives and it’s easy to
use. Yes, sometimes you’ll run into a ram but it’s easy to get it solved
because Squarespace offers you support; 24 hours a day 7 days a week. They’ve
got an army of folk in their forums giving you self-help articles and video
workshops to browse at your leisure. It also starts at just $8 a month so it’s
not going to break the bank. That includes a free domain if you sign up for a
year. The Squarespace portfolio, the note, metric and blog mobile apps are on
the go extensions of your website so that you can monitor and make changes from
anywhere. They include the hosting so again it becomes a 1 stop shop. You don’t
have to worry about buying different services from different providers. It’s
all from 1 place. It’s all in a square space. Here’s what we want you to do. We
want you to start a free 2 week trial with no credit card required and start
building your website today. When you decide to sign up for Squarespace make
sure to use the offer code c101 to get 10% off and to show your support for
Coding 101. To begin using Squarespace 7 now existing customers can go to the
setting tab to activate all of your new features. We thank Squarespace for
their support of Coding 101. A better web awaits and it starts with your new
Squarespace website. Squarespace, start here, go anywhere. Lou, next week is
going to be the last episode we do with this embedded programming module, one
the things I’m not sure if all of our audience knows, when you do Arduino
programming, it’s really just C right?
Lou: Exactly. Really easy
C.
Fr. Robert: Exactly. So if you’ve done any sort of
programming in C or any of the C frameworks, Arduino programming is really not
anything new. In fact, it uses all of the same components that you’ve seen in
the modules here on Coding 101. Loops and variables and
if/then statements. So go ahead and give it a try. It’s really, really
hard to break an Arduino project. Pretty much the only way you could do it is
if you physically break the board. Go ahead, upload bad code, upload horrible
code, upload whatever it is that your mind is thinking of and don’t forget that
you can always get all of the code tidbits that we use in our episodes on our
show page and alter them. See what you can come up with. Lou, anything you want
to add before we send the audience off to do their homework?
Lou: No, I think like you said, the really easy C, check out some of the C programming that’s out there. We
just talked about – in the beginning of the show and I think there are some
really great articles and some really great blog posts out there about it and it’ll
get you going on just normal C style programming too. So Arduino is a great
example of implementing your own project and getting you out there and trying
new things.
Fr. Robert: Lou Maresca,
again, our super special cohost. We want to thank you
for coming back. Could you tell our audience where they can find you and your
work?
Lou: Absolutely. On Twitter, @LouMM, and
about me, Lou MM as well. And all of my work during my day job is at
crm.dynamics.com.
Fr. Robert: And we’ve seen you on This Week in Enterprise
Tech, Coding 101, some of our news programs, and my understanding is that we’re
going to start seeing you do reviews for Before You Buy. Is there any truth to
that rumor?
Lou: Yeah, I’m super excited about that. I
get to play with toys.
Fr. Robert: Lou Maresca,
follow him, see what he’s doing, he’s a good guy. Speaking of good guys, we
want to do something for all of you good guys. And gals. And geeks. We want to give you a place where you can
get all of our episodes and all of our show notes in one easy place. Go to our
show page at twit.tv/code. . You can find our entire back catalogue of episodes
which is important because it’ll let you download entire modules if you want to
learn what we did in C Sharp or Perl or PHP, it’s all right there. It also
gives you a place where you can use that little dropdown menu to get every
episode of Coding 101 automatically downloaded into your device of choice. We
make it easy because we love you. Also you can find us on Google+. In fact,
this is a great place to go. We’ve got almost 2000 members of this community. It’s
got experts, intermediates, and newbies. It’s a place to go if you ever want to
ask questions or answer a couple of questions. Coding is best when you do it in
a community and that’s what Google+ is for us. Find me on twitter,
twitter.com/padresj. @padresj. If you follow me there you’ll
see what I do during the week, even when I’m not on TWIT TV. You’ll see the
next episodes and topics for Coding 101 or Know How or This Week in Enterprise
Tech or Padre’s Corner or for Before You Buy. Also, we do this show live every
week. Now it’s on Thursday at 1:30 pacific time. Starting in March, we’ll move
to 2:30 pacific time on Mondays. You can join us at live.twit.tv. And as long
as you’re watching live, jump into our chatroom at irc.twit.tv. Until next
time, he’s Lou Maresca, I’m Robert Ballecer,
end of line!