All right, lady. What is this? Hey everybody and Welcome to show and tell is that time half an hour of the internet's most interesting and beautiful Makers hackers engineers and more come by and show you what they're working on We'd love to see it. That's some people from eight foot community We got some people in the outside community. Come on by we're here for another 30 minutes or so I just come to buy the stream yard. We got a couple slots open gonna kick it off first up with Kevin from digikey Hey, hey I was gone. Good. It's going good. How's the eight of her factory walking out air condition? Good. We have I'll say this live on the air We we're working on our next eight of box Kevin and we're gonna send over so digikey gets a sneak peek everybody So you'll you'll have something very the benefits of working. Yeah. Yeah, you'll or eight of fruit and Our both and we'll send over some stuff soon. I think you're gonna really like it I'm excited to see it. I can't wait for the next eight of box a lot of fun I don't know how you guys seem to do better each time. So that's right looking forward to it So I'm working on uh sensors expo demos and I decided to use This co2 sensor that you guys carry this thing is great And it's starting to look like the air quality in my office is not that great. Oh, yeah So seconds ago, it was good in here. So I don't know. Maybe the sensor needs to be calibrated But well, you could be breathing on it if you just held it up to your face It could be I I came in kind of late to uh, you guys probably noticed I came in last minute. I was Literally running down here. So that could be why yeah Well, this also might just be a good indicator of maybe something else. So I don't know follow through on this, man Yeah 400 500 Cool. Yeah, I'll bring it upstairs. Actually, I know upstairs is way better. Well, maybe that's a second here Yeah, if you guys don't see any tweets from me for a while, maybe you want to check in No, all is good. All is good. I know this is look there's a reason why like the sensor You know if you buy the sensor and it says your air quality is great You didn't you know, you didn't learn anything now you learn something which is um, maybe put a fan or some get some more air circulation going on in there Um, especially in the winter, you know when the when the doors and windows are closed more It's going to be very handy. You want to keep that kevin bring top notch condition? That's right and printing with uh abs is probably another thing that isn't good 3d printing. Yeah, yeah, yeah All right, cool. I think this is a really good project for you. Yeah good I think I need to do some some figuring out here. All right. Thank you. All right I'll give it in. Um, we will probably be sending you a thing about a box in the next few days Looking forward to it. All right next up trev Updates, what's up? What's up? So this is what I got going on. All right. So right now. Let me share my screen real quick Uh, share screen I'm not use this. Here we go All right. Can you see that? Yep. Yeah, awesome. All right. So this is our pie leaf app In motion. So basically what pie leaf is it lists our It's an a list our um device enable guides So right here the first stop is basically just transferring using the glider transfer service. That's in our that that's It's another after we're also putting together We're using that transfer service to just transfer files over to your hardware So this is an action right here. It's pairing Let's see. There it is Very complete All right Live demo live demo. There we go now. We're gonna press that So that's gonna download the bundle. Okay And now we're gonna transfer with the rainbows And bam Amazing wireless programming. There we go. Future is here. The future is now. That's right now. Nice work trev Cool. So we're gonna be showing this off on ask an engineer and uh, we'll have some more previews The internal team is currently in uh test flight mode, which is um, you know, we're testing all this If you want to see a preview of some of the type of things you can go to our learn system And we have the device enable guides, which uh, will be Ones that easily allow you to get code almost instantly. In fact, we're going to get in trouble for it being too easy That's fine. Um, but we really want someone just be able to pick up their phone user blue fruit and within a few seconds, uh Have rainbows or have whatever whatever whatever thing they see on their screen that they want to do It downloads it and moves it over all without doing anything. So as easy as Circuit python with dragging dropping code On a drive. This is as easy as maybe turning on your phone. That's right. It's gonna be, uh, Totally wireless reprogrammability. It's gonna be it's gonna be great for people who don't have access to a phone Or don't have a sorry don't have access to a computer. Um, I want a program on the go So we're going to be doing more and more of that also let you um connect to some of uh, our usb less microcontrollers Yes, all right. Thanks ref. So that is and trev's live demo. Thank you trev desk All right, next up. Let's go to no Pedro Welcome to the other side of show and tell I know I was gonna say we haven't been on this side in a while The other thing That the pi leaps gonna do for us in terms of design is make our designs where we don't have to route a usb Cable like around and like have to do like all these 90 degree like turns and then like things into our design So, I can't wait. Oh my gosh. I'm like so Fanboy and ian over here. It's going to happen. Okay. What are you all up to? Yeah, so this week we got a video out. We'll have a learn guide out soon on cnc milling some keycaps So I have a couple different flavors of wood here and a couple of different boards. We have the one by four and the macro pad Um, so it's it's a two-part kind of thing for cnc milling So this is like what it looks like when I do the first operations Which is making the internals of the keycaps of making this requires a couple different tool a couple different, uh, Flat and mills. So what I had to do was to figure out, okay So I got this piece now How do I turn this into this with all the concave and all the drafted angles? So what needed to happen was to create a custom fixture that we can adhere to the spoil board And it has all the same geometries, uh as this Except without that little cross there because we really don't need it So the the thing here is you press these in and then with some strips of tape you can Secure several of these in the fixture and then have this set up And then you have uh an alignment bracket that you can set up so you can have The origins all cleared out and then you can mill out these tops So I walk through the whole this is the challenge, you know, a lot of cnc is Fixed string and jigging and I think that it absolutely is that this is cool that you actually showed You know the process of the process. This is the really hard part That's what this is what takes it from like you did one by accident that kind of sort of worked out to It's a reproducible Project and you can actually learn something from it. So good work on this one. I think this is really This is basically like a year's worth of machinist education 110 So yeah, definitely check out the video if you haven't already and I hope folks make it with their desktop mills and seeing a lot of new Mills on the market. They're more affordable and the software for them are getting better And now you can always pick up a free version of fusion 360 Do some cam stuff or just the step files that has like sort of the recipe on how to recreate all of the Operations are going to be yeah, it should be applicable across all the CAD packages. But yeah, all right. Love it this week stuff Thanks, Pedro. We'll show that video on ask engineer All right next up and and what are you working on? um A quick work in progress The macro pad is a really nice thing for like a phone keypad where you you know the numbers on them But in security if somebody can see which buttons you're pressing Um, they can read it can be reproduced or you know If you use one key more than another that starts to wear down So in high security applications, what you want is something that randomizes which keys you have to press and the Industry standard is called a hearse scramble pad where the numbers all scramble and then you enter in But uh, we don't have quite the hardware here. So I'm developing one where you press a button and The keys the key sequence is here on the display. Sorry. It's a little bit bright and um And so you enter in your your your pin code with the numbers in the sequence They are here and if it works then you can trigger all kinds of things I'm looking at a solenoid to open a door But you can also send digital signals to another board or something like that. So, um, This will be done. Um later this week. Um, it'll be in the there'll be a quick learn guide and, uh, you can check it out All right. Nice work, Anne bringing state level security to make community right Thanks so much. All right. Thanks Anne. Uh jeb lurer mixed up Good evening. What'd you get going on? I have some 3d prints to show off tonight So a couple of different things that I've shared around on discord already and I'll put links in the live chat But I love the silicone covered stranded wire, but it just flops everywhere. So I made this little Holder it snaps in and then you feed the wire out through the little, uh Hole here and you can kind of pull it out as you need it. So fun little one Next up I don't think I showed these on show and tell before these are a 3d printed key cap That really lets the light shine through And also lets you see the uh the background a little more. This is uh based on an idea. I saw on twitter, but it's my own design But then the one I'm most excited about Is this is similar to what I think jp showed where you can go to a website and design your keyboard layout But I took mine and did it as a truly hand wired Keyboard with a feather. I think this is the feather m4 can because it's what I had But it's not that much work to wire up the keyboard with the diodes And so it's basically 3d printed and then just a few Few cards and you can go wild with the keyboard layout, which is what I wanted to show here This is the inverted t. But then what is all this stuff? It's whatever you imagine you want it to be I kind of like it. It's it's a very um esoteric looking. Yes Yeah, it's like one of the alien keyboards from star check generation. Yeah, it's a go if you have like 10 fingers on one hand Yeah, I thought maybe with the inverted t and then like I don't know the top button could be duck and and all those other things But it's not super ergo ergo. Yeah now make No, it's supposed to look cool Well, it looks really cool and it's purple. Thanks. Yeah, we're uh come by jebler. All right. Yeah, shout out to josh for giving me the purple filament All right, thanks. Yeah All right next up. Liz from Hey, Liz right in prayer time. Yes so, um, I Met my synth shelf um and I followed a tutorial that the aflour has on how she designed her big honking button Should do a gate in circuit So that then you can basically have your rock signals communicating with Microcontrollers so in this case a feather and four.  Thanks, Liz. Thanks so much, Liz. I always love how you combine music and party parrots in this group really I think every year we actually have like a party parrot module. So I'll just party parrot. All right next up Andy Hello, Andy, what you got going on? No pressure, but you got all that up How you doing, uh I'm gonna try to share my screen Here we go prototype of An evolution to the coin Oh nice make decisions for you.  That's who wins It's a blue one But then the killer feature is this is a passive touch on the edge So if you want to buy And get to blue Yeah, touch where you want it and then you can Spin it I like that because you're like, uh, I like 75 percent of the time I want Thai food But I'm also kind of thinking about a burrito, but only like 20 you can then have it Uh bias choose what food you're going to eat tonight. Exactly. And love that ever since uh Yeah, y'all came out with the mag tag with the magnets. I just I love that idea of having something on a fridge So yeah, this guy has some magnets on the back And it's a really good idea to put on a fridge because like what should I eat? Well? Yeah, let this thing I love the capacitive touch thing. That's that's cool. Good idea Well, is he uh closer to finishing up and everything? Let us know. We'll post about it and all that Yeah, send over send over some photos. We're easy to get hold of I'll publish it up And my email's ptdataver.com. Thank you All right next up Chelsea and carl. Hey, what you got going on? Hey, hi, I'm carl Hello, hi, um, we're we joined last week for the first time and then we had a wi-fi problem So we're back to finish what you look right now. We're here every week. Good work. Yeah Yeah, we love that Chelsea is my summer intern. We work at a small semiconductor company in california And last week we forgot to say the name. It's kinetic technologies And uh, we started a line of rgb led drivers And those products, uh, we have evaluation boards And so this is a demo be the intern Oh, yeah, so this is a 12. She said meeting adjourn. She can't see that. No, no, I said I said Show us the demo because you're the intern. Oh, okay. Yeah, sure You can't really show because the lighting. No, I see it. It's swirling. That's cool. Yeah So this one is programmed with the feather rp 2040 And we use micro python to program it. Cool. Here's us. We have a We have a small bar. This is a third of the other chip and it does What is this the cutie pie board? Yeah, it uses the cutie pie board and that one uses the arduino ide Right and we're converting all our boards to use the stem connector Um And this is this is your summer internship. Chelsea. Yeah, are you going to school nearby? Um, I'm going to davis. So it's like pretty close to where I'm from All right Davis but my daughter went to davis. You've got some great experience. You actually got to build hardware and write code Yeah, it's a great. It's a great mesh for learning about engineering at school Yeah All right. We did great. Are you in our different chats and discord and all that where you can put a link to The company and the dev kits and all that last week during this call We said the name and somebody after we had lost wi-fi was still a chat and somebody you put a link to our Well, and to mauser where they we sell one of our ev boards But we're going to upgrade that board eventually right now That's using a micro python board and we want to change it to using a cutie pie They're more available cheaper And that has the better connector on it And then there's a couple things we would love it if you guys would do projects with our our led drivers because Really need advantages. I I know i'm familiar with some of the things you've done in the past and so we um We use charlie plexing to do these rgb drivers And we've divided into four four three four wire buses and so the three four wire buses Run at 25 percent duty cycle per rgb with the charlie plexing and that lets us Hit the 25 milliamps with 100 milliamp peak which is key Because then we can get full brightness while charlie plexing And then and it reduces the pc board layers for most one thing i'd say is um, definitely put the links in the chat and uh, if you're looking for Uh projects to just see how your stuff Uh could Be part of like some of the aid of fruit projects we do Look at some of the neopixel guides and some of the things that we've done in the past and then just see like Oh, can we could we remake it with our stuff? And if you can then it's like, all right, this is this is now getting closer to things that Correct that we might um or actually the people out there the audience and the community will want to remake so check those out Yeah, we've we've been looking at a lot of that stuff. That's a treasure trove You guys are awesome There's 2,500 something guides. Yeah, all right. Well, thank you so much. I'll see you carl. All right. Thank you Bye. Bye. All right next up Gustav Gustav Hello, what's going on? Hi everybody. Hi first time i'm crawling in today. So that's good to see you Hi, um, I made a uh board game timer remote control so i've developed a um A uh a board game timer and i'm just connecting it up to the Thing now, so let me move the camera so you can see when i'm done so This here is my board game timer and i made a little game here with three people gus adabot and lady adab And i want to give my users a way to put the screens away and then be able to Do things like end the turn and so on we have a remote control So i used to went bluetooth standard to connect these two if i press both of these buttons together That should work Lie demo here. Yeah, so it's bluetooth is like that. Oh, yeah, it's all right So is it yeah, we connect it Yeah, I was just about oh, it's not connected. Okay, so this is the connection process. I can show you that can you see this Yeah, yeah, yeah So i made it so it can connect to anything So this is just one of the things it can connect with but it's got a really flexible open way that it connects with things um, so Here's all the commands that the remote control can send to the game And if I say connect now And pair Now hopefully when I press both buttons Oh, shoot. Why is this not working? It's okay. It's a live demo. How about we'll we'll go to uh, someone else will come back and you can It's totally live demo Can either come back or you can also come back next week whatever it is. Yeah, all right. We'll stop by Okay, so let's go to so we pre-recorded our All right, we're gonna go to How's it going, Seth? Hey, I'm back again. So can you hear me? Yes? Yes? All right, great. So I uh, last time I was on I shared a little rgb matrix with the esp 32 S2 that I was making and I thought the rp 2040 was a great Ship to uh to throw on one of these because it's cheap and you know, it's basically the high-end rgb driver if you want it to be so I made a version with The rp 2040 I threw two little stem of connectors on there and everything so It just creates kind of like a cool little way that you can Um, you know set up a little like monitoring so like if you have like environmental sensors you can You know do easy indicating and you know as I showed you can like write text on it too Um, so that was one cool thing that I'm working on. Um, spring into my shop And then uh, another thing I made was this little board I made it during the board tour like Over the course of the whole video I designed the board I remember you're saying that you're like I'm walking boards making boards while I'm walking boards and making boards So this one is um, it's a bread 2040. So I didn't know what else to call it. It seemed like a funny name.  So Looks great Yeah, and it worked the first time so I was very proud of myself on that one So I'll post a link in the chat for people to to check out your board tour video so I can see it Well, no the um, it was watching our board tour video to your yeah post a link to your shop and everything Um, I know sometimes folks come on with their stuff and they're like, oh, I didn't want to I didn't want to say what my story was or post anything because that's spammy. No Not here and not for this. So yeah, please do let everyone know what you're working on and thanks for being part of the Uh various ecosystems that we've been putting out there Yeah, and they're all circuit pipeline compatible. So it's just you know adding more boards that people can You know get going. Yeah, right on. All right. Thank you so much. Thank you, sir All right. All right. Gustavo. You want you want to try again? Okay, go quick and then we're gonna All right, so um, if I press both buttons at the same time, I'm gonna unforce the game So now whoops, uh, it's gossips turn and he's currently in his fourth minute So as the time clocks up The lights turn on showing him how much time is taken The whole point of a game time is to encourage people to take less time To hurry up because you can spend too much time. So if I press one button It goes to adabot And then adabot if she wants to pass her round she can press the b button Next up lady adab and then if uh, he regretted having passed this round and he wants to Undo he can Shake the remote control. I like the shake to undo. That's nice. Yeah And then if uh, they start arguing about rules, they can go into admin time by the switch And then it's not It's not measuring anyone's time. I like I like using all the little user interfaces, but very intuitively Yeah, and so what I just want really quick here Just to say I I don't do I'm not a maker like I'm not really a part of your community I'm a software engineer and I make web apps But for me discovering this that with web bluetooth I can reach outside of the app and make physical things happen Is amazing. It just opens up a whole new world. I can I love web bluetooth and web usb I think it's really I I think it's underrated people don't understand how amazing it is that we now have A platform agnostic way to connect to hardware. It's always been a hellscape It's so cool. I I made it. I started this as a joke. I was I had this little Teddy bear a vibrating teddy bear and I thought I would put it next to the game table And when it's my turn the teddy bear would shake So I made that and then I thought oh, I wanted to make it a remote control And that's how I found you guys and and made this so I'm I'm now obsessive about this Well, thanks for sharing that story because when we when we talk about the things we want to do you just kind of summarized Years of work to make it easy for people just to do the things that they Have ideas like oh, let's see that teddy bear I'm gonna have it do this and now you can glue all those things together You know enough about coding and now you have a physical thing that can happen with The bits of code that you and circuit python being able to like it's code. I can do code. It's amazing I'm I'm I'm hopefully I'll be on here showing other It's a really cool project love it Once if anyone if anyone listening is into board games and want to collaborate with me playing around with the game timer and Hardware stuff. Just reach out to me. Oh cool. Yeah, go down to discord. I'm sure there's tons of game players there Right. Well, thank you so much. All right. Last one at least steward always bringing in the cool tranix What are you up to steward? Hey, how are you? Hey, hey, can you hear me? Yeah. Yeah, go go for it. Okay. Okay. I need to share my screen because it's already hooked up. So Okay, can you see that? Yeah So so what it is is I have a glow forge upstairs You know with the big button So what you have to do you have to go up turn it on put the material and then come back down I have to come back downstairs Put the you know put the design shoot it up to the glow for is not to go back up To press the button. So what I did was I used this the large solenoid here And I created a case for it For the So it can press the button And I also created a web interface for so I could do it remotely over wi-fi in the house And so what it is is there's magnets in here here And I had the laser this so it fits right nice and tight around the button Those are the measurements here. There's magnets here magnets here So it's secured like that onto that so Then here When I was testing the button I had to put a rubber bumper on it because the the solenoid was too hard. You can't adjust it So I put a rubber to gently push the button so now So what what I have now is that I can remotely control over web The web interface for that And then there's the solenoid And I press the button here It automatically hits that and then the job starts on the The glow forge good work. Now we'll have to keep running upstairs back and forth Awesome right on Well, congrats here This is like one of the many like iot devices that we always talk about like there's Oh, I just want to get an alert when like the basement floods Oh, I just want to turn this thing on instead of going upstairs and like you can finally make all these things Um, and it'll actually work. Yep. All right. Great job. Sure. I love I love the uh, the hacking spirit you bring to everything Thanks, I can't wait to see the evolution. I was like, I don't want to walk over there and turn off the light switch Yeah, you have something new every week too. I'm always all right. We'll see you maybe next week or in the future, sir All right, thanks to our Oh, yeah, it's every every day is halloween. All right, everybody. That's show and tell thank you everybody for making this the best Happen hour of the week every single week for us. We're here Every wednesday at some 30 p.m. Eastern time. We'll see everybody next week. That's gonna engineer starts in like one minute Bye everybody. Bye. Bye


The Getty Strap tops and dresses are so comfortable to wear during the hot and humid summer months, but they certainly present a little bit of a problem when it comes to coverage and support for the ladies. I absolutely loathe strapless bras. I've literally never been able to find one that I actually thought was comfortable. No matter if it's bandeau or underwire or whatever it is, they're all terrible in my opinion. So I started adding shelf bras to all of my skinny strapped garments. And in today's video, I'm going to show you just how easy it is to do.  Before we jump into it though, please make sure that you are subscribed, especially if you like quick and easy tutorials. I love posting pattern hacks and showing you guys how to easier, more efficient and just have better results in the end. If you're new here, I'm Lindsay. Hello, welcome. I sew all my clothes and often find myself doing little pattern hacks like this one to make sure the clothes I wear fit into my lifestyle and are comfortable. This made for mermaids, a Lana dress that I'm going to be using to illustrate the shelf bra tutorial today is no exception. It's a super, super cute dress design, really simple, really easy, great for a beginner, but I knew I would need to add the shelf bra for the extra coverage I need and just a little bit of support. So let's get into it. To get started, you are going to need the pattern of your choice. Obviously, I'm going to be specifically using the made for mermaids, a Lana dress today, but if you have any pattern that has spaghetti straps, you should be able to apply this technique to it. In addition to your pattern pieces, you'll need obviously the front and the back, and you'll also need a few measurements. So I'm illustrating this today on my ditto form. This is like an exact replica of my body, but you could obviously easily take these measurements on your own body yourself. The first one you need is your width measurement right at your under bust. So this is where the band of your bra would normally sit. So it's usually right underneath your bust. But if you want it to be a little bit lower and kind of have a long line situation, you can definitely do that too. Just measure wherever you want your shelf bra to end. Right. And then we also need to measure from our waist, the length from our waist to wherever you want that shelf bra to end. It's going to be just a few inches probably, but this is going to help us determine the length of our shelf bra as well. So we have the length and the width that we will be applying to the pattern pieces. So grab those pattern pieces, get the measurements, get some tracing paper and a pencil, and let's head over to the cutting table where I can walk you through this tutorial.  They always make me feel like more legit of a psoas for some reason. I don't know why, but let me know in the comments are drafting projects like your thing, or do they kind of scare you a little bit? All right. So first things first, we need to draft the pattern piece for our bra. All we're going to do is lay some tracing paper right over top the front pattern piece of the dress and or the top and the back pattern piece. You're going to copy the fold line. You're going to copy the neckline. You can see that I put in the high v in the low v and then I also added a high scoop. Just added in myself and you're also going to copy this arm side exactly how it is. Now when it comes to the side seams, we actually want our bra to fit closer than the top does. The top is kind of loose once you get down to the waist. And we obviously want our bra to be a little bit more close fitting. So I came in pretty significantly. This is about an inch, inch and a half. So when I cut out my bra pattern piece, I'm actually going to follow this line here. When I cut out the dress, I'm going to follow this line here. The waist is marked on the pattern. I have my marked right here and then I just measured up from that and that's where my bra band is.  Now it's on this particular pattern. It does not matter what the fabric looks like. I could have used any scrap I wanted because we're going to finish these necklines and arm sides with bias binding. So you're never going to run the risk of this showing. I happen to have a little bit of extra fabric from my self fabric. So that's what I used. So use yourself fabric or use something that you would like to find in a shelf bra. 100% cotton is nice and breathable. Cotton jersey would be really good or some kind of lining that you would find in sports bras or undergarments. That would all work as well. If you want to add a little bit more support to this, you can add the power mesh to that, no problem. You can also add cups to this and we will get to that whenever we get close to finishing the garments. So we're going to kind of go rogue from the instructions for just a little bit because we're going to assemble the shelf bra right sides together. You're going to sew your side seams and then on our dress, we're also going to go ahead and sew the side seams on our dress as well. You may go ahead and finish the hem on your dress. If you're doing the slits, go ahead and do the slits on your dress. Basically, we're doing everything except for the neckline and arm size. All right, so I have the side seams of my little bra shelf bra sewn here. I have pressed up my seam allowances, 5 eighths of an inch. Then I measured my leg where my bra band will go.  Sewed that closed, marked the quarter ways on the quarter marks on the bra. So I've got center front, center back and my two side seams and then it is the same thing on the elastic. I marked the quarter points of the elastic. So you can see, obviously, that the elastic is smaller than the top and that's what we want. So we're going to go to our machine and we're going to sew this down using a zigzag stitch. You're just going to zigzag all along, carefully pulling the elastic ever so slightly and keeping it kind of in that fold that you made. Then when you're done with that, this gets turned up and top stitched and you will have a beautiful little finished band for your bra. Obviously feel free to make this elastic wider or narrower depending on, you know, how much support you want. Okay, so by now you should have your bra let side seams sewn. You should have your little band completely finished with the elastic inside. I like to do wrong sides together. So I'm going to actually slip the dress inside the bra and start pinning this together all around the necklines and arm size and then I'm going to go to the sewing machine and just baste these raw edges together just like that. You have your dress with your little shelf bra sewn in. It should be separate from the side seams at the at the hem but attached at where the strapping is going to go. So at this point you'll pick up on the pattern instructions for sewing on all of your bias binding and then if you want to add bra cups, once you have your straps put on, then try on the dress, put in the bra cups, pin them in and sew around the bra cups to the bra, not to the dress itself, obviously. And it's as easy as that. I really hope that you guys will give this little pattern hack a try. It will transform your wardrobe and kind of open your mind to patterns that you might have been writing off because you know like, oh I could never wear a bra with that. Well now you can add a shelf bra to it super easy and be able to wear clothes that you might have thought that you couldn't before. If you want some more tips and tricks that I have for just sewing in general, be sure to download my free Ultimate Garment Sewing Guide of Guides. I've linked it for you in the description box. It has seven different guides all in one, covers everything from fabric choices, garment ease, machine needles and a bunch of other stuff. And give this video a like if you found it to be helpful. If you want to know more about sewing with knits, I've linked one of my knit sew alongs to this end screen. It's actually the dress that I'm wearing today. It has lots of information in there that will help you out in learning to sew with knits and feeling a little bit more confident about that. But that is going to do it for me today y'all. Thank you so much for watching and I will see you all very soon. Bye.


Okay, so that's most everything about the job system. Now let's talk about ECS, and having talked about ECS, we'll then talk about using the job system and ECS together. But first, for ECS, you can read this text here, and I start out with a rationale of what it's about, and then go into the concrete details. But here in the video, I'm going to take the opposite approach. I'm going to start out with concrete examples and just work backwards. So firstly, we'll look at an example system. A system is just a class which inherits from this class called component system, which comes from the entity's namespace, unity.entities. And your system class should override this method called onUpdate, which is a method called every frame for every system you create. And then you can also override onCreateManager and onDestroyManager, which as you would expect are called upon creation of the system and its destruction. And the fact that the word manager is in the name, I think that's just because one of the base classes of component system is a thing called a system manager for some reason. It's a little bit of a strange name, but that's what that's from. And this parameter incapacity, I think is actually vestigial. I'm not sure it actually does anything anymore, at least that's what I've written in forms. So I've not seen a code example that actually uses this parameter. Anyway, this code, of course, will run upon creation of the system. Every frame we should see high printed out. And then if our system is destroyed, we'll see this message printed. So we'll see this in action real quick. Come here to this project, hit play. And as you can see, it printed out creation and then hi, hi, hi, hi, every frame. Now, what I didn't do is I didn't create any game objects nor attach this script to any object. In fact, I don't think I can do that if I try and do this. Yeah, it gets an error because it's not a mono behavior. It is not a component of the old style. It's a totally different thing. And what's happening here actually is by default, there's this bootstrapping process where for every system class in your project assets, it just automatically creates an instance of that system and then calls its create manager methods and then every frame calls the on updates of all those systems. And there actually is a way to manually instantiate your systems and control the bootstrapping if you want to. But by default, they'll just be instantiated for us. But just to illustrate real quick, here I'll add another system. We'll call this one other system and it'll print out creation to, hi to and destruction to. And so this also will be instantiated automatically for us. And every frame will see both hi and hi to print it out. But the question then is, well, if I have multiple systems, whose update is called first? Is there a way of controlling that? And the answer is yes. You can put an annotation on each system class. You can say update after, and then you write type of, and then the class of that other system, there you go. And so now we're saying that this other systems update should only run after my systems update. And there's also update before, which of course will mean that this system here, it's on update, will be executed before my systems update.  And you can use multiple, like if I had some other system, I said, I don't know. Another systems, now we're saying that other systems should be updated before my system and another system. And so you don't have to necessarily though, fully specify the execution order. You could, if you wanted to, you could explicitly say, this one always executes before A, before B, before C, before D. You could do that. You don't have to explicitly specify the relative execution order fully. So in cases where it is left unspecified, whether A should run before B or not, Unity will just decide for itself. And I'm pretty sure, let's see, if I try to give this the annotation of my system should run before other system, well, that would of course be a contradiction. So I think I'll get an error here. Yeah, we're getting an exception at the start. It's saying, is a chain of circular dependencies. So it's just ignoring those dependencies. Yeah, this is a contradiction. My system can't run before other systems, if other systems trying to run before my system. So I'll just give you these annotations. And you're probably wondering, well, what are these systems about? They have an unumptap method called every frame, but your regular components have those too. They don't seem very special and the answer is, well, yes, by themselves systems, there's not much to talk about. They're basically just a bit of setup code. If you want to define on create manager, you can also specify how I think it's teared down, but the core of it is there's some update done every frame and for the systems whose relative update order you care about, you can specify this one needs to run before that one or this one needs to run after that one. That's really all they are. Having introduced systems, now let's bring entities into the picture. Antities are basically analogous to the old game objects. In Unity's traditional model, you have these game objects, which are actual C-sharp class instances, and those game objects contain components, which are other kinds of objects, but in ECS, our entities, which are the analogues of the game objects, they're not actual objects. They're just ID numbers. There's this thing called the entity manager, which stores a bunch of entities and their associated components. And when you create an entity, you're just allocating a unused ID number. And when you destroy an entity, you're getting rid of it. And so the entity manager is responsible for keeping track of which entities exist and which don't. So the question is, how do I get an entity manager? Well, an entity manager belongs to something called a world. And a world is something which contains an entity manager and a set of systems. We talked about how there's an automatic bootstrapping process that automatically creates instances of your system classes. Well, those system classes are added to the default world as a world that just exists by default. And so here with the static property active, we're getting the default world. And then from that world, we're using get or create manager to get its entity manager, and that's been assigned to EM here. And then we can call create entity, which creates a new entity and it's returning an entity struct value, which just has two properties, index and version, because an entity ID, for reasons we'll explain, is made up both of a unique index number and its associated version. So having created an entity, we then print out this index and this version, and what we see in unity when we play the game is every frame we see index, which is being incremented every frame, but the version is always one. When we create entities and an index is being used for the first time, the version number is going to be one. But if I come back here and we say em.destroy entity and pass in the same entity ID represented by this entity value, having created an entity and then destroying it, the next entity that's created will have the same index number, but we'll have a version number that's been incremented. So here if I play the game, we'll see index 0000 being reused repeatedly, but the version number is what's being incremented. So what's going on here is again, the entity manager is keeping track of which entities exist and which don't. So it knows which index numbers are currently representing a living index number or in which don't. And when you create a new entity, it just gives you the first index that's currently not already in use. And that might be an index which was used for a previous entity. So that's why the ID, this, this entity value, that's why it's made up of both an index and a version because every time an index is reused, the version is incremented. So we can distinguish between the idea of the old entity that's been destroyed and this new entity. That's how that distinction is made. When an entity is destroyed, that ID should be effectively invalidated and that's effective of what happens because the entity manager internally for every index currently associated with a living entity, it knows what the, the version number should be. So if you try and look up an entity and provide an index that's in use, but the version number is less than the current version number for that index. It knows that you're talking about an entity that's, that's been destroyed and no longer exists. Okay. So if entities are just IDs, well, good or they, well, you associate components with an entity. And we do so through the entity manager here, I'll get rid of this just around to the line and we'll add in these calls to add components. So these components are not the old component types. They're not instances of the unityengine.component class. They're struct types, which implement this new I component data interface. The interface itself doesn't actually require any methods and it doesn't have any extension methods either. It's just effectively marking a struct as being a component type of, of ECS. And we can give these structs fields and methods, but there is a restriction that these component types have to be so-called blittable types. Blittable in C sharp means it's a data type whose memory representation is the same in both managed code and native code, both in the garbage collected world and the non-garbage collected world, such that if you want to move a piece of data between the two worlds, all you have to do is a straight nem copy. You just copy the bytes. You don't have to fix references or, or anything like that. And so for a struct type to be blittable, all of its fields themselves must be blittable and that excludes any reference type. All the reference types are not blittable types. So all we can use our value types, like say float and int and other struct types, which are themselves also blittable. So these are the struct components, which we are going to associate with our entities and we do so through entity manager methods like add component, which takes an entity ID and then the type of the component it was to add, and then we can retrieve a component of an entity. This is a generic method where you specify which type you're getting, and then the entity ID, and now it's returning to my component value, whose num is zero, because when we added the component, it just defaulted to the default values for all the fields, in this case, zero for the float num. But of course, we want to be able to set the value for these components. So we call set component data, specify which type of component we're setting the entity, and then pass in the actual value for that component. And then we can also remove components by calling remove component, specifying the type and passing in the entity ID. And set component data will throw an exception if you don't already have a component of that type and likewise remove component will throw an exception if you don't have a component of that type. And I believe that component will also throw an exception if you were done with trying to add a component which it already has, I believe this is the case. Let me try this out. Yeah, it doesn't like it because you already have a component of that type, because that's a very important rule, you can only have one component of a particular type on any single entity, a single entity can have as many components as you like, but you can't have any duplicates of the same type on a single entity, that is not allowed. So this is different from our game objects and their components because their game object can have actually any number of components of the same type, if you don't choose, that is not allowed here. And that actually explains why when we call get component data and set component data and remove component, it's a generic method. And we're not specifying which my component component we're talking about, there can only be one on that entity. Now you can add and remove components from entities as you see fit. But of course, very commonly, we'll usually be creating many entities with the same set of components. And so we can define what's called an archetype, which is basically just a set of component types. And then when you create the entity you pass in that archetype, and it creates an entity with that set of components, rather than having to add them individually. For reasons we'll discuss very shortly, it's also more efficient to do it this way. And understand also this term archetype is used more broadly just to mean the set of component types which any entity has. So even if you don't use this entity archetype thing, your entities have an archetype. It's whatever set of component types that entity has, that is its archetype. So if you have an entity with types A, B, and C, and you add a component D, you are effectively changing its archetype, you're changing what set of component types it has. And there of course, there's no sense of order amongst the components on an entity. So A, B, C is the equivalent of C, B, A, or B, C, A, or any other ordering. We don't think in terms of order. Very much like in a relational database table, right? You don't think of the columns as having an order, they're just a set of columns. In this next example, I have added a third component type just called sum component. Doesn't really matter what's in it, it's just we need a third type. And I've moved the code that creates entities into the on create method rather than out of on update. So this is only done once when the system is created. And we're defining two archetypes, one which has two components and the second which has three components. And we're going to create 10 entities of the first type and 10 entities of the second. And then we're creating this new thing called a component group, which is being assigned to this field here of type component group. And the get component group method of your component system, you pass in some number of component types and you get back this group, which represents a set of components we want to iterate over. So whereas an archetype is defining a set of components, which an entity can have a component group is a set of components where you don't have necessarily any entities with that specific archetype. You just want to iterate over all entities which have those components. So in this example here through a component group with my component and other component, we can iterate over all entities which have those two components, regardless of whatever else they might have. So given entities of these two archetypes, we would actually be looping through all of them because they all meet the requirement of having both a my component and an other component. And then every frame and on update what we're going to do is create iterators which iterate over the components of the entities which match this component group. And so this get component data array method where we specify the type of my component, it gets an iterator of the my components and get component data array for other component gets us the other components. And then if we want to access the entity IDs themselves, we need a third iterator we need to call get entity array and that gets us an entity array iterator and understand that all these entities because they're from the same group, they will have the same length because the component group is selecting for all entities which have a my component and an other component, but we need two separate iterators to get at the two different components and we need a third iterator if we want to get at the entity IDs. So here in this loop, what we're doing is we're effectively visiting all of the entity IDs and components of these iterators in each iteration, we're getting an entity ID and the my component and other component value associated with that entity ID. And in this particular case, we're not doing anything with them, but we could print out these values or do whatever we want, right? And in fact, we could mutate these values. So here I can assign to this iterator at a certain index a new other component value. So these iterators are not just for reading entity data, you can also mutate the component values. But what we cannot do is while using these iterators is you might think, well, here I'll bring in an entity manager. And now while using these iterators, we will just say like destroy this entity. Normally, this would be an okay thing to do. But as long as we were dealing with these iterators, we can't destroy any of the entities they iterate through, nor can we remove or add components to those entities. If I ran this code right now, I get an error. And actually here, I need to this needs to be world dot active there. That's how we get the world. And it's entity manager. But because of this line here, we will get an error. So you know, just demonstrate that real quick, come into unity, hit play. And we get an exception every frame. Unfortunately, the air message is not all that helpful. It doesn't really exactly clue you in. But in this case, I happen to know yes, it's because we're trying to mess with the entities which are being iterated through. So if I get rid of that line, come back, play. And it's fine. We're not getting exceptions. So you probably wanted well, surely I sometimes would want to destroy entities as I iterate through them. Well, what we can do is we can use what's called an entity command buffer, which as the name implies, stores a buffer of commands of say like add component, remove component, destroy entity, those kinds of commands. And then at a later point, having queued up these commands, you can flush the buffer, which enacts all the commands. So if we had an entity command buffer here, we could queue up our destroy entity commands, and then have them done later when we're done with these iterators. And we don't need to actually create an entity command buffer, because one is provided for us, there's a field of our system called post update commands. And it has a method destroy entity. So we just queue up this command. And then post update commands is automatically flushed after on update returns. So if I save this now and go back to unity, I should be able to run my game with no errors. And yes, everything's fine. Now to understand entities and components and these component group iterators, it's really, really helpful to understand how they are actually stored in memory. Well, what happens is that the entity manager creates these things called chunks, where chunk is just a 16 kilobyte block of natively allocated memory. And each chunk can store entities of a particular archetype and only entities of that archetype. Say, for example, we have a chunk that stores entities with the archetype ABC. Well, then what would look like inside that this is the 16 kilobytes, you'd have first an array for all the entity IDs, then an array for all the A components and an array for the B components and then for the C components. And these are not necessarily the same size because, of course, the components themselves aren't necessarily the same size. So when the chunk is created, it just figures out well to maximize the number of entities we can store how large should these arrays be respectively. And because the chunks aren't necessarily full, also internally in the chunk we store the count of actual entities stored. And as we add and remove entities from a chunk, all the entities that are stored are kept at the front of these arrays. So you don't have any gaps in the arrays. For example, if we were to remove the entity, which is at index zero of these arrays, the first entity in these arrays, then that gap would get filled in by taking the last entity and moving it to that first slot to fill it in. Because we don't want any fragmentation in these chunks. We don't want it to be gaps. And the reason the arrays are stored in these parallel arrays, rather than a more obvious solution of having just the first entity and its ABC components first than the second entity and its ABC components, et cetera, you know, just all the components of each array grouped together. The reason for this is that it turns out generally to be more efficient for our component groups when they iterate through the components. If the components are split into separate parallel arrays, rather than being closer together for each entity, like say, for example, I have a component group, which iterates through all A and B components. And so what happens is that component group looks in the entity manager for all the chunks, which have an archetype that includes types A and B. And so this chunk here, for example, would be included because it has an A and B component. It also is a C, but we don't care about that. We just want to iterate through the A and Bs. But we would iterate through the A and Bs of this chunk. If instead of being stored in parallel arrays, the components were all grouped together on a per entity basis, then when we read entities in chunks where the archetype is say like ABCDEFG, you know, a bunch of other components other than the A and B that we care about for that particular component group, then we would wastefully be reading a bunch of bytes in memory that we don't actually care about. By splitting them into parallel arrays this way, our component groups that are only reading some selection of components from a chunk wouldn't waste memory bandwidth accessing components we don't care about for that particular component group. And likewise, the reason the arrays are kept tightly packed, the reason we don't allow gaps in these arrays is so as to avoid accessing bytes or useless data, we want to only read the bytes we need to. And so as we iterate through a component group, the memory we are accessing is tightly packed and entirely linear, except for the part where we're reading from parallel arrays, rather than just one array. And so in that sense, yes, our memory access pattern isn't strictly linear, we're reading through in conjunction, multiple parallel arrays. But on modern hardware, you can get away with reading from a few parallel arrays and still get all the benefits of linear memory access because you don't end up triggering any cache misses. I don't know exactly what those limits are. I'm sure it's different from system to system. But in general, I think you're okay as long as you're reading from like four parallel arrays, or maybe five or six, perhaps. But at some point, of course, if you read from too many parallel arrays at once, if like you're trying to access a component group of A, B, C, D, E, F, G, H, I, J, K, you know, you're reading from a bunch of parallel arrays at once, then yeah, effectively, you would be jumping around in memory. And you probably get cache misses. So again, I don't have a real sense of exactly what that limit is. It turns out though, in most systems for most purposes, when we do access data, we generally are just really accessing two or three, maybe components at a time. It's really quite rare, even for entities that maybe have a bunch of components on a single entity, it's still rare to to access all of those components at the same time. Turns out for most purposes looking at just two or three or maybe four. So it's this chunk memory layout that gets us the memory access pattern we that's most optimal, the linear memory layout with a small qualifier that it's, you know, parallel arrays rather than just necessarily one array. But that's close enough as long as we're not iterating through too many parallel arrays at once. There are cases, though, where you're going to want to access entities by looking up a specific entity by its ID, that's why entities have IDs in the first place. And so the entity manager has an entity data array, which is just one large array with all the entity IDs. And if you want to look at the entity whose ID index is say five, then look at slot five in the array, and you look at its entity data. And that tells you what the archetype is. It tells you where the chunk is, where it's stored, and it tells you where the index in that chunk the entity is stored. And it also is where we store the version number for that entity ID. And because entities can be destroyed, you're going to end up with gaps in this array where in between two existent entity IDs, you might have a slot that represents a dead, a non existent entity. And in those free slots, the chunk pointer and the archetype pointer are going to be null. And that's what indicates that this is a free slot. And then the index in chunk value is not actually going to represent an index into a chunk. It's just going to represent the index in the entity data array of where the next free slot is. So the entity manager keeps track of where the first free slot is in the array. And from there it's basically a skip list you can from the first free slot find the next free slot and then the next one. And when new entities are created, they're created by filling in these free slots. So again, this entity data array is what allows us to quickly look up entities by their index, you wouldn't have to want to search through every chunk, right? And it also is where we store the version. And the archetype pointer, I think, is not really strictly necessary because you could just look in the chunk to find the archetype of that entity. But for some operations, you want to directly look up the archetype in a more efficient way without having to go through two pointers. So that's why it's also stored here directly in the entity data array. So now having a sense of how this entity component data is stored, you should then have a sense of which operations are efficient and which are a bit less efficient. And as you can see, the whole system is optimized for the case of iterating through a selection of component sets. That is the number one priority of this whole system. But then there are certain operations which are surprisingly a bit less efficient. In particular, if you add or move components from an entity, well, a chunk, as we explained, can only store entities of a particular archetype. And so if you add or move components, you're changing that entity's archetype, so it can no longer be stored in that chunk, it needs to be moved to a different one. And when you move an entity to a different chunk, well, you have to remove it from that chunk. And that requires moving another entity into its place to fill that gap. And then you have to store it in another chunk, and you have to update these references, the whatever entities get moved within chunks, then you have to go into the entity data array and update the chunk pointer and the index and chunk value. So it could be quite costly. One way to mitigate this is that if you can queue up a bunch of entity command buffer commands, then the entity manager can be a bit smarter about how it does these operations, it can do certain things on mass in a way that's more efficient than if you do them individually. So that's one way to mitigate the inefficiencies that do arise. In general, though, it suggests that perhaps adding and removing components on a regular basis is something you should be careful about doing. You should maybe not try and add and remove too many components from existing entities too many times per frame that that's not going to be super optimal. Now, aside from post update commands, the other way to get an entity command buffer is to create what's called a barrier system, which is a system type like component system. But in a barrier, the unupdate method is sealed, we can't override it. And so when we create a barrier, we just leave it empty. So here I have my barrier class and the curly braces are just left empty. And then what I do is I inject this barrier into other systems, the inject attribute inject attribute here will go find the my barrier within the world and automatically assign an instance to this field. And then through that barrier instance, I can call create command buffer, which gets me an entity command buffer, which is going to be flushed automatically every time the barrier updates. So here instead of using post update commands, I'm using this buffer created here from the barrier system. And these commands are going to be flushed when my barrier updates. And when is my barrier going to be updated? Well, I've here through update before I've made sure that this my system is updated before the barrier. So typically when you create barriers, you're going to want to specify one way or another how systems which use that barrier are going to update relative to it either before or after. And of course, this example is very pointless because my barrier will update immediately after this update, and it'll have the same effect of if we just use post update commands. But in the useful scenario, we would have like say several systems that all inject the same barrier and all are executed before the barrier and they all create command buffers from that barrier. And then when the barrier updates, all of those buffers will get flushed at the same time. So barriers are used as the name sort of implies as marker execution points in our update cycles past that barrier, you would know that the work from several other systems, their entity changes have all taken effect.


All right, new products. This is an update. Yes. Okay, people have been waiting the argy boys back in stock. This is actually a video of the previous version. Argy boys are back in town. The boys back town with Argy Boy. We now have the Argy Boy FX, which has a fancy new silk screen. It says FX and it comes with a built-in chip that has a loader code on it. So there's a lot of games already on it and you can select which game you'd like. Otherwise, it's the same hardware and set up. You program it just like an original Argy Boy.  If we have them in stock, it's I don't know we're going to be able to get some more. These I think are probably affected strongly by the chip shortage. It took a really long time to get them. So which is totally sweet. But do pick these up. These are a very fun development platform for writing games and the industrial design is of course lovely. Next up. Now this looks just like a normal breadboard but what you don't know is that this is a premium breadboard. Yeah. So you know I use breadboard, these solderless breadboards all the time and you know as I was using them I was like you know I bet we can get better ones. And so I looked around and I've worked, it actually took me months of working with different breadboard factories to make a solderless breadboard that is buttery smooth as Philby would say. So one of the things is I took this apart to show is the clips are not flat. They're actually, let me zoom in because this is this is the secret sauce. I'm giving away all my secret sauce. So if you look here you see how there's like this little bit of a notch at the end. This notch makes it easy to insert but gives it a good grippy effect. And so what happens is when you have something like a feather or maybe you have a teen C4 one something with a lot of pins and you line it up and normally it's like a little bit of a struggle to get the board into the breadboard. But this is like buttery smooth. Can you just say yes? Here you try it. Tell me how buttery it is. Just try pressing that in. Did that just go in like smoothly, easily?  It is like a hot knife through butter. It's like a hot PCB through breadboard. And they're easy to remove as well. The opposite of a fidget spinner. It's like I feel calmer doing this. Yeah. Oh yeah. Okay. And it's also easy to remove board. So maybe I'll show it from the side. So you get that you get that action. It also makes the sound. It goes ah really nice. So the first board and also I like black rather than blue for the negative marking. I'm just like that a little bit. And I want to also try to get these with a with a brighter white color. But for now they're still the kind of classic cream color. But these are very, very satisfying breadboards. I'm going to say this. If you have something that you use every day like a toothbrush, spend a couple bucks on it. If you have something every day that you're going to use like a belt, spend a couple bucks on it. If you're going to have something that you want to last, spend a couple bucks on it. If you're going to use a breadboard, I think this is one of the ones that be choosy because it's your hobby time. Also comes with the middle plate. I forgot to mention that. Okay.  I'll bring this back out a little bit. It's kind of like if you if you start cooking and stuff like that, you should probably get like you know, a decent cutting knife. The metal plate can first off you don't have to worry about it sticking to your desk because you've got this metal plate protecting it. But also it can it can reduce EMI a little bit because you have this nice metal nice metal backing. So and here's the deal. It's the same price. It's just better now. Yeah, it's just all around better. And I do want to get the rest of the breadboards changed over as well. But right now, this is the only one that we've got. So just just be aware that if it says premium and I use the phrase buttery smooth, you know that and you know what for folks out there that that like their hobby and do the Pepsi challenge.  Some people might really like this. If you find a better one for the same price, let me know because these I think are the best you can get for a couple bucks. premium step. Next step. Okay, we've got another update. So I know I just released this board and it's like, Hey, how could you possibly be revising it so quickly? Yeah, it's I don't know if you know about this chip shortage. It's a chip shortage. I've heard this song. It just won a billboard award. Okay, so I'm just gonna look at this image because this is kind of has everything we need. So, oh, no, go back to back one. Yeah, stay here. Stop. So the chip in the middle. So the chip on the right is the ESP 32 Pico module, which is a wonderful module that forms this feather ESP 32 v2. And we love it. The chip in the middle is the USB serial converter, which is the CP 2102 and originally. However, our shipment of CP 2102 ends is not on our way to us quite yet. Hopefully we'll be soon. However, we wanted to make sure that we could keep this board in stock. And so we decided to adjust this design and you know, because it's a new design. So maybe people aren't as wedded to the CP 2102 and on it. And now comes with a CH 90 102, which is a similar to the CH 3400, sorry, 340 or 341, which you've probably seen on a lot of dev boards. This is just one that is like the same pinout as this CP 2102. Otherwise, the board is exactly the same. We have links to the drivers and we also have a guide coming out on how to install drivers on Mac and Windows. It functions the same, the low power usage is the same. The draw is the same. The speed of upload is the same. It actually seems a little bit faster. Everything is the same. I think this is a really good candidate as a replacement and it allows us to keep this board in stock. Okay, I'm going to have a couple other pictures of the same because the only thing that change is that chip. Make it up. Okay. Next up, we have a new thing. This is a little bit kind of a weird device, but I thought it would be cool to stock. So this is a it's designed for as a controller for heater modules in like a vest or a jacket.  It comes with a couple different modes. It's actually easiest for me to show on the overhead because it's I'll let me turn it off. And then I'll start from the beginning. So okay, let me move this breadboard. It's not a premium breadboard out of the way. Okay, so this is like a rubbery what's nice about this is kind of like a weatherproof rubbery button. And you connect the black and red wires to your power supply, which can be I think between three and 24 volts or three and 12 volts. Check the product page. You press once to set it to be red and hold on this wire got disconnected. And then you connect the output ground to the blue wire and power to the red wire. And here's like a fan to demonstrate it because a fan is kind of nice. And it's a nice visual way to see it. When the light is red, it's 100% on. And then when you press it again, and it goes to blue, it goes to 30% off 70% on so it's like a 70% duty cycle. And you'll see the duty cycle isn't like a fast duty cycle. It's actually maybe take two seconds on and off. So this would not be good for like an LED unless you're okay with it blinking. It's good for heaters, maybe fans, peltiers, other kind of slow heating or cooling devices or powering devices. And then green is 30% duty cycles or 30% on 70% off. And again, the duty cycle is, you know, a couple seconds long. So it's designed for these heater vests. But you know, it's I thought it was kind of nice, you know, weatherproof enclosure. It's inexpensive. You just use the honor off functionality. Oops, I reset it. You just use the honor off functionality. I think it's still possible useful for some project. And I like that you can sew the outer edge here. There's like a little bit of a lip. You can sew it to make a wearable project. So you can cycle through.  Okay, and the star of the show tonight besides you, Lady Eda, our staff, our customers, our community, and everyone who makes all these good things go is okay, we've got the finally after many years, the NAU 7802 strain gauge ADC, it's a Wheatstone bridge ADC, very precise differential input that's designed for strain gauges, but you could probably use it for other sensors as well. This was a product that we actually started designing right before COVID. And then COVID hit, we kind of got busy designing ventilators and face shields. And then we went back to the design, the chip wasn't available, but we did get a shipment finally, of these chips. And so I wanted to get this stem IQT board out, because we sell strain gauges, you'll want to read them. And this is a great I squared C strain gauge reader. It comes with the new photon and a u 7802. This is a 24 bit ADC. We only exposed one of the ADC lines, because most people using us with a strain gauge that you only need one ADC, E minus and E plus are the two exciter sides of the Wheatstone bridge. So left, you know, E minus is ground E plus connects to the voltage output from the NAU, it can generate a voltage between like 2.0 and 4.3 volts. Reason for that is I think it you know, you can get a nice clean voltage reference. There's seven QT ports, so you can just plug it into your microcontroller or board or microcomputer. We've got Arduino code, which I've got on the demo that I'll show. The jelly also showed very kindly. And there's also from Cedar Grove, a great circuit Python slash Python library that you could use with circuit Python board or like a Raspberry Pi or something. So let me show you how it works. So you connect the four points of the Wheatstone bridge strain gauge in this case to the sensor. I actually have the exciter and ADC pins backwards, but it's okay because the Wheatstone bridge is actually symmetric, so it doesn't matter. And then I have some Arduino code working on this feather that I just have plugged in. And you'll see I have the gain up really high. So you'll see like even even me touching this makes the number kind of grow up and down because I'm applying a little bit of strain just picking it up. If I set it down, it'll kind of stabilize a lot more. And then of course you can add more filtering on top. But then if I apply strain, you can see I'm so strong. And then the other way it makes a negative number because it's a differential reader. So you know, of course, you can measure if, you know, positive or negative change in current through the resistive bridge that is attached to this chunk of metal. This is a one kilogram strain gauge. I haven't actually tried it with other Wheatstone bridges, but there's absolutely no reason it wouldn't work with others. So if you have other projects that need a 24 bit ADC and you're okay with, you know, it's not going to go that fast. I'm running this at about 10 Hertz to get good precision out of it. But I think it goes up to about 300. I think you probably use a couple bits lose a few bits of resolution at 300. That's the tradeoff. It's an inexpensive board that's designed for slow measurements of weight. And there you go. So