So, I'm going to, I have a thought. I'm not sure if you guys want to do this or not, but, and I'm kind of scared to do it. It's a, let's see. It is an update and you might not be able to see it. Well, here, let's see. Now, you can't see it. Let me see if I can move this. Huh. It doesn't show. Well, there's an update for the STM32 Cube IDE. And it might be helpful for some people to go to learn the update process, but I think I just lost the update. Yeah, I lost it. So, generally when you turn on or when you start the STM Cube for the first time, I guess maybe after a certain number of minutes or hours have passed, you'll get that little notification on the bottom right that there's an update. So, maybe I do that because it could help some people and I'm not getting it now. So, maybe later on in the stream, it'll happen and I can update it. Because, you know, the updates in the IDE, it's almost like installing the program all over again and it would be nice to show that. It would be kind of an experiment all on its own because you don't know what's going to happen in an update with the STM Cube. Because it is based, it is a layer on top of the Eclipse IDE. And things can break, I guess, but I'm sure it's been tested. But what I found is when you do an install, the project folder is kind of lost or it gives you the option to put the project folder into the next version of the software. Okay, cool. Let me do that. Let's go to Help. Thank you, Skeptic. Appreciate the heads up there.
All right, Help. About. Installation details. So, let me look. I don't think I've ever done this before. So, this is the Eclipse. Eclipse.org IDE. Eclipse Modeling Project, the MX. This is the Cube MX, I guess. Eclipse PTP. I have no idea what any of this stuff is, actually. All right, so where would the Check for Update be? I guess it's one of these. I am afraid to do this. Let's see. I'm going to wait until the... Well, I see it. I see it. I see it. It's on the bottom. All right. I don't think you're going to be able to see this. Yeah, it doesn't show up on OBS, but it says Update Available. Updates are available for your software. Click to review and install updates. You will be reminded in four hours, but there is nothing to click here. Oh, wait. I just clicked on the box itself. All right. So, let's see. Can you guys see this? Yeah, you can see this. You see, even though, like, I say I'm afraid to do things, because I truly am and I'm doing this live, if I wasn't doing this live, I probably would just be clicking randomly or just going through it very confidently.
But because I'm live, I know things can break and it could make for a train wreck. It could make for a very short stream. So, it's probably good for me to do this on stream. So, you can see sort of my mindset. I can sort of tell you my mindset while I'm trying to do it. Go for it. Yeah, let's do it. All right. So, we got the SPMCube IDE. I'm going to click this. I guess I could just select all, press next. I mean, it's not giving you much opportunity to mess up here anyway. All right. So, finish. And it also goes to show that, like, this whole thing with the bare metal, you know, I'm programming bare metal, bare chip programming, you know, just on something very low level. And if I'm afraid to do an update, it just shows you how, you know, you shouldn't be afraid to get into this, like, development, you know? At least that's the conclusion I'm going to give. I'm using the STM32F030R8T6. But if you just use the F030, that's probably enough. There are maybe different packages, like, different number of pins. I don't really know because I have to, I'd have to go back to the datasheet because the datasheet actually covers all of the versions of the F030. All right.
So, I guess it's select all, trust selected. I guess I'm trusting everything here. Do I have a choice? Here we go. Trust selected. I'm trusting you. I should probably get out of this. I'm going to exit the S, yeah, well, it tells me to restart anyway. So, I'm going to restart it.
I think it's Cortex-M0. At least I think I said that in one of my previous videos. Okay, so it looks like we, it's, it restarted. So, let's take a look. It still says 1.14.0, so I don't think it's actually changed. You can probably see that right here. So, I'm going to, oh, look at that. It opened something. I don't know why.
All right, so I'm going to exit this and I'm going to, because this is the one that I'm using right now, I'm going to search for maybe what's installed, the latest installed.
It still says 1.14.0 as the latest one that I have. Let me see if I can, and it didn't install any, let me see if I put something on.
No, maybe it was just the cube monitor. No, that's not it. Huh.
So, I've got the, yeah, that's the latest one. It's the one that I've been using. That's weird.
Maybe it's an update on other parts of the STM32 cube IDE and not the whole cube IDE.
Hmm, interesting. Not sure what happened there. All right, so let's go ahead and go in and see if it still works.
I have not worked on USB drivers yet. This specific controller, I've done the USART where you use an FT232 chip and you can communicate using USB with that.
But I haven't, this, you can find the STM32s with the USB built in and I'll probably go over that much later, but I haven't done that specifically, you know.
Yeah, I'm unfamiliar with the RP2040. Okay, let's see.
Let's go ahead and, anybody have any thoughts on what I should put on the display?
Get a little closer here.
Last time I ended with the inverting the pixels and we put it in the never ending loop just going back and forth inverting the pixels. So, that was the last command that we looked at is the pixel inversion command.
Oh, interesting. So the RP, it makes sense, I guess, Raspberry, the Raspberry Pi. The RP2040 is the market controller for the Raspberry Pi and for the Pico. So that's, I guess, the smaller version. I was into Raspberry Pi a while ago when I was trying to think of ways to use the Raspberry Pi for, or as a CNC controller.
And I was going to put a Linux distro on it and just use Linux CNC to control, but I didn't really follow through with that project.
But I have like Raspberry Pi is just unused in my drawers.
All right, so let's see, what should we put here? Who has a suggestion on what I should put on the display? I'll probably stop the blinking because that's probably going to annoy everybody.
I'm going to go ahead and try to do a flash and see if it works.
And it does work. Okay, so I'm not really sure what happened with that install.
It didn't give me a new version. If anybody else has the...
Oh, look at that. I have it inverted. So let me change that inversion.
That was the A6 right here.
And it says set normal display, so I'm going to rename this as... Pixel inversion command. So A7 is inverted. Or I should say A7 equals...
Black on white. I can't do that.
What would I call this? Anybody have any suggestions? A7 would be inverted, I guess. And A6 is normal.
I was trying to be more descriptive, but that would be very difficult to do.
So what does set multiplex ratio? I want to mix things up a little bit because it could get a little bit monotonous to just constantly talk about OLED over many sessions.
I would like to go back and forth a little bit because for one, I think it sets... For at least me,
it makes things more concrete when I don't do just one thing at a time. I would go back and forth to two different ideas. And then when you go back to the other idea, it kind of makes it more concrete because you're forcing your mind to exercise a little bit more. I don't know if that's a good way to say it, but what I'm thinking is trying to put the accelerometer ADC in the mix here in this program while I'm also working with the OLED. So we can learn how to use the ADC while we're trying to show something on the display at the same time.
So I think that's what I'm going to do. If anybody has any objections to that, let me know.
Pranjal asks, "How library or low-level programming?" Which one is good? They're both good. In my opinion, I believe that I personally like low-level register level programming because it's more comfortable for me.
But Hal is going to give you a hardware abstraction layer, so you should use that when you know that you're going to be needing to change the microcontroller for the project that you're programming for. So if you're working for a company and they've decided to use a particular microcontroller, but maybe later on it doesn't have the features that it requires, then you may...
If you're doing register-level programming, the features may not be compatible. They're generally going to be because the register level uses the same masks. They use the same macros and defines.
But if, let's say, you're working with a microcontroller that has... Let me switch something here.
If you're using a... Can you hear that sound in the back? The vacuum? Okay, let me tell that person to turn it off. Hold on a second.
I really, really apologize for that noise in the back.
I asked my wife to stop, and I don't think I was very nice when I was doing that, and I probably am going to have to do some apologizing later on, but I'm hoping she stops very soon, and I really do apologize for that. (Laughs) Yeah, well, I don't think she'd be wanting to do that. All right. I'm hoping she stops very soon, and I really do apologize.
Maybe if I turn my... This way, maybe it makes it a little bit less, because it should be omnidirectional, and you should still be able to hear me. Is that better?
I really like that question, though. I'm going to try to speak maybe a little bit louder so you can hear me.
Yeah, she should stop pretty soon. She at least knows the urgency.
Okay, earlier it was better? Okay. So I'll just go get back to this. (Music)
So the question with the HAL and register level, I like that question because I think it is important to understand this, because... There we go. The hardware abstraction layer will allow you to change chips a little bit easier. In fact, it might actually be able to... Because I don't have any experience with this, but the way the HAL works is it works with the ARM architecture.
And it may not even matter which chip, which manufacturer you go with. It shouldn't.
Because the whole idea of hardware abstraction layer means that you shouldn't have to worry about the hardware. It is a programming layer above what hardware you're using, so it should just work with from one manufacturer to the other. I don't know if that's absolutely the case, but that's how I understand it.
But for sure, if you're doing register level, you'll be... Unless you're using... Let's say if a microcontroller has three ADCs on it, or three I2C's.
And you use the third one on a more advanced chip with more features, and if you try to go down like you need to save money on a lesser feature chip, and you're not using all the features of the other chip, you would have to change the program to use the I2C1 instead of I2C3, or maybe use the I2C2.
So that's the only place where you're going to have problems, I think, in my opinion, with microcontrollers, and also the clock speed. So if something you require needs more than 48 MHz, for instance, you'll have to work with that limitation as well.
How making programming easier? I think that's a little bit subjective, for me at least, because I learned using register level from the AVR series. Because when I learned AVR, and I learned the register level, I was easily able to get into the STM32 without a problem. I mean, it was like, switch the chip and learn just a little bit of the way that you work with the STM32, and everything else is easy. Understanding bitwise operations, shifting bits in registers and things like that, was relatively easy.
How, I think because I started with the AVR, I didn't learn how. At that time, I don't think there was a how type of layer that existed for the AVR. So, alright, so, yeah, and it might make the programming easier because you have, well, if you've learned how in the beginning, it's going to be easy. But you still have to know the commands, you still have to know what parameters that go into the functions, you have to know the functions, obviously.
And there's probably a lot of documentation, so it might be easier in that respect, finding information.
I do know that when you're getting into, like, using LLMs to program, it wants to show you how programming rather than register level programming. You have to explicitly say, please show me a program in register level, and it will show you that instead of the how base, but it always goes how first.
So, maybe that's an indication of where things are with the internet as a whole, because they're trained on the internet.
And Prenjal is correct in saying what's going on in the microcontroller, but I still think you have bit level ability to change bit level in how as well. So, I think both are probably good. I don't think there's any reason to pick one or the other. Both are fine.
It just depends, I think, on what you start with. And I've done how tutorials in the past.
Another thing is when you're learning from the data sheets, or when you're learning from the reference manual, you learn the register level, because all of the program examples in the appendices are all register level. They don't have any how programming examples. So, I was kind of forced to learn register level just because I was learning through the reference manual initially.
Yeah, I'm more apt to ask the LLM to program for me these days, because I like to... I think that's the way I learn from example, and that's the way I learned also from the programming references. Let me go ahead and change this display because it's kind of making me a little bit nauseous. I think I changed it to a6. So, it should just show the text and not the background. Okay, that's good. Now I can actually do a better focus on this. Alright, so let's change what's on the screen.
There we go.
Alright, that worked. All in yellow.
Alright, so what do you guys think about the idea of mixing in the ADC stuff at this point, or should we just wait until we fully explain what the OALED is doing? And if anybody wants a review, I can probably do a review of what we've talked about so far. Let me go ahead and do that. So, we've gone over the... Well, let me start with the main. I'm going to do this as quickly as possible. We've talked about the system clock config. We are running in 48 megahertz.
We talked about enabling the PLL clock to do this and the HSI.
Or the... Actually, what is it? It is the HSI. And the I2C initialization, we went over enabling the alternate functions for the two pins that we're using. Right over here, the 58 and 59.
Enabling it. This one I was unsure about what it was doing, but this is required because we're going into fast mode plus and I apologize for the dogs barking. My wife was outside. She was doing the vacuuming. And if she comes back inside, it's like the dogs haven't seen her in a year. And they're angry at her for leaving.
And in here, we're managing how fast the I2C is going to be communicating with the OLED display.
This OLED display apparently is able to communicate at 1 megahertz.
Yeah, I can't catch a break, can I? Yeah. And you know, it's... Oh, Jesus. They're getting closer.
Okay. So I was unsure while I was doing this... Well, I wasn't doing this programming. Claude was doing this programming.
But I was unsure at the speed we can... I could communicate with the OLED. But fortunately, I was able to do the fast mode plus and which is above 400 megahertz or 400 hertz, 400 kilohertz.
I was unsure if I could go above that because that's a... I2C runs either 100 kilohertz, 400 kilohertz or fast mode plus. And I'm not sure what fast mode plus, what the actual speed is, but according to Claude, at least, it's 1 megahertz. So I'm going with that.
So this is required for fast mode plus, and this is enabling fast mode plus and using the Sys configuration, which is enabled here.
Yes, 400 kilohertz. Yeah, 1 megahertz is the... is what is fast mode plus, I believe.
Right here is where we're enabling the I2C, and we also talked about the write command or the write function, where it's using the address. It sends the address along with the data, and it specifies the length or how many bytes, which in... if you look at the reference manual, you'll see that that is a specification within that register for the control register.
You can specify number of bytes, and it does everything essentially automatically. You just have to specify the length, making sure that you have a loop of that number of bytes, and it will automatically, essentially, transmit those bytes over the I2C lines.
I did not add resistors, pull up resistors between these two lines, and that was a question in the beginning, because there... we already examined the back of this OLEB, and there are resistors already pulling those up. And I believe there are 10K resistors. Generally, what's recommended is 4.7K, but even in my past experiments, when I was... when I was connecting the accelerometer of like three or four years ago, accelerometer through I2C, I think it was actually about six years ago, I used 10K resistors, just like this one is using.
Okay, let me read the comments. Bob says... oh, you're talking to Pranjal. Okay, yeah, nothing new here. Still don't have any chat in Twitch, so not capturing anybody in Twitch. I just put in the schedule for Twitch and to see if that made any difference, but nothing... Okay, so... so we've gone through the write, the OLEB command, which we're going through right now. So since we've already looked at the OLEB command and how that works, and it uses the I2C write, we started going through the OLEB command, but we took a break from that, and we looked at character creation.
So we started out with how to create a character, one of the ASCII... one of the characters in the ASCII character set. And by the way, does anybody know the... what that acronym means? A-S-C-I-I? I knew this when I was like 10 years old. It's funny. When I was programming BASIC on the model 1, TRS-80. So this is how we determined how to form a letter. This is the letter A, actually. And it took a few iterations, but we figured it out. The first one was kind of gibberish, then the second one was upside down, or mirrored, and then the third one we got right. Yeah, ASCII. American Standard codes, I believe, for international interchange. I think that's what it is, if I remember correctly. As you can see, I'm not looking it up. That is completely useless information in my brain. Yeah, American Standard code for information interchange. I always thought it was international, because it does have international capability, but yeah. Information interchange. Yeah, I think I remembered that too. Oh, you looked it up. I was close. The information I didn't get right.
All right. So that's the review. And then what we did was we did experiments with this. We would change these values to see what happens with the OLED, and we're continuing with that. And the last one we did was the A6. We tried A7, and it inverted the display. But Claude gave us some very obfuscatious information here, which just says set normal display. And that was not very helpful. So what is this set multiplex ratio? I haven't seen anybody say anything about wanting to go into the ADC stuff in this, so I'm going to go ahead and continue, unless somebody says otherwise. So set multiplex ratio. And that is also very not very clear, not very lucid. So let's take a look and see what we can find on the data sheet. So I'm going to bring the data sheet back up. This is the SSD 1306 controller. And if anybody wants to know, that's the controller that drives the display. It's not the display itself.
It seems like it's out of focus.
That's better.
Okay, so let's take a look at what was the number here. It's A8. So what does A8 do? See what the actual definition is.
All right, here we go. A8.
I hope that's a good enough review for you.
So set multiplex ratio. Set MUX ratio to N plus 1 MUX. So it looks like there isn't any variances here. You can't change the number. It's like this is what you get. So that's not something we can actually change. So let's see what the more explanatory explanation is. Yeah, so it looks like that's the only value that it will accept anyway. So do we actually need it? Maybe it's already default. We may be able to just turn that or just like not use that at all and see what happens.
This command switches the default 63 multiplex mode to any multiplex ratio ranging from 16 to 32. So there must be a command right after that. Okay, so this is it right here. So this is setting that ratio. So we have one 64th duty.
I'm wondering what that duty is a duty cycle. What is that? So 16 to 63. So 64, I guess is the max. Yeah, the SSD controller on the back of the OLED. I think that is yeah, you can't really see much back there. It's extremely thin, but you can see this, this set of cables generally on a let's see if I can find one. On a standard. And this is a see if I can get this as much on camera as possible.
This is a standard LCD display. This is a 20 by four. So you have 20 characters by four lines. And on the back, you can see there are a bunch of chips. And there may be some more stuff in between, but I don't think there is. But this is generally the one of these is the actual processor. And the processor, it starts with an H. I can't remember what it is.
But you look at the data sheet for the processor rather than the data sheet for the display because the size of the display doesn't actually matter. This is just RAM. The display is just memory addresses. And it's non volatile, I believe.
So when you set it, unless you you turn it off and it'll disappear. But while it's on those that RAM stays on there and you can change the RAM addresses that's on the on the display. So if you had like a 16 by two or 20 by four, the addresses are actually the same. It's just where like you have a starting point and you just keep going and you may have characters like off the edge that you don't actually see. But it's still, you know, just because the display doesn't show it doesn't mean it doesn't actually hold it in their RAM. Or it may have internal controlling that doesn't allow to use that particular memory address. But probably the former, not the latter. The I squared C multiplexer. That's a good question actually because how does it convert from the SSD 1306 controller to I squared C and I believe the ice the SSD 1306 should have that built in already. Because the this document here already has commands for the I squared C and it shows information about I squared C. So I believe that's an option for this this specific controller, you could use this more like bitwise type of cable to program it. And you can see on this page, you can see the data zero through seven. That's very similar to how an LCD works.
So, you know, you have the data pins, you have all these pins here and seven or eight of these are data pins, just like these eight here zero through seven. And you could just program it very in a very similar way to an LCD.
All right, so that's probably more information than why I need to say about the controller on there. Okay, so this command switches default 63 multiplex mode and I have no idea what multiplex mode even means to any multiplex ratio. If anybody knows what multiplex means, let me know.
So what what happens if I do change one of that value right now it's 164th duty. So three F is what what does three F mean and binary or in decimal, actually.
So let's take a look at that.
Yeah, this is the one I was using before. And we get advertisements at the same time. Look at that.
See if I can bring that down. All right, now you can't see the advertisements.
All right, so let's take the heck number of three F it was it was three F. Yeah, three F. All right.
So that's 63. Okay, so what would happen if we change it to 1610?
So what would happen if we change that to 10? What does does anybody know?
Yeah, it's 128 by 64. That is correct. This display is 128 pixels across 64 pixels down.
All right, I'm about to let me get closer, see if we can see anything interesting.
I should probably put more more text down here just in case something happens at the bottom. Okay, then the 164th multiplexer displaying one of the 64 rows at a time.
Okay, but what is what do they mean by 164th duty or what does Claude mean by because to me duty seems like duty cycle.
So that's confusing already, you know, so let's see what happens if we let's I'm just gonna go ahead and press the play button and see what happens. So yeah, I want to put more information. So what else should I put in here?
I was thinking about putting the names of the people in chat, but I don't know if you guys are okay with that.
Where is this? Okay.
I love Bob. Yes, let's do it.
For sure. Okay.
Third line.
All right, I got a ha ha there. I can't do faces, but we could we could always create the emojis.
But that would take a little while, as we know from the previous previous session.
five? All right, what should be what should be on line number five? I will put out a fruit there. I like out of fruit.
Give them a little bit of a shout out.
I've always looked up to that company. They've been around since 2005. I started 2007. We kind of have a parallel upbringing, I guess. They're far more successful, obviously, than I am. But I've always looked up to their their stuff. They have so much information.
It's just a beautiful company. All right, so funky bitmaps. Okay, we have to one more line to go, I think seven.
So 01234567.
Howdy.
And I'll just put howdy because I know you're saying hello to.
JJ or Hehe. Or Ha Hehe. I think it's probably Hehe. I don't know if I'm mispronouncing your name. I apologize profusely. Welcome and thank you for coming in and enjoying the the live stream. Okay, so I'll do howdy.
Okay, I'm just randomly trying to put stuff on the display. So let's see what happens. Did I change it to 10? I did, didn't I? Okay, so let's see what the 1 16th duty or 1 17th duty because it was 1 64th before. Okay, look at that.
It starts at the oh, this would be interesting to play with if I put this in a loop. And I wonder if it will update on the fly.
This may not be one of those things that updates on the fly. You have to do that. You have to do this in the initial configuration. But it will be interesting to see what happens if I put this in a for loop and change it.
Or change it as a for loop is going on. So I can put it in this main loop here.
So let's attempt to do a for loop and you know how these these go with the me programming in C C++ fiasco train wreck.
Alright, so this is the command. I'm going to put this here because obviously I think I need to set this up first and then specify the the duty.
Whatever that means.
Alright.
Yes, very, very, you know, these things only cost what, five bucks. If it blows up, it blows up. It'll make for good content.
I've never developed on the nuclear board, but it's not going to be any different from what I'm doing here. You're still with a nuclear board, you're still
programming through like an STM or ST link type connection. I don't believe it's through.
It might be I know if it's if it is not through an STM or ST link. The ST link may actually be integrated on the board. I'm not really sure.
But it's pretty much the same thing.
Yeah, no big loss. Even if I blew up my entire system here, even this chip, it doesn't really matter. I don't care.
It's fun. It's fun. It's fun experiments. This is what this channel is about experimentation.
Okay, it does. Yeah, so on the board, it has the ST link on it. So that's my guess was right. Cool.
Alright, so who knows who remembers how to do a for loop? Let's see. For open-clothes parentheses, you have two semicolons. We have the ST link. So who remembers how to do a for loop? Let's see. For open-clothes parentheses, you have two semicolons. We have the initialization of a variable. And I'm going to initialize it to zero. At the end, it's the step. So we can increment it by one.
As long as i is less than 64, but it actually has to start at 16, doesn't it?
And then I'm going to use the brackets and copy this stuff inside and then make this I. Does anybody see a problem with this?
Except for the wild spacing.
Feranek, thank you for coming in. Hello, how are you doing?
All right, thank you. Oh, yeah, there you go. Bob, thank you for the for the example code. Appreciate that.
I think I'm getting better as I do these live streams. I'm going to start getting better at like programming this stuff because I am quite rusty.
I mean, I've been having to focus on on CNC stuff for such a long time that a lot of this programming stuff and also I program C sharp. I my entire website is based on C sharp programming. I have probably many thousands, probably 100,000 lines in that program.
Yes, let's see. Let's use a delay. You're right.
Delay milliseconds. I believe I have that as a. Yep, it signed up as a as a bright yellow. So it looks like it looks like it would be right.
So I'm going to do 300 milliseconds. That should be should be good, I think.
We should get from 16 to 64 pretty fast.
All right.
Are we ready? Do you see any problems? I don't see any problems.
Here we go.
We are running.
Oh, look at that.
It's unfortunate we have to start at 16 though.
That's pretty cool.
You can see the the yellow up here.
What if we attempt to go from one to 60 to 64 to 63 or from zero to 63.
So does multiplexing make any sense in this case, the word multiplexing? To me, this looks like the start line.
And if I was going to explain it in a data sheet, sure, an engineer would be able to explain it.
He would probably want to use the right
want to use the right terminology.
It's very esoteric, but
there should be some, you know,
maybe that's the weed out. Maybe that's the weed out.
You know, to keep people from from doing from entering this stuff, like unless they have a college degree.
Huh.
Power saving.
Yes, because the in the data sheet, it specifies that you can only go from 16 to 64.
So like over here, 16 to 63. Let's widen that gap. Let's go from let's go from one. I could go from zero, I guess, right?
And let's just see what happens.
What's the worst that can happen?
Okay, let's try. I'm going to go with 63, 32 to 63 first.
And go with what Bob's Bob states.
Let's try it. Well, it's just going to start from the middle, I think.
Yeah, it'll just start from middle. So it looks like it's starting from the 16th line and going up to the 64th line.
That's why I kind of want to start from the number one line and see just to see what happens.
Does anybody have any predictions?
See, doesn't that seem like multiplexing doesn't seem like the right word for this?
All right, let's try it.
Check that out. So is the data sheet wrong?
I'm going to go faster. I want to see what it looks like going a little bit faster here.
100 milliseconds.
And I'll start from zero as well on the next try.
Okay, so I mean, we could use this could be used as a as a reveal. And it's good to know that these commands can be changed. This command can be used on the fly. So like the ones we tried before, we couldn't do that. Or we didn't. I didn't know how to do that. So but we tried and it didn't work. So that was a fail. But this is a success. I think this is a win.
I wouldn't call this multiplex. So I'm going to change the
comment to start line.
Because this multiplex ratio just doesn't seem right.
This will probably also depend on see, look, this is set display start line. So and we were not able to get this to work correctly.
Yeah, that's a good idea. Okay, let's do that. Bob is recommending it's good recommendation to leave the initial comment. Set multiplex ratio. And then this is the duty cycle. So and I'm using a preposition on the end of my sentence. I shouldn't do that. I'll keep it there. Okay, so one, wait, what was it? It was three f right? Three f equals one 64th.
Duty.
What language is the Oh, yeah, it's, it's G code. G code. This is a comment, by the way. It's useless information. All right. I want to make it a little faster. I also want to start on zero to let's go with 50 go twice as fast. Look at that. That's nice. And it's smooth to it's almost as if it's using a frame buffer to do it. Like, it's like the RAM doesn't, you still have everything in RAM. So it, it doesn't need to redraw anything. All it's do all it needs to do is, is adjust that one command and you have a nice flowing thing. I didn't see if it started zero, though, let me
Hey, CNC, how's it going? Thank you for coming in. We're doing some more experiments and we have, we found that a very obfuscation set multiplex ratio actually means what line to start on. All right, so I'm going to slow this down a little bit because I want to see if it actually starts at zero. Like you have kind of a blank screen blank screen at the at the beginning. Yeah, it's, it's, it's interesting, like trying to understand a data sheet. It looks like it starts still at one, it doesn't start at zero. Understanding a data sheet, the esoteric language in a data sheet. These experiments that I'm doing, it's revealing more of like an understanding of what that what those esoteric language is. So it looks, if it looks like if I start with one or start with zero, it really doesn't matter. If I go above 64, will it go over its 64? Maybe let me look at the data sheet. It may not have that many bits actually. It says the maximum value is 63. But if I go more than 63, will it even go farther up? That's my sort of question. Because it's just RAM, right? I'm just writing to RAM. That's all I'm doing. You think it's errors in the data sheet? You think it's errors in the data sheet? The two top rows are yellow. Those are actually 16 lines or two, two lines of text to two lines of eight bit high text. Those are yellow because this specific
display is used in a scenario or application where the top might be some
status, a status line like a battery indicator or maybe it shows how what signal strength it is or whatever. It's that kind of application. And I just bought this a long time ago. I don't know. I bought it, I think just to do experiments on and I didn't know what I was buying at the time, but they have white versions. They have blue versions. They have the yellow and blue version. They have a yellow version. So there's a bunch of different types out there. I think the next time I would do it, I'd probably just get the white or maybe the blue. It kind of bothers me that the yellow is at the top because I'm not able to like
it seems too restrictive to me.
Yeah, that's true. I don't know if this is an error in the data sheet or it's just esoteric language. I am kind of citing on the fact that it might be an error because this doesn't seem like what multiplex would do. Multiplex in my understanding would be putting multiple signals to one source, but not being able to read each signal at the same time. But I could be wrong.
Oh, there you go. Yeah, Peter says, and welcome Peter. Thank you for coming in. When Doom runs on it, you can have the yellow area for health. You know, that would be so fun to put Doom on this. That would be like a longer term project. I remember the Prime, Prime Aegean, he had Doom running on an ASCII based screen.
Like the whole screen was...
The entire screen was...
Like you saw the image with an ASCII character set. And he had a thousand players on the internet run Doom and try to complete Doom all the way to the end. And all of the players at the same time trying to tackle that.
So that would be cool to run Doom on this little tiny display. I'm sure it could be done. You know,
the microcontroller here is more... It's probably more powerful than the computers used at that time. Like the Coco computers or the Apple computers or the... Wait, what was it? Well, it was IBM actually. It was IBM clones at that time. The 8086. The 8286, the 8386 maybe. Yeah, I should probably look that up. Maybe I could find the code for Doom on these displays for the STM controller. That would be kind of fun.
Alright, like so also the data sheet... Where was I?
The data sheet also got the values wrong for that.
For 16 to 63, we can go all the way from 0 to 60. Oh yeah, let's increase the number. That's what I was going to do. Yeah.
Alright, so let's go instead of 64, what would happen if I went to 128?
I don't even know if that register can hold a bit... A word length that large.
What is the maximum for 8 bits? That's 255, isn't it?
Okay, so Doom started at the 386 or 486s. Yeah, probably. Peter says, "Multiplux addressing is an addressing scheme used in various types of LCDs where one or a few rows of an image at a time are being addressed sequentially until the entire screen is painted.
Does it make sense in this scenario though? Like when I change the value, it shows the start row essentially.
So does that make sense with the multiplexing? Yeah, it doesn't explain the scrolling. Yeah, for sure. Yeah. Okay, so Franek says, "Yep."
Bob says, "released on December 10th, 1993 for DOS." Oh yeah.
Disk operating system. It's the first installment in the Doom franchise. Yeah, MS-DOS. Is that zero base or one base?
Don't know. Well, I think everything here bitwise, it's zero based. So zero to seven because there's eight data lines, so zero to seven is eight bits. So I'm thinking that it's, I think eight bit is 255. So I'm going to try 128 and see what happens. I'm going to see if it scrolls all the way. Just to see if the RAM is going to work that way. So let's try it out.
Let's see if we get some explosions. Any magic blue smoke?
Oh, I should make it faster too, shouldn't I?
Let's see if I can do this before it happens.
I made it, I think. Yep. Stopped it in its tracks.
Here we go.
Nope. But did you notice that it, now this becomes 64 to 128?
We should probably put the number in there, shouldn't we? Like the top row should be the number.
The scrolling is the reconfiguration of the MUX value. Okay. So then MUX is correct.
Even though it's esoteric, it's probably the correct terminology.
All right, so let's try, let me attempt to put the number in here. Remember on, was it Monday?
I didn't have such a good time doing that. So let's do the car.
Well, no, it would be a, yeah, car buffer, right?
Who knows how to do this? Is it a, it is a address? And we use the sprint F.
And I remember there was, we had buffer in here. We had number of, oh yeah, this is an array actually, isn't it? So this is 10. This is not, this is still an address.
Oh, and I got a person made a comment yesterday that his brain was hurting because I was mixing C and C++.
And I got, I have a, I don't know the difference between C and C++ to be honest with you. I just learned this stuff as I go and I've never really learned the difference between the different functions of C++ and C. So I just use it as I go. And I, and if, if I add C++ stuff in here, I, you know, I don't even know why I'm doing it. Okay. So I guess the value I should put in here as well. Right? So I think it's, is this the way it is?
Okay. So car, oh God, I can't read that.
Okay. It is, it does require a pointer. So that's the first thing.
Yeah, this is, I don't understand what this is doing. This is probably one of many versions of this.
Okay. So I see what you're saying here. All right. So, can I actually copy and paste?
Let's see. This is what, this is what Bob put in.
All right. So, okay. Okay. A plus I.
Okay. So this is the format of the string. This is the buffer. Right?
And this is what we want it to.
Okay. All right. Well, I'll keep it this way. I don't know what C is. Is this car, this is a, I guess characters.
A string of characters I'm thinking, right?
Okay. Take Peter's line.
I hate when it does that. All right. Let's put this in the right place.
I like it. I like it. Let's take mine out. That was close, right? I just had something mixed up. The, the, I was over here and the, yeah. Okay. So value. So this is for me. I'm just going to copy and paste. I just had something mixed up. The, the I was over here and the, yeah. Okay. So value. So this is formatting the string here.
And then this is where the eye is going to be placed.
This is specification of I, of the variable. And then this is the buffer. And I, and I don't remember if this had to have a, an address or not, but we'll find out because we'll probably get a warning. It'll complain to us.
We'll see. All right. Peter says no difference between C and C++ here since C will generate work if you compile it as C++. All right.
Sprint F damn spelling correction. Yeah. I would have, I probably wouldn't even have noticed. Wouldn't have noticed. All right. So I'm going to,
it's going to overwrite all of this, isn't it? When I do that. Yeah. I'll keep this here. It'll just, it'll probably just overwrite it as it goes up. So let's see what happens.
Let's see if we're getting complaining. You probably do. Yeah. It's still working though. Just like last time. So the complaint is,
Oh, it's not actually showing it. So what's the complaint? Incompatible, implicit declaration of built-in function Sprint F. Okay. I think we still need that address because it's, it is an array. Or should I be using an array here? Maybe this could be just a pointer instead.
And we just not use an array at all.
Skeptic says, it's normal. You can turn off warnings, but I don't remember how I did it in Atmel Studio. It doesn't really, yeah, it doesn't matter. I don't like the warnings. It's, it's kind of a, you know, it's like an OCD thing, I guess.
But we're not seeing this anyway, because we're not printing it out. Are we? We're actually not printing it out. So we need to actually put it somewhere. So I'm going to keep the set cursor zero, zero, and I'm going to put buffer here.
Does that look right? Let me see if this actually works.
If it takes away, no, it doesn't.
Okay, that worked. All right. Look at that. It works.
Okay, so 64 and then it goes up to 128.
Okay, so now we understand. So let's put this to 255 and see what happens. Because it should go, it should continue on as long as the, there's sufficient RAM, I guess.
And I guess that would be available if the display is larger. So I guess you could have displays that are 255 lines up and down. Yeah, so it's just continuing.
So that's an interesting experiment.
Oh, look at that. It keeps going up. What?
That doesn't make any sense.
Oh, no, no, no. Okay. I see what's going on. It's not, it's not erasing what was there before. Okay.
Yeah, it's, it's overriding the old value and not showing everything that made me think that it was like, why is it going over 255?
So what I would do is I would put a character here.
Or I could actually just do this, right? Oh, no, shouldn't this override it?
No, I wouldn't work with it. I would have to do this, actually.
Right? One would think that it would be overwritten by this, this whole line.
It has a hidden RAM. Yeah.
Yeah, see this space, I can't do it because this is the actual, yeah. Okay, so if I, if I just create a space on the same line and then show the buffer and then it has the delay, it should be a little bit different. Yeah. Okay, so if I, if I just create a space on the same line and then show the buffer and then it has the delay, it should show this, you shouldn't even see what this is, what's happening here. So let's go ahead and try that.
And you can see also it's, it's keeping, well, it's keeping these values, which is, it makes sense that it's doing that.
It's actually flashing. Done. And it is not doing anything.
Oh, wait. Should be double quotes.
That's a fail.
Let's try it again.
Oh, a space after. Yeah, that could be, yeah, I could try that too.
Okay, so well, it's probably going to work anyway. Yeah, you can see that it's going up to 255. Well, this one won't, but this one will. And then the next should show, yeah. Okay. So let's go ahead and take that space out.
And we'll put a space after value.
I still have that complaining. It doesn't matter if I even have the, the address.
And do I, I don't need, if I use the address, I wouldn't need the, the array because it's just a pointer in memory.
All right, let's see what happens here.
255. Yep, that worked. Nice CNC. Good thinking.
Okay, so you were saying, Bob says before the sprint F mem set. Yeah.
I remember using that a while ago. What?
Just before the sprintF?
I can't remember what mem set does though. I can't, it's been so long since I've used it.
Now that also has, it's also complaining.
Or is this the erasing of the, is this like garbage collection?
Oh, skeptic. Okay. Skeptic said it.
I remember, remember skeptic saying something about a space, but I don't know if it was before or after. I thought it was before it, but yeah, and after is, is the perfect way to do it. All right. So this is complaining as well. So I, you know, I don't know what this really does. I guess it is a, I thought it was a, wait, this was specifying memory for a buffer, isn't it? So you don't overwrite crucial information in the memory or addresses.
Yeah. Okay. All right. So let's move on to the next thing. I don't really need this one and I'm not going to worry about these changes. I'm just going to,
we know what this one does. We'll set it back at the 1 64th duty,
which was 3F I think.
And we'll maintain that. So let's see. Now we have disable entire display, disable entire display on that doesn't make any sense at all. So let's take a look at what F4 or A4 does.
There's a three.
A four, a four and a five. So there is an option.
Resume to RAM content display reset.
Output follows RAM content.
A five entire display on.
Output ignores RAM content. Oh, that's interesting.
So the RAM content is the content is the stuff on the screen. So we could actually use this program we have here and see if we can essentially erase the RAM.
I'm thinking that's what it's going to do.
I am, I am including STDIO I believe. Let me see.
No, the standard lib because I'm using the ABS, the absolute value. And the pixels.
So that's why I'm using the standard lib, but I can do the STD I O as well. Let me, let me go ahead and try that just to see if I can get that warning away.
Okay, not complaining. That's good.
Oh, and this right here, it's good to know that you can also use this instead of main.h. You don't have to use the header file in main. You could just go straight to using this header file if you're just doing register level stuff.
Forgot to mention that a long time ago.
All right, so I'm going to keep it this way. I'm not going to change that value yet. I want to see what the, see if I can get rid of this.
No, still there. So maybe it'll give me more information. No, it doesn't. Oh, a terminating null past the end of the destination. Oh, I see. That's why we use the memset, isn't it? So you're specifying the number of, you're, you're, what is it? What is it?
You're reserving those numbers of bytes in the memory for that purpose, the size of the buffer.
Yeah, so that's why we're using the memset. That makes a lot of sense, but it didn't, still didn't work, but we can also put it back in there maybe.
I'm not sure if this is really interesting to do.
(Silence) So this is reserving 10 characters for buffer. 20 is what is being put in there. Is that what, is the value of, that's, what is that? That's a space, isn't it?
Yeah, that's a space. That would be 32 in decimal. I'm not sure. All right.
Or increase the buffer to 20. Okay.
Well, I could just change this to like 11 maybe. So we go past, we reserve one more character than, because there's always going to be a null character at the end.
I'm not sure if this is zero based. Okay, it's still,
made by determining null past the end of the destination.
Okay, well, I'm not sure if I'm going to continue with this, but this is essentially a, this is not, yeah, this is, I'm not going to continue with this because this is really not interesting in the experimentation realm.
But offline, I'll probably look this over, maybe even go back to my old tutorials and see what I said about it.
Because I know I got into it and I also explained what this means, but I just can't remember it anymore.
All right, so let's take a look at that other command. A4, so A5 was the other one. So if we took this and put it right before and used A5, would all of this disappear? This is what I'm getting from what this means. So let's see what this does. But I'm not going to, yeah, I want to do that because I want to see if these characters remain.
Okay, Peter, just need to make the buffer a few bytes bigger than 10. Yeah. Since with the three digit numbers, you're potentially writing up to 11 bytes. Oh, that's true. Wait.
That's 9, 10, 11. You're right. Yeah, I could increase this or I could just take value out.
Springfield, they're eating the dogs. They're eating the cats.
My son doesn't know that I'm live streaming. All right.
I'm going to put a space before it anyway, just to see what happens. I don't want to do this. I want to see if this complaint is gone.
I'm still confused about this address, if I should even use that or not. Nope, didn't go away.
Still works though. Both ways it works, which is interesting with or without the address.
Because we saw that it was a pointer. A pointer is required here, but it still works. Oh, wait. There's no more.
Huh. There's no more warning.
Check that out. So, Peter, you're right.
This value was too wide and I made the mistake of using the address for the buffer.
Thank you for the help. All right. So, let's see what this does.
Who thinks it's going to erase what's in the RAM? If it's going to erase this stuff, because that's what I'm getting from the datasheet.
Yeah, Bob. All right. Yeah. I know. I think I saw something. Here are the dogs.
Hey, Kiki. I am live streaming at the moment.
Oh, okay. Sorry. Okay. No problem. Bye-bye.
It's going to take probably four or five weeks of me doing these live streams before they understand that this is my routine now.
Yeah. Bob, all of my chats are genius. In fact, hold on a second.
Well, we already say that we love Bob. So, he's gotten praise there.
So, what we'll do is here, we'll put...
Peter is a genius. Well, I'm going to uppercase that.
All right. So, let's put it on there. You know what's going to happen?
With this, you're not going to be able to see Peter is a genius anyway. Probably. So, let's see what happens.
Here we go.
Let's see if anything explodes. Oh, look at that.
That's interesting.
But it's not showing anything. So, you can't even see the value being written.
So, let's look and see what it actually means, what this is doing.
Entire display on.
So, this just means the pixels are on.
And ignores the RAM content.
So, it doesn't really care what we put on there. It only just turns the pixels on.
So, is this... Why would they even put this command in there? Would it be for testing purposes? A4 command enables display output according to the GDD RAM, which is the RAM of the display itself.
If A5H command is issued, then by using A4H command, the display will resume to the...
Okay, so you have to use this first and then A4 afterwards.
It will resume to the GDD. So, I can probably change this on the fly and put this right after the A5 and just see what happens in that context.
In other words, A... Oh, look at this. The data sheet says, in other words, like it's trying to talk to us in layman terms.
That's funny. A4H command resumes the display from entire display on stage.
So, are we using the A5 in the beginning? Like it turns the display on or something?
No. So, this is the first instance of that command.
Alright, let's continue reading here.
Yeah, I was thinking of maybe a pixel display test, but I don't know.
AH5 command forces the entire display to be on regardless of the contents of the display data RAM. So, let's put the... This is probably just a useless experiment, but...
Let's add A4 here at the... Right after A5, just to see if we can use this on the fly.
Interesting. So, it has to go... Wait, let's see what it does when it gets back to zero.
Huh. I didn't see anything different.
So, the A4 is just going to override the A5 command. The A5 is just a pixel test. If I didn't have this for loop here and I used the A5, the entire display would just pop up. It would just turn the entire display on and wouldn't care what's in the RAM. So, it's kind of like a clear screen, but it's kind of an inverse clear screen, I guess.
Peter, haha, no genius. No, you are a genius. Everybody's a genius in my chat.
What did the English say? You guys are legends, and it's true.
I actually wouldn't have been able to do a lot of this programming without the chat helping me right here.
Alright, so this is like... Who cares? We don't care about what that does. We know now. So, sit display offset. Alright, so what is this? This is interesting.
So, what is D3?
I should just go into this area right here instead of going into that other...
Alright, so this is the start. D3 right here. This is a double byte command. Okay, well, the one we were just doing with the previous one, the duty cycle,
multiplex was also a double byte command, and it didn't actually specify that. The second command specifies the mapping of the display start line. Here we go with the start line again.
To one of com0 to 63. Assuming that com0 is the display start line, then the display start line registers is equal to 0. How many different start lines are we going to see in this command set? For example, to move the com16 towards the com0 direction by 16 lines, the 6-bit data is up to, I think, 64.
And the second byte should be given as 010000 to move the opposite direction by 16 lines. The 16-bit data should be given by 64 to 16. So the second byte would be 100000 and then 0B. The following two tables, table 10-1, 10-2, show the example of setting the command C0H and C8H and D3H.
Alright, let's take a look at the... does it have a... yeah, table 10-2. Oh, this is clear.
Alright, this would take me a little bit of time to understand here. Okay, so this is 10-1. So we see this is just repeating, I guess. I'm not really sure.
And this... why does it show different values here?
Alright, so my interpretation is...
... specifies a mapping of the display start line to one of com0 to com63. That sounds like it's just the same y-axis stuff we're playing with now. Alright, so let's see what it has in the...
Okay, so no offset. So this could potentially make it go down from the top going down. So that would be the offset from line 1 and would travel downwards, I'm thinking.
Yeah, maybe you're right, Peter. The mutz value is a side effect. So I'm not using this in its intended way, I'm sure.
Like, you know, the experiments show one thing, but I'm sure the intention is another thing. So let's go ahead and go back to... I'm going to keep the for loop. I'm going to replace it with that new offset idea.
So what I'll do is I'll offset it from 1 to 63, so I'm thinking that it's going to move down.
I'm not going to put the... I'll just comment this out.
And we don't need any of this, actually.
We're just going to put those two commands in there.
I'll keep the delay in there, though.
So let's go back and get those commands.
By the way, I am feeling a little bit lightheaded. I have a feeling it is a consequence of live streaming and me not completely used to live streaming, and I am not breathing. So I'm going to take a moment every now and then to breathe.
All right, so the D3, this would be the I.
In fact, I'm going to go ahead and get a drink of water one moment, so I can...
Shake it off a little bit.
Oh, yeah, I know.
All right, I have a drink. I feel a little bit better.
Okay.
Deep breath. Yeah, I need some intermission music. That would be nice.
All right, so we are going to put... We're going to specify the D3, which is a display offset, and then we're going to increment the offset.
Bob, we went down a rabbit hole for sure. We're always going down a rabbit hole in this one. Experiments tend to do that, assuming that you're referring to this. Look where the MUX ratio is mentioned in the data sheet. I did, yeah, we talked about that. It was not clear to me what it actually meant, because it had 1 64th duty, and to me that doesn't make any... Duty cycle is like... that's where I usually hear it. So...
Where was that? That was in... here. Okay, so it doesn't really have that much information here. So it has this command, "switches default 63 multiplex mode to any multiplex ratio ranging from 16 to 63."
The output pads, COM 0 to 63, will be switched to the corresponding COM signal. So that just isn't clear to me. I don't really understand what it's saying.
I fought the law and the law won. Yep. We need a Monty Python style intermission. That would be really cool. With the animations they have in the background.
Yeah, my dark sense of humor might offend. No problem over here. We're all adults.
You have 64 lines, so how many lines of 64 is duty?
Yeah, still it doesn't mean much sense to me, you know? I'm still kind of not understanding that. So let's try the offset. Alright, so we have this information, and we will be offsetting one line at a time. And I'm thinking it's going to go down. So who is with me, or who thinks it's going to do something different?
Ah, check that out. I like that. This is a scroll.
That's interesting. I love this. So what it's doing is it's just scrolling the G-RAM.
Let's go faster. Let's go 10 milliseconds.
You should see this in like... By the way, in about a month, my kits are going to include these displays. So if you don't have the kit, and you're wanting to buy a kit, wait for about a month, and I'll add these in there.
Because looking at this off-camera is so much more vivid and bright and beautiful.
You know, it would be interesting to change the text as it's scrolling.
This could be... What would I use this for? Or what would the application be?
Alright, so the offset doesn't really explain what it really does.
So I'm going to... And you know what I should put in here? I should say it can be used on the fly.
So I'm going to put a little bit of an explanation here.
I'm going to say... That means it can be used in the while loop.
We couldn't get this to work on the fly. No, we could. Yeah, we could actually, couldn't we?
Set the memory addressing mode. I think we could.
Alright, and we could... Yes, we could use this on the fly in mirrors.
We could not use this. Set display start line.
The contrast we could use, but I'm going to say not much contrast.
Mirrors horizontal. Yes, we could use this on the fly.
This we could use on the fly. Yes, yes.
Yeah, we could use this on the fly and A5 turns on all the pixels.
A4.
Oh, this would be really cool to have chat on here.
Now that would be something that would take a little while to do. Because I'd have to connect this to Wi-Fi and somehow find the right URL that has the feed for the chat.
Okay, so Bob is asking what's the new schedule for the live streams? The live streams, I do a live stream every single day, one o'clock every day. Tuesday and Thursdays is CNC related stuff. CNC experiments, I should say. Because every live stream I'm doing here will most likely be experiment based or tutorial based. But mainly it's going to be experimental in nature.
I believe that live streams, they have, it's more interesting to show a live stream on experiments rather than me just explaining how something works. I don't like doing that and I think experiments also help.
It sort of teaches you at the same time. So you're learning and getting some kind of entertainment at the same time with the experiments.
So Monday, Wednesday and Friday is dedicated to only the microcontroller experiments. And Tuesday and Thursday are CNC experiments, all happening at one o'clock eastern every single day.
Weekdays, unless there's a hurricane during hurricane season or potentially holidays. But like last or on Monday I went ahead and live streamed anyway because I'm trying to make this routine so I may still work on a holiday.
And also for the beginning of these live streams I figured holiday would be a good way to get new eyes on the live stream.
All right, let's see.
What I want to do, I want to actually make it a little bit faster. I want to see what having no delay does.
The 10 milliseconds is very small.
And this may actually, I mean everything I put in here is going to delay like however many clock cycles because the command has a number of clock cycles built into it because of the right and all that other stuff.
So let's go ahead and try this.
Yeah, so do I Bob.
Oh, look at that.
On camera it's garbled.
But when I look at it, it looks pretty smooth.
With my eye, but it is fast. It is super fast. Let me see if I can put this out of focus. Maybe you can see what I'm talking about.
That's still not really that good.
But you can see how fast the, what we're going to be able to do with this display. You know how fast we can refresh this display because the ADC, those are spikes and they happen extremely fast and I have to capture them.
So it'll be interesting to see if we can actually see the spikes, but I don't think they're all going to be captured because the display is still going to be a little bit too slow for that.
Bob, you must be on the west coast.
6pm UK time. That's good. All right. Yeah. I also mentioned this in the previous livestream. I'm changing to one o'clock because I want to capture as many European eyes as well and as many eastern countries as possible. I know I'm not going to capture Australia probably because they're probably sleeping.
But Australia has, they've been, that's been a pretty big customer base for me and also viewer base.
Yeah. Start time. Yeah. So one o'clock is for eastern is good.
Okay. It is three minutes until three o'clock. Anybody have any last requests on what I would do here?
I'm going to slow this down so it doesn't cause any medical issues for anybody.
Okay. So this is at 100 milliseconds. This is pretty nice.
Oh, that's cool. Yeah.
That's a really, really good idea. What I can do is I can,
I can add some buttons for input on some of the GPIO lines.
And I can, while I'm talking about OLED, I can add a couple buttons to play with buttons and talk about inputs and see how we can have some interaction,
physical interaction instead of programming interaction.
Oh, that is good. What? Wait, wait, hold on. Let's, let's do that. And we'll, we'll end with that. We'll put the Star Wars theme.
I don't know if I, could I go farther than seven lines in this case? I don't think so. Can I? We could try it. Let's see if we can put one more line.
Just to see if it goes over the gram and see if the gram will allow that to appear when it's scrolling up.
So we'll call that No Man's Land.
Let me go a little bit closer.
And while I sign off, I'll be putting in the, the, the lines of the Star Wars intro in a galaxy far, far away.
All right, let's try it out. It's funny, I'm getting that warning because of the buffer and I'm not, I'm not using it.
Oh wow, it does. But it goes over the first line.
So I could essentially keep adding lines and it will, it will scroll and you, it'll show as a brand new line. So it would work.
Did it start out with that way though? Let me, let me reset it.
I can't really tell.
Let me reset it one more time.
No, it covers it up. So I'd have to, I'd have to add it, add it on the fly.
So let me just go ahead and start putting in that and I am going to sign off. Thank everybody for coming in and I am grateful for all of your viewership.
And participation, as I always say, thank you so much.
And I will see everyone, hopefully, tomorrow, Thursday, which is CNC stuff, or Friday, which is going to be microcontroller stuff.
Thank you very much.