This is an ongoing project🔨🔩🗜 -
more content will be added. Please share your suggestions in the comments
_______________
IntroductionThis article aims NOT to make you an expert in Arduino programming. I will take you through a properly channeled Arduino Introduction journey. No previous Arduino experience is needed. You will learn Arduino faster, Faster than you had ever thought.
You will get simulation pages for all the examples too. What does it mean to you? You won't just understand the aspects of an Arduino, but you will also play with it. The free Arduino simulator from the Wokwi is used as a learning companion.
Don't worry if you don't get everything in one go. You can go over it once. You will always be able to come back and play with the simulations. You will learn by doing. I effectively do this, providing easy-to-follow projects, starting from elementary to complicated real-life problem-solving projects. You can go through this article at your own pace.
As I said, you will not become an Arduino expert by the end of this article, BUT you will be confident to take on real-world challenges and solve them with Arduino in your way. You can always hop on to the Arduino simulator users group on Discord to help with the Arduino projects or simulations.
A small introduction to the Arduino boards you see aroundArduino UNO board
Arduino Mega Board
Arduino Nano
Eventually, there are many more boards with several features and made for different applications. Let us start with a "Hello World" program in the next session.
Arduino Project 1: Blinking an LED - BasicsBlinking an LED is the "Hello World" equivalent program. In this project, you instruct an Arduino to Turn ON and TURN OFF an LED with a suitable delay.
Before jumping to the code, I would like a show the basic structure of the Arduino code. The code you write is called a sketch. Every sketch will have two parts. setup()
and loop()
.
The code in the setup()
block runs only once - soon after power on or a Reset. This is used to initialise the variables, initialise the interfaces (serial, I2C, LCD etc).
The code in the loop()
block➿ contains code that will run repeatedly all the time. This part is actively used to control the Arduino board. All the logic you put, inputs you read or outputs you drive will be done in this section.
Here is the basic code for the LED blink example
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
In the setup()
function, the mode of the Arduino pin is configured as an output. This is achieved using the below function.
pinMode(LED_BUILTIN, OUTPUT);
Refer to PinMode tutorials for details and other options possible. The loop()
function has four instructions. The first instruction writes a logic HIGH to the pin which is connected to the LED. (here, logic HIGH means 5 V as Arduino is powered from 5 V supply and all Pins will output 5 V when configured as output and HIGH is driven on the pins.) see here for more information on the digitalwrite()
The delay function⌛ makes the Arduino wait for a certain amount of time. The parameter you write inside the parentheses will be in ms. hence, a value of 1000 will be treated as 1 second (1000 ms = 1sec)
Here is the link for the LED blink - Basics 💡you to play around with the project. Here are the tasks which will be interesting to you to accomplish. You can always post your modified projects in the comments. I can have a look as well.
The below GIF image will give you the preview:
Assignments you can create and submit for review
- Can you change the code so that, the LED will blink every 500ms⏳?
- Can you change the LED colour to blue🟦?
In this tutorial, we will take a project which has a press button 👇connected to the Arduino. Let us go 🏃♂️
Here is the link to the Arduino project with a push-button interface. 🔘 You can play with the project, tinker with it to make it your own. Let us have a look at the code.
Firstly, let us start with the setup()
function. You now know that the setup()
function runs only once. it helps in telling the Arduino about the inputs, outputs and other settings to be applied before it starts with the loop()
function. In this case, the setup() function looks like below:
The pinmode(BUTTON_PIN, INPUT_PULLUP)
tells the compiler that we want to set the BUTTON_PIN property to be an input and an internal pullup. It means when there is nothing connected on pin 4 of the Arduino, the voltage level on the Pin 4 will be pulled to high (5V). This keeps the code stable when there is external noise. #define
in the first line maps the BUTTON_PIN
to PIN 4
of the Arduino
In the loop()
function, we added the logic to read the value of the PIN 4 using a built-in function digitalRead()
. The value
will be either 1 or 0 based on the condition of the push button.
Assignments you can create and submit for review
- Change the logic so that the LED will turn OFF when you press the button and will turn ON when you release the button
- Can you change the logic so that the LED will keep blinking as long as the button is pressed?
Additional reading: Read about the bounce feature here
Get to know the Arduino simulatorDocumentation link: https://docs.wokwi.com/
The main site: https://wokwi.com/
Arduino library examples: https://wokwi.com/arduino/libraries
GitHub repo: https://github.com/wokwi
/* Please leave comments if you have any feedback */
___________________
At this point, I encourage you to develop many applications based on your learning, no matter how silly they are. Challenge yourself with tweaks (blink without delay function), blink without digitalWrite function etc.), and you will be able to find answers too. If not, always ping on the Discord discussion page. People are friendly and will always try to help.
We will interface more peripherals to the Arduino and explore them in the next few steps. Let's go! 🚀
Arduino Project 3: Learn about printing text on serial data/serial plotterYou will find it really helpful to have an option to read some messages from Arduino. It can be a status message or a command to the user etc. You can use simple statements such as the code below to get some messages printed on the serial monitor. You also need to study two functions Serial.read()
and Serial.write()
functions.
Serial
.println(1 + 2);
Serial
.println("Hello, How are You!");
I have used it to display temperature from a sensor, distance calculated using ultrasonic sensor, battery voltage, and more. This you can't miss. This is a critical interface and a skill to continue with more complex projects.
You can play send your text messages in the project here.
Secondly, you can use the serial plotter to view the data on the computer screen graphically. You can find the Arduino serial plotter example here. You will be undoubtedly excited to see how good the serial plotter is and the Arduino simulator. This plotter can also be a plot of temperature or a potentiometer knob.
You can find a simple video here as a preview.
You can now spend more time adding some more code for the serial print options and exploring the applications. you can always post the projects you created in the comments. you can always jump on to the Discord server, whenever you need a hand!
Assignments you can submit for review
- Create a project which will create a square wave
- Create a project which can print a text-based game based on the response from the user. You can be creative here ✍✍
The LCD1602 is an LCD with the ability to display 20 characters each in two rows. t is a very basic yet very useful interface to know about. You don't have to write all the code required to make it work. You can use standard Arduino libraries and the Arduino simulator to learn coding LCD and Arduino for your next project.
I advise you to go through the very user-friendly quick guide about LCD1602 and LCD2004 here before you continue. Read it through once or twice. If you have any doubts you know where the helping hands are.
Let us start with a simple example of displaying "Hello World". Come back here after playing with the simulation.
Here is a quick video on how it looks on the simulator.
Spend more time with the LCD. get to know clearly the differences between LCD with a parallel data interface and LCD with an I2C interface. next time, when you go buy them, you will know which one to ask. I2C ones are always easier. They take fewer wires too.
Assignments you can submit for review
- Create a project with 1602 LCD which will scroll your name
- create a project with 1602 LCD with custom characters (hint: follow the guide here to find out about creating custom characters)
- Create a counter project. Connect a push button and display the number of presses on the LCD since power is on.
- Display the time elapsed in seconds on the LCD since power on
The membrane keypads are present everywhere. the keypads find their application in POS, lockers, data loggers and more. The membrane keypads also find applications in control panels, remotes and more!
Let us learn more about it and also build interesting applications using Arduino and a membrane keypad.
Start first with just playing with the existing calculator project on Arduino. If you notice, you can also see that this project involves an LCD as well. The LCD was covered in the previous project. More and more peripherals will be involved in complex projects. Hence a good tip is to learn the basics of each peripheral separately and combine them to build a useful application or a solution.
Here is a video of the project under discussion.
If you look in the editor window, you will see this code section which takes care of the membrane keypad initialisation.
/* Keypad setup */
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', '+'},
{'4', '5', '6', '-'},
{'7', '8', '9', '*'},
{'.', '0', '=', '/'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
The keypad library is one of the standard libraries provided by Arduino. If you look, closely you will see the definition of row pins, column pins and the list of characters in an array. This is where we tell the microcontroller about the layout of the keys.
In the next line, we marry all the properties we defined in the previous lines and instantiate a keypad object. there are several versions of keypads available, and you may have to choose the definition of the keys array as well the simulated Wokwi element accordingly. below are a few examples of possible keypads you will see normally:
Refer to the Wokwi docs on membrane keypad for making your own custom keys for the simulator.
The initialisation is done and now you should look at the functions which are helpful to find out the keys pressed. There are several helpful functions that will accomplish all the functions we need to interact with the membrane keypad. In the given calculator example, find out all the helper functions used. The Arduino safe project also involves a keypad membrane but different keys. Also, study the functions used there related to keypad object. These will give you fair examples of how the functions are used in real-life examples.
I would argue to pause reading right now and complete the previous examples projects (calculator and the Arduino safe project study wrt keypad functions). Come back later.
Assignments you can submit for review
- Change the positions of the keypad in the calculator project so that 7, 8 and 9 will go to the top row and 1, 2 and 3 will come to row second from the bottom. Also, update the keypad in the simulator. you can get help from here for the simulated part. you can always jump to the Discord channel when you need a hand.
- Create a project with the membrane keypad as a control panel. Pressing the number on the key should blink the LED those many times the number.
- Share your own creative use cases as well
The servo motors move the Arduino projects. Servo motors are very much user-friendly compared to other motors. The programming is easy. The software drivers are easily available.
The Servo motors consist of a small intelligent comparator inside which can be programmed using a PWM signal. The angle of rotation is controlled by the pulse width of the PWM signal. What this means is, even if there is a slight offset in the rotation angle (due to the load or due to a small shock) it will be corrected in the next few milliseconds. This Servo motor feature makes it a good candidate for several applications such as robotic arms, dispensers and more.
You can now refresh more about the servo motors on the documentation page for Servo motors. And here are two more references to understand the basics of servo motor operation (link 1, link 2). here are the different versions of the horns you find for the servo motors.
You can find a basic project created for a servo motor here. The code is very simple and can be understood step by step.
#include <Servo.h>
This is the standard library for the Servo motor from Arduino. You don't have to write all the libraries by yourself!
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
Once you create a servo object, you can assign an Arduino pin to it using the below setup()
function.
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
the below code sweeps the Servo
void loop() {
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
Here is a quick short video on how the project looks!
We used a method called write()
to tell the angle of rotation to the servo motor. here are all the methods you need to know in order to complete your Servo motor project successfully.
To
start with you can play with the simulator by limiting the angle of rotation to 90 degrees in either direction. you can also explore the other methods. Each method has an example in the links above.
Assignments you can submit for review
- Create a project which will turn the servo motor angle will change based on the range with ultrasonic sensor
- Create a project where you can drive four servo motors in the same angle direction
- Create a project using LCD, membrane and Servo motor. The user should be able to enter the angle (
0
to180
) using membrane and the LCD should display the entered values. The servo should turn by so much angle later. - Share your creative projects as well
Let us start with a single LED. Before that, a bit of eh introduction to the FastLEDs. Smart LEDs are a great way of creating beautiful projects for various applications. It can be a frame for a great table or a roof. Beautiful rings or some decor as well.
NeoPixel LEDs and smart LEDs are addressable LEDs which has made the hardware setup very simple and sound.
FastLEDs have only three connections
- Power supply
- Data line
- Ground
The Power supply supplies 5 V or 12 V depending on the parts.
In simple terms, the Arduino will send out the values of RGB for each LEDs serially over one line. If there are 2 LEDs, the Arduino will send the data of the first LED (RGB) and then sends the data of the second LED (RGB).
For a series on connected n LEDs, the data would like something like this:
R1G1B1-R2G2B2-R3G3B3-......RnGnBn
Once this data passes through the first LED, the output from the first LED to the second LED looks like this:
R2G2B2-R3G3B3-....RnGnBn
The same thing happens with every LED in series and the final LED will only receive RnGnBn.
_____
Let us start with the signal LED project
Project Link: https://wokwi.com/arduino/projects/296747499944673801
Code
#include <FastLED.h>
// How many leds in your strip?
#define NUM_LEDS 1
// For led chips like WS2812, which have a data line, ground, and power, you just
// need to define DATA_PIN. For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN
// Clock pin only needed for SPI based chipsets when not using hardware SPI
#define DATA_PIN 3
#define CLOCK_PIN 13
// Define the array of leds
CRGB leds[NUM_LEDS];
void setup() {
// Uncomment/edit one of the following lines for your leds arrangement.
// ## Clockless types ##
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS); // GRB ordering is assumed
}
void loop() {
leds[0] = CRGB::Red;
FastLED.show();
delay(500);
leds[0] = CRGB(241, 28, 206);
FastLED.show();
delay(500);
leds[0] = CRGB(28, 25, 226);
FastLED.show();
delay(500);
leds[0] = CRGB(35, 201, 13);
FastLED.show();
delay(500);
leds[0] = CRGB(241, 245, 10);
FastLED.show();
delay(500);
}
You can find a quick look below
CRGB leds[NUM_LEDS];
The above code declares the number of LEDs needed in the project
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS); // GRB ordering is assumed
The above code maps the LED data pin to the FastLED library.
FastLED.show();
Drive the LEDs with the updated data.
GO through the projects present in https://wokwi.com/arduino/libraries/FastLED
Assignments you can submit for review
- Create a project with one smart LED and Arduino Nano
- Create a project with one FastLED and a potentiometer. Change the colours based on the potentiometer values
With a single LED, you could not harness the complete power of the addressable LEDs. You will now look at the code where you will drive LED strips. In these projects, you will be able to create a 1-dimensional pattern. There are projects which run for several meters. In the simulations, there will be no problem with the power requirements or the heat generated by the LEDs. In a practical case, each LED generates heat equivalent to the product of the current and the forward voltage of the LEDs.
you can always visit Reddit FastLED page for any help or hop on to the Discord server for any feedback or solutions.
Project link https://wokwi.com/arduino/libraries/FastLED/ColorPalette
The project looks like shown below:
There are several examples of FastLED projects. To start with, go through the code for the example given above. try to change the logic, time, patterns or transitions. If you find the example bit over the head, do not worry. we will discuss one more example below. This is a simpler one.
Project link: https://wokwi.com/arduino/projects/287938818561016332
Looks like below:
The code for the above code is given below
// Source: https://github.com/s-marley/FastLED-basics
#include <FastLED.h>
#define NUM_LEDS 18
#define LED_PIN 2
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(50);
}
void loop() {
leds[0] = CRGB::Red;
leds[1] = CRGB::Green;
leds[2] = CRGB::Blue;
FastLED.show();
}
The above code is simple to start with. isn't it? you will be able to update all the LEDs with the colours you like. Later, you can create a for loop which will create a simple pattern. There are several resources to explore more capabilities of the FastLED libraries.
Assignments you can submit for review
- Create a project with >30 LEDs in a strip that will lit only one LED at a time in a cycling fashion.
- Create a project with more than 60 LEDs. Try to create a symmetric pattern.
- What is the maximum number of LEDs you can drive with an Arduino UNO board connected to a PC USB port?
Addressable LEDs can also be arranged in rows and columns to form a matrix. The matrix enables you to create 2-dimensional art. Let us see one example with 64 LEDs arranged in an 8x8 fashion
You should be now able to grasp easily the concept behind driving the fastLEDs. the code is given below
#include <FastLED.h>
// How many leds in your strip?
#define NUM_LEDS 64
// For led chips like Neopixels, which have a data line, ground, and power, you just
// need to define DATA_PIN. For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806, define both DATA_PIN and CLOCK_PIN
#define DATA_PIN 7
#define CLOCK_PIN 13
// Define the array of leds
CRGB leds[NUM_LEDS];
void setup() {
Serial.begin(57600);
Serial.println("resetting");
LEDS.addLeds<WS2812,DATA_PIN,RGB>(leds,NUM_LEDS);
LEDS.setBrightness(84);
}
void fadeall() { for(int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); } }
void loop() {
static uint8_t hue = 0;
Serial.print("x");
// First slide the led in one direction
for(int i = 0; i < NUM_LEDS; i++) {
// Set the i'th led to red
leds[i] = CHSV(hue++, 255, 255);
// Show the leds
FastLED.show();
// now that we've shown the leds, reset the i'th led to black
// leds[i] = CRGB::Black;
fadeall();
// Wait a little bit before we loop around and do it again
delay(10);
}
Serial.print("x");
// Now go in the other direction.
for(int i = (NUM_LEDS)-1; i >= 0; i--) {
// Set the i'th led to red
leds[i] = CHSV(hue++, 255, 255);
// Show the leds
FastLED.show();
// now that we've shown the leds, reset the i'th led to black
// leds[i] = CRGB::Black;
fadeall();
// Wait a little bit before we loop around and do it again
delay(10);
}
}
you can find the link to this project as well as other similar FastLED projects. Please go to the Wokwi website -> Arduino library examples -> FastLEDs section for more.
Assignments you can submit for review
- Create a project with 3x3 LEDs where user can play tic tac toe
- Create a project with more than 32 (8x4) LEDs. Try to create a unique pattern
- As the number of LEDs increases so is the total current consumption and the heat dissipation? What are the best practices employed to mitigate the side effects?
NEC is the protocol used in IR remote to transmit commands/information. Here is a very good site with complete details on the protocol. You don't need to know the internal workings of the IR remote or the protocol, but a basic idea is necessary and will be helpful when you venture into projects using IR remote or IR communication in general. Here is a simple image of IR remote. It consists of several buttons. Each button has a unique command byte assigned to it. You will find IR receivers very much smaller and would look something like this in the image.
Project Link: IR remote and IR receiver on Arduino Simulator
The project doesn't do anything useful but provides you the core parts needed to build your project. it receives the IR codes sent by the remote and decodes it. The LCD display is used to display the information on the pressed button.
Here is the connection diagram for the IR remote project using Arduino
The complete code for the project, as usual, is given at the end of this section. here is tee quick guide to understand the project and get to know how IR remote and IR receiver are working together.
1. Below code defines a receiver object. The IR receiver data pin is connected to the Arduino Pin labelled PIN_RECEIVER.
IRrecv receiver(PIN_RECEIVER);
2. Check for any received codes, in the loop function. If there are any IR codes received, then try to decode the received code to understand which button was pressed.
if (receiver.decode()) {
translateIR();
receiver.resume(); // Receive the next value
}
the function receiver.decode()
returns 1 if there was a successful reception of at least one IR code by the receiver. The function translateIR();
is called so that the received code can be decoded and later used to identify the button pressed.
This is done in the loop infinitely. For your application, you need to add logic for the buttons you are interested. You can either directly add the function you would like to run when the button is pressed in the switch case
inside the translate function.
Here is the simulation output of the IR remote project. I hope, you will be able to play with the project and come up with unique ideas to use the IR remote and IR receiver in your next Arduino project.
Here is the complete code for your reference:
#include <IRremote.h>
#include <LiquidCrystal.h>
#define PIN_RECEIVER 2 // Signal Pin of IR receiver
IRrecv receiver(PIN_RECEIVER);
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
void setup()
{
lcd.begin(16, 2);
lcd.print("<press a button>");
receiver.enableIRIn(); // Start the receiver
}
void loop()
{
// Checks received an IR signal
if (receiver.decode()) {
translateIR();
receiver.resume(); // Receive the next value
}
}
void lcdPrint(char* text)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("button pressed:");
lcd.setCursor(0, 1);
lcd.print(text);
lcd.print(" code: ");
lcd.print(receiver.decodedIRData.command);
}
void translateIR()
{
// Takes command based on IR code received
switch (receiver.decodedIRData.command) {
case 162:
lcdPrint("POWER");
break;
case 226:
lcdPrint("MENU");
break;
case 34:
lcdPrint("TEST");
break;
case 2:
lcdPrint("PLUS");
break;
case 194:
lcdPrint("BACK");
break;
case 224:
lcdPrint("PREV.");
break;
case 168:
lcdPrint("PLAY");
break;
case 144:
lcdPrint("NEXT");
break;
case 104:
lcdPrint("num: 0");
break;
case 152:
lcdPrint("MINUS");
break;
case 176:
lcdPrint("key: C");
break;
case 48:
lcdPrint("num: 1");
break;
case 24:
lcdPrint("num: 2");
break;
case 122:
lcdPrint("num: 3");
break;
case 16:
lcdPrint("num: 4");
break;
case 56:
lcdPrint("num: 5");
break;
case 90:
lcdPrint("num: 6");
break;
case 66:
lcdPrint("num: 7");
break;
case 74:
lcdPrint("num: 8");
break;
case 82:
lcdPrint("num: 9");
break;
default:
lcd.clear();
lcd.print(receiver.decodedIRData.command);
lcd.print(" other button");
}
}
Assignments you can create and submit for review
- Create a project with Arduino UNO and blink the LEDs equal to the button pressed. Consider only the buttons from 0 to 9. Ignore the other button presses. You can blink the onboard LED
- Create a project with a servo motor and IR remote. Pressing the up button should rotate the servo in the clockwise direction and pressing the down button should rotate the servo in the counter-clockwise direction.
Until next time!
Arduino Project 11: Learn about Analog temperature sensors and interfacing to ArduinoThe Analog temperature sensor consists of NTC. The resistance of the NTC varies along with the temperature. NTC - Negative temperature coefficient - resistance of the NTC drops along with the rise in temperature. So, you can use NTC and a fixed resistor to form a voltage divider. based on the voltage, you can reverse calculate the temperature. Arduino simulator from Wokwi supports Analog temperature sensors.
Here is the complete code for the analog temperature sensor.
/**
Basic NTC Thermistor demo
https://wokwi.com/arduino/projects/299330254810382858
Assumes a 10K@25℃ NTC thermistor connected in series with a 10K resistor.
Copyright (C) 2021, Uri Shaked
*/
const float BETA = 3950; // should match the Beta Coefficient of the thermistor
void setup() {
Serial.begin(9600);
}
void loop() {
int analogValue = analogRead(A0);
float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
Serial.print("Temperature: ");
Serial.print(celsius);
Serial.println(" ℃");
delay(1000);
}
NTC value read will be converted into the temperature in celsius using the below formula. The BETA value is a unique value. You can find the BETA value from the NTC datasheet.
const float BETA = 3950; // should match the Beta Coefficient of the thermistor
int analogValue = analogRead(A0);
float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
The Analog temperature sensor project link: https://wokwi.com/arduino/projects/299330254810382858
Assignments you can submit for review
- Create a simple project which will blink the LED if the temperature is between 20 and 25 degrees celsius.
- Create an interesting project which can be used to change the colours of the FastLED trip based on the temperature.
- Blue --Cooler temperature, RED -- hotter
Keep posting your projects!
Share your interesting projects and browse through several curious projects from fellow developers and makers on Facebook Wokwi Group!
Stay Safe!
Don't stop learning!
#wokwiMakes
until next time!
Comments