Interface Remote Control RF Module (433mhz) with Pi 4

Welcome to the next tutorial of our raspberry pi 4 programming course. The last guide covered connecting a Sharp infrared distance measurement sensor to a Raspberry Pi 4. Infrared (IR) sensors were demonstrated to be widely used for nearby object recognition and motion tracking. But in this session, we'll utilize Raspberry Pi 4 to create a radio-frequency (RF) remote control that can be used to operate the gadgets wirelessly. With the help of this RF remote control, we can Power On/Off the devices.

Components

Transmitter Side

  • RF Transmitter

  • HT12E IC

  • 4 Push Buttons

  • 750k resistor

  • 9 Volt battery

Receiver Side

  • Raspberry Pi

  • 16x2 LCD

  • 10K POT

  • Breadboard

  • 1K Resistor (Five)

  • 33K resistor

  • HT12D IC

  • RF Receiver 

  • LEDs (Five)

  • 4 10K resistor 

  • Jumper wires

RF Module

This ASK Hybrid Transmitter/Receiver module communicates at 433Mhz. For optimal range and frequency stability, this module utilizes a crystal-stabilized oscillator. The module requires only a single external antenna.

This module is for you if you need RF communication over a great distance at a low cost. The high levels of background noise at this frequency and in its Analog technology mean that this module cannot directly transmit data via the UART communication of a PC or microcontroller. Using encoder and decoder ICs, we may utilize this module to retrieve information from background static.

At full Power, a transmitter's range is over 100 meters; at 5 volts, it's around 50-60 meters when employing a single-code wire antenna measuring just 17 centimetres.

There are two primary limitations placed on the wireless system designer: the system must function within a particular range and send a certain quantity of data within a given data rate. The RF module is incredibly compact and can run on a broad voltage spectrum (from 3V to 12V).

Transmitter and receiver RF modules operating at 433 MHz constitute the bulk of the RF modules. Because the carrier frequency is completely suppressed during transmission of logic zero, the transmitter's power consumption is significantly reduced during battery operation. A logic one signal turns the carrier on to around 4.5mA at 3 volts when it is off at 0 volts. The data is transmitted serially from the transmitter to the tuned receiver. Two microcontrollers are suitably interfaced with the transmitter and receiver for communication.

RF Transmitter Features

  • Range of Operation: 433 MHz

  • Power at the Output: 4-16 dBm

  • Power supply input: 3 to 12-volt dc

Pin Description of RF Tx

  • GND stands for "ground," which indicates a supply connection to the earth.

  • Data in - When serial data is received from an encoder, it is input via this pin.

  • VCC - This jack must be wired to Vcc - +5 Volt.

  • Antenna - The data transmission antenna wraps around this pin.

RF Receiver Features

  • The sensitivity is -105 dBm.

  • IF Rate of 1 megahertz.

  • Less need for a power supply.

  • The current is 3.5 mA.

  • Five-volt power source.

Pin Description of RF Rx

  • GND - Ground

  • Data In - This pin give

  • s output serial data to Decoder

  • Vcc - +5 Volt should be connected to this pin

  • Vcc - +5 Volt should be connected to this pin

  • GND - Ground

  • GND - Ground

  • Antenna - A wrapped connection to this pin for proper Reception of data

Encoder IC usage

The output pin on an HT12E is used for its principal purpose, which is to transmit a 12-bit encoded signal. The IC's built-in Oscillator makes it simple to put it to use. The IC may operate from 2.4V – 12V, although in most cases, +5V is supplied to the Vcc (pin 18), while pin 9 is left unconnected. Connect pin 14 (Transmission Enable) to the ground terminal to start the transmission process. This IC has an integrated oscillator, which is necessary for data decoding. To activate it, we need only connect pins 15 and 16 (OSC1 and OSC2) with a 1M resistor. The address, which is 8 bits long, must be established using pins A0–A7, and the data to be transmitted, which is 4 bits long, must be given to pins AD0–AD1. Your Decoder must have the same address for the two devices to communicate. Below is a simple HT12E IC wiring diagram.

Through the use of a series of ground connections on the address pins, I have programmed the eight-bit address data in the circuit above to read 0b00000000. Any eight pins can be made high by connecting it to 5V to improve security. A +5V supply, such as that provided by a voltage regulator such as 7805, is used to power the entire IC. Any Digital IC capable of supplying the required 4-bit data will do, and its pins AD3, AD2, AD1, and AD0 will be linked to those. They can be connected to switches for manual data transmission and Reception. In this example, I have set all four data bits to be zero (low), and the HT12D decoder IC's output will be the same type of bits. Similarly, if we modify these four bits, the HT12D's output will change accordingly.

The Dout pin is where you'll find the encoded 12-bit value (pin 17). The HT12D has to receive this information to decode it, and it can do so via wire or a wireless channel (such as RF or IR). Following this, you will know the necessary to configure the HT12D.

HT12D RF decoder usage.

HT12D's main job is to interpret the 12-bit signal through the input pin. The IC's built-in Oscillator makes it simple to put it to use. The IC's ground (pin 9) and power (pin 18) terminals should be connected to 5V. This IC has an integrated oscillator, which is necessary for data decoding. It's activated by connecting pins 15 and 16 (OSC1 and OSC2) using a 470K resistor. Received data in increments of 4 bits are available on pins AD0 and AD1, and an address in increments of 8 bits must be programmed using pins A0 through A7. The Decoder's address must match the encoder's if you want to use it successfully. See below for a simplified circuit depiction of the HT12D IC.

Through the use of a series of ground connections on the address pins, I have programmed the eight-bit address data in the circuit above to read 0b00000000. Any eight pins can be made high by connecting it to 5V to improve security. A +5V supply, such as that provided by a voltage regulator such as 7805, is used to power the entire IC. Any Digital IC capable of reading 4-bit data will work with the AD3, AD2, AD1, and AD0 pins. As a bonus, they can be hooked up to an LED so you can see the data being transmitted in real-time. Due to the uncertainty of the Encoder IC's Input signal, the four-bit output data is represented as a question mark. If there is any good information received, it can be read off of these four pins.

The HT12E Encoder IC's description is provided to help you learn how to encode a 4-bit data stream for transmission to the IC's input pin.

Working Explanation

In this setup, four buttons on the transmitter side (the remote) activate corresponding LEDs on the receiver side. Whenever one of the four buttons is pressed, a signal is sent to an encoder IC, which then passes it on to a radio frequency (RF) transmitter, which broadcasts it into the surrounding environment. The RF receiver picks up the signal, which then transmits the 4-bit decoded signal to the Raspberry Pi through the Decoder IC HT12D. The Raspberry Pi will then interpret these data snippets, perform the appropriate action, and activate the corresponding LED. Once a key is pressed, a buzzer will sound for one second. In addition, a 16x2 LCD shows whether the LEDs are on or off.

For the demonstration, this project only uses four LEDs; to initiate any action, press the appropriate button on the "RF Remote." The LEDs may be swapped out for AC home appliances via the relay, and the same "RF Remote" can be used to operate both sets of lights wirelessly. Consequently, you may use the same circuit for your RF-based Raspberry Pi-based home automation project. You can see all of the Home Automation Projects we've produced in the past, including Bluetooth, DTMF, GSM control, and more, right here: Home Automation Projects.

Circuit Explanation

This RF remote control for the Raspberry Pi features an easy-to-assemble circuit consisting of just the Pi board, a few buttons, an LCD, an RF pair, and an encoder/decoder IC. Raspberry Pi manages the LCD, processes input, and communicates results. However, any Raspberry Pi model should do in this case; Raspberry Pi 3 was utilized. The circuit consists of an RF receiver section and an RF transmitter section. The below figure depicts both circuits.

LCD pins rs, en, d4, d5, d6, and d7 from the receiver are wired to GPIO pins 11, 10, 6, 5, 4, 1, and 4 in 4-bit Mode. The RF receiver picks up the signal and decodes it by the HT12D IC once it has been sent from the RF transmitter. Decoder IC pins D8, D9, D10, and D11 of the HT12D are linked straight to wiringPI GPIO pins 25, 24, 23, and 22. LEDs are wired to wiringPi GPIO pins 26, 27, 28, and 29 for output. When a key is pressed, the buzzer connected to wiringPi GPIO 0 sounds an alarm.

The HT12E Encoder IC is part of the RF transmitter circuit, with four buttons used to toggle the LEDs on and off. Every address line in an encoder/decoder IC is grounded.

Installation of wiringPi Library in pi 4

To access the Raspberry Pi's GPIO pins in C, we must use the wiringPi Library, much like how Python programmers include the import RPi.GPIO as an IO header file. You can use Terminal or an SSH client like Putty to execute the commands below one by one to complete the installation. If you want more information on how to work with and set up the Raspberry Pi, read our introduction to  Raspberry Pi tutorial.

sudo apt-get install git-core

sudo apt-get update

sudo apt-get upgrade

git clone git://git.drogon.net/wiringPi

cd wiringPi

git pull origin

cd wiringPi

./build

Test the installation of wiringPi Library by using the below commands:

gpio -v

gpio readall

Programming Explanation

We start by including the necessary header files and defining the LCD's pins, and then we initialize certain variables and connection pins for receiving input and displaying LED indications.

#include "wiringpi.h"

#include "wiringserial.h"

#include "stdio.h"

#include "string.h"

#define RS 11

#define EN 10

#define D4 6

#define D5 5

#define D6 4

#define D7 1

#define led1 26

#define led2 27

#define led3 28

#define led4 29

#define buzz 0

#define d1 25

#define d2 24

#define d3 23

#define d4 22

int am = 0;

int flag1=am ,flag2=am ,flag3=am ,flag4=am;

Then, in the void setup() procedures, we tell all the GPIO Pins what to do.

void setup()

{

   if (wiringPiSetup () == -1)

   {

     clear();

     print("Unable to start"); 

     setCursor(0,1);

     print("wiringPi");

   }

  pinMode(led1, OUTPUT);

  pinMode(led2, OUTPUT);

  pinMode(led3, OUTPUT);

  pinMode(led4, OUTPUT);

We have used the digitalRead and digitalWrite functions in the code to receive and send the Decoder's output to an LED and a device, respectively.

while(1)

   {

        setCursor(0,0);

        print("D1  D2  D3  D4");

        if(digitalRead(d1)==0)

        {

          flag1++;

          setCursor(0,1);

          if(flag1%2==1)

          {

            print("ON ");

            digitalWrite(led1,HIGH);

          }

Additional functions utilized in this project are listed below. To send a command to the LCD, use the void lcdcmd method, and to provide data to the LCD, use the void write function. You can call the void clear() function to reset the LCD. The cursor is used to deliver a string to the LCD instead of printing it. To start the LCD up in 4-bit Mode, call the void to begin, and use the void buzzer() function to make the buzzer sound. Find the complete code for this RF remote control using a Raspberry Pi below.

Full code

#include "wiringpi.h"

#include "wiringserial.h"

#include "stdio.h"

#include "string.h"

#define RS 11

#define EN 10

#define D4 6

#define D5 5

#define D6 4

#define D7 1

#define led1 26

#define led2 27

#define led3 28

#define led4 29

#define buzz 0

#define d1 25

#define d2 24

#define d3 23

#define d4 22

int am = 0;

int flag1=am ,flag2=am ,flag3=am ,flag4=am;

  void lcdcmd(unsigned int ch)

  {

    int temp=0x80;

    digitalWrite(D4, temp & ch<<3);

    digitalWrite(D5, temp & ch<<2);

    digitalWrite(D6, temp & ch<<1);

    digitalWrite(D7, temp & ch);

    digitalWrite(RS, LOW);

    digitalWrite(EN, HIGH);

    delay(10);

    digitalWrite(EN, LOW);

    digitalWrite(D4, temp & ch<<7);

    digitalWrite(D5, temp & ch<<6);

    digitalWrite(D6, temp & ch<<5);

    digitalWrite(D7, temp & ch<<4);

    digitalWrite(RS, LOW);

    digitalWrite(EN, HIGH);

    delay(10);

    digitalWrite(EN, LOW);

  }

    void write(unsigned int ch)

  {

    int temp=0x80;

    digitalWrite(D4, temp & ch<<3);

    digitalWrite(D5, temp & ch<<2);

    digitalWrite(D6, temp & ch<<1);

    digitalWrite(D7, temp & ch);

    digitalWrite(RS, HIGH);

    digitalWrite(EN, HIGH);

    delay(10);

    digitalWrite(EN, LOW);

    digitalWrite(D4, temp & ch<<7);

    digitalWrite(D5, temp & ch<<6);

    digitalWrite(D6, temp & ch<<5);

    digitalWrite(D7, temp & ch<<4);

    digitalWrite(RS, HIGH);

    digitalWrite(EN, HIGH);

    delay(10);

    digitalWrite(EN, LOW);

  }

  void clear()

  {

     lcdcmd(0x01);

  }

  void setCursor(int x, int y)

  {

    int set=0;

    if(y==0)

    set=128+x;

    if(y==1)

    set=192+x;

    lcdcmd(set);

  }

  void print(char *str)

  {

    while(*str)

    {


     write(*str);

     str++;

    }

  }

  void begin(int x, int y)

  {

    lcdcmd(0x02);

    lcdcmd(0x28);

    lcdcmd(0x06);

    lcdcmd(0x0e);

    lcdcmd(0x01);

  }

 void buzzer()

{

     digitalWrite(buzz, HIGH);

     delay(1000);

     digitalWrite(buzz, LOW);

}

  void setup()

{

   if (wiringPiSetup () == -1)

   {

     clear();

     print("Unable to start"); 

     setCursor(0,1);

     print("wiringPi");

   }

  pinMode(led1, OUTPUT);

  pinMode(led2, OUTPUT);

  pinMode(led3, OUTPUT);

  pinMode(led4, OUTPUT);

  pinMode(buzz, OUTPUT);

  pinMode(RS, OUTPUT);

  pinMode(EN, OUTPUT);

  pinMode(D4, OUTPUT);

  pinMode(D5, OUTPUT);

  pinMode(D6, OUTPUT);

  pinMode(D7, OUTPUT);

  pinMode(d1, INPUT);

  pinMode(d2, INPUT);

  pinMode(d3, INPUT);

  pinMode(d4, INPUT);

  digitalWrite(led1, LOW);

  digitalWrite(led2, LOW);

  digitalWrite(led3, LOW);

  digitalWrite(led4, LOW);

  digitalWrite(buzz, LOW);

  begin(16,2);

}

//void loop()

void main()

{

   setup();

   clear();

   print("  RF Module ");

   setCursor(0,1);

   print(" Interfacing ");

   delay(2000);

   clear();

   print("Raspberry Pi");

   setCursor(0,1);

   print("Circuit Digest");

   delay(2000);

   clear();

   print("System Ready");

   delay(1000);

   clear();

  setCursor(0,1);

  print("OFF OFF OFF OFF");

   while(1)

   {

        setCursor(0,0);

        print("D1  D2  D3  D4");

        if(digitalRead(d1)==0)

        {

          flag1++;

          setCursor(0,1);

          if(flag1%2==1)

          {

            print("ON ");

            digitalWrite(led1,HIGH);

          }

          else

          {

            print("OFF");

            digitalWrite(led1,LOW);

          }

          buzzer();

          while(digitalRead(d1)==0);

        }

        else if(digitalRead(d2)==0)

        {

          flag2++;

          setCursor(4,1);

          if(flag2%2==1)

          {

            print("ON ");

            digitalWrite(led2,HIGH);

          }

          else

          {

            print("OFF");

            digitalWrite(led2,LOW);

          }

          buzzer();

          while(digitalRead(d2)==0);

        }

         else if(digitalRead(d3)==0)

        {

          flag3++;

          setCursor(8,1);

          if(flag3%2==1)

          { 

            print("ON ");

            digitalWrite(led3,HIGH);

          }

          else

          {

            print("OFF");

            digitalWrite(led3,LOW);

          }

         buzzer();

          while(digitalRead(d3)==0);

        }

        else if(digitalRead(d4)==0)

        {

          flag4++;

          setCursor(12,1);

          if(flag4%2==1)

          {

            print("ON ");

            digitalWrite(led4,HIGH);

          }

          else

          {

            print("OFF");

            digitalWrite(led4,LOW);

          }

          buzzer();

          while(digitalRead(d4)==0);

        }

}

}

Conclusion

Transmitted modules, which plug into the Raspberry Pi, allow for the transmission of radio frequency signals at a range of 433 MHz to remote receivers. Devices like remote controllers, headphones, baby phones, and additional Raspberry Pis can pick up these signals. An RF module's performance will vary from that of other radio-frequency devices depending on several parameters, such as the strength of the transmitter, which directly affects the range of the signal it can collect. The downside is that this will significantly reduce the battery life of the transmitter device. Using this device with a higher transmission power will also cause interference with nearby RF appliances. The subsequent tutorial will cover the Bluetooth connection between a Raspberry Pi 4 and an ESP32.

Interface Sharp Infrared Distance Measurement Sensor with Raspberry Pi 4

Hello friends, I hope all are fine. Today, we are going to share the 3rd chapter of Section-III in our Raspberry Pi Programming Course. In our previous lecture, we interfaced the Soil Moisture Sensor with Raspberry Pi 4. Today, we are going to Interface the Infrared(IR) sensor with RPi4.

IR Sensor is typically employed for the presence/motion detection of objects in the immediate area. With their low power consumption, straightforward design, and user-friendly features, IR sensors are a popular choice for detection purposes. Infrared(IR) impulses are invisible to the naked eye and lie between the visible and microwave parts of the electromagnetic spectrum. So let's get started:

Components Required

To learn how an IR sensor detects the existence of an object, we'll set up a basic circuit to detect any object. The following electronic components are required for this task:

  • Raspberry Pi 4
  • IR sensor module
  • LED
  • Breadboard
  • Jumper wires

What is IR Sensor?

  • The IR sensor(Infrared sensor) consists of a transmitter and a receiver; the transmitter sends out infrared radiations, which are reflected by the barriers/receiver and get back to the receiver of the sensor.
  • The sensor computes the incoming signal and sets the module's output.
  • With an IR sensor and a Raspberry Pi 4, we can see what's around us, how fast things are moving, and how far away things are from the sensor.
  • There are three connections on this IR sensor: Vcc, Ground, and output.
  • Vcc is linked to 5V, Ground is grounded, and output is the pin, from where we read the sensor's data.

Working Principle

An infrared sensor incorporates an infrared LED(light-emitting diode) and a photodiode, which, when joined together, can function as a photo-coupler or optocoupler. This sensor employs Plank's radiation, Stephan Boltzmann, and Wein's displacement principles of physics.

The infrared LED is a transmitter that produces IR radiations. Visually, the IR LED is identical to a regular LED, although the IR radiation is invisible to the naked eye. Radiation sent out by an infrared source is primarily detected by an infrared receiver. Photodiodes are one physical shape that these infrared detectors can take. Unlike regular photodiodes, IR photodiodes only respond to infrared light. Variations in voltage, wavelength, package size, etc., are the primary categories separating the many types of infrared receivers.

The wavelength of the IR receiver must be the same as that of the IR transmitter whenever the two are utilized together. In this case, an infrared LED acts as the sender, and an infrared photodiode acts as the receiver. An infrared LED produces infrared light, which an infrared photodiode can detect. The amount of IR light collected correlates with the photo-resistance diodes and the resulting shift in output voltage. It is on this concept that the IR detector operates.

Some of the infrared radiation sent out by the transmitter will be reflected back to the receiver. The IR receiver can calibrate the sensor output to the level of the response.

Infrared Detector Varieties

You can choose between active or passive IR sensors when shopping for an infrared detector.

  1. Active IR Sensor

The active infrared sensor, we are going to use in today's project, incorporates both the transmitter and the receiver.

These detectors can receive and process data via radiation from an external source. The signal processor can then be used to extract the data that is required for further analysis. The reflectance sensor and the break beam sensor are the two most common active infrared sensors.

  1. Passive IR Sensor

Passive infrared sensors consist solely of detectors and lack any transmitter. A transmitter or infrared source is used in these sensors. An infrared detector can pick up the object's radiation. The signal is then processed by a signal-understanding device to extract the necessary data.

The pyroelectric detector, the bolometer, the thermocouple-thermopile, etc., are all excellent examples of this type of sensor. Thermal infrared sensors and quantum infrared sensors are two examples of these devices. The wavelength is not a factor for the thermal IR detector. For these sensors to function, they use a hot energy source. Infrared quantum sensors have a fast response and detection times; their sensitivity is wavelength-dependent. To take accurate readings, these sensors must be regularly cooled.

Schematic of an Infrared Detector

The infrared sensor is one of the most common and fundamental sensor circuits in modern electronics. One of the most prominent uses for this sensor is obstacle detection. The following elements are used in IR circuit:

  • LM358 IC 2 IR transmitter and receiver pair
  • Resistors of the range of kilo-ohms.
  • Variable resistors.
  • LED (Light Emitting Diode).

An infrared (IR) sensor located in the transmitter part constantly broadcasts IR waves that are picked up by an infrared (IR) receiver module. How the receiver receives IR photons affects what comes out of its IR output terminal. Because this deviation cannot be examined separately, it can be sent into a comparator circuit. An LM339 operational amplifier (op-amp) is employed in this application as a comparator.

Without a signal, the comparator IC's inverting input has a greater potential than its non-inverting counterpart (LM339). As a result, the LED doesn't light up and the comparator's output drops low. The input's inverting potential will drop when the IR receiver module detects an incoming signal. As a result, the comparator's (LM 339) output gets high, and the LED lights up.

The IR LED Devices, such as the Photodiode, require a current of at least 10 mA, which is maintained by Resistors R1 (100), R2 (10k), and R3 (330). Output terminal adjustments are made with resistor VR2 (preset=5k). Circuit sensitivity is adjusted by resistor VR1 (preset=10k). Learn more about IR detectors by reading up on the topic.

A Transistor-Based Infrared Circuit

Below is a schematic of the IR sensor's transistor-based circuit, demonstrating how to use two transistors for obstacle detection. This circuit's primary function is to detect obstacles in the path of an infrared LED. So, two transistors, such as NPN and PNP types, are all you need to use to construct this circuit. Transistors of the BC547 and BC557 types are utilized, respectively, for NPN and PNP operations.

For the above circuit to work, one IR LED must be ON at all times, while the other IR LED is connected to the base terminal of the PNP transistor. Infrared (IR) LEDs-2, 100-ohm, and 200-ohm resistors, BC547 and BC557 transistors, and a simple LED are all needed for this design.

When an infrared LED is identified, a tiny current is distributed through the sensor, thanks to the object's reflected light. By doing so, the NPN and PNP transistors are turned on, and the LED lights up. You may use this circuit to make automatic lamps that turn on when someone walks into the room.

IR Sensor with Raspberry Pi 4

  • The presence-detection circuit is depicted as follows in the schematic:

  • To construct the circuit depicted in the preceding diagram, we will first attach the Pi 4, the IR sensor, and the LED to the breadboard.

  • We'll hook up the Infrared sensor and LED to the Raspberry Pi using the table as a guide.

Python Code for IR Sensor Object Detection with RPi 4

If you want to use the Raspberry Pi's infrared (IR) sensor to identify an object, you'll need to create a Python script; to do so, launch the nano text editor and navigate to the file named "irsensor.py."

nano ir_sensor.py

This is the Python code we will be writing now:

import RPi.GPIO as GPIO

#importing the library of RPi.GPIO

import time

#importing the library of time

sensor = 16

#declaring BCM pin 16, which is GPIO 23 of Raspberry Pi

led = 18

#declaring BCM pin 18, which is GPIO 24 of Raspberry Pi

GPIO.setmode(GPIO.BOARD)

#declaring the BCM mode of pins

GPIO.setup(sensor,GPIO.IN)

#set the behavior of the sensor as input

GPIO.setup(led,GPIO.OUT)

#set the behavior of led as output

try: 

    while True:

        #initiated an infinite while loop

        if GPIO.input(sensor):

            #checking input on the sensor

            GPIO.output(led, False)

            #led turned on

            while GPIO.input(sensor):

                #checking input on the sensor again

                time.sleep(0.2)

                #generate a time delay of 0.2 seconds

        else:

            GPIO.output(led,True)

            #led turned off if there is no input on the sensor

            except KeyboardInterrupt:

            # terminate the program

            GPIO.cleanup()

            #cleanup the GPIO pins for any other program use

Code explanation

Time and the RPi.GPIO library has been imported, and pins 16 and 18 have been designated with the sensor and the LED, respectively. Setmode = GPIO.BOARD; sensor = input; led = output; these PINs correspond to the board's PINs.

Then, when an object is detected, the sensor's input is checked in an infinite while loop to determine whether or not the LED's brightness should increase. Now run the Python file in your terminal, and you should see the led blink when an object is detected.

When the subject is not in range, and the LED is turned off:

The LED will light up as the object passes over the IR sensor.

Uses for Infrared Sensors

Infrared (IR) sensors can be broken down into several categories depending on their intended use. Examples of how various sensor technologies are typically put to use. It is possible to get numerous motors working in unison using a speed sensor. The sensor's temperature readings are used in factories for climate regulation. The passive infrared (PIR) sensor is employed in an automated door opening system, whereas the ultrasonic (US) sensor measures distance.

The infrared (IR) sensors detailed below can be found in various sensor-based applications and electrical gadgets.

  1. Radiation Thermometers

Features of radiation thermometers, which use infrared (IR) sensors to determine an object's temperature, vary with the object's material and temperature.

  • remote sensing and measurement, where no physical contact is required

  • quicker response

  • Simple Pattern Sizing

  1. Flame Monitors

The light given off by the flames may be detected, and the fire's progress can be tracked with such gadgets. Flames emit a wide spectrum of light, from ultraviolet to infrared. Numerous types of detectors, including PBS, PbSe, Two-color detectors, and pyroelectric detectors, are utilized in flame monitors.

  1. Gas Analyzers

Gas analyzers use IR sensors to analyze gas based on their absorption characteristics in the IR region. Two techniques are utilized: dispersive and non-dispersive. In the dispersive method, the emitted light is separated spectroscopically, and the absorption is analyzed to determine the gas composition and sample quantity. The non-dispersive method, also known as NDIR technology, is the more widely used technique. It employs optical filters similar to sunglasses to filter out unwanted radiation and determines the absorption without spectroscopically separating the emitted light. NDIR analyzers are commonly used for carbonated drinks, while non-dispersive analyzers are frequently used for automotive exhaust gas analysis and fuel leak detection.

  1. IR Imaging Devices

An IR imaging device generally applies IR waves due to its invisible property. It finds use in thermal cameras, night vision equipment, and others. All objects, including water, rocks, soil, vegetation, the atmosphere, and human tissue, emit IR radiation, which the Thermal infrared sensors measure within the IR spectrum to create a map of the object/area's temperature distribution. Thermal cameras are often made up of Sb (indium antimonite), Gd Hg (mercury-doped germanium), and Hg Cd Te (mercury-cadmium-telluride) sensors. 

Conclusion

The IR sensor's transmitter continuously sends out infrared beams, which bounce back when they encounter an object. The receiver of the IR module then detects these beams, resulting in a high output from the IR sensor. IR technology has various applications in daily life and industries, such as televisions, where an IR sensor detects signals from a remote control. In this article, we have integrated the IR module with the Raspberry Pi 4 and demonstrated the functioning of the IR module through a simple object detection project.

So, that was all for today. In the next lecture, we will interface PIR Sensor with Raspberry Pi 4. Till then, take care. Have fun!!!

Interface a Ws2812 RGB with Raspberry Pi 4

Thank you for joining us today for our in-depth Raspberry Pi programming tutorial. The previous guide covered the steps necessary to connect a fingerprint scanner to a Raspberry Pi 4. In addition, we developed a python script to complement the sensor's ability to identify fingerprints. Yet, in this guide, we'll discover how to interface a ws2812 RGB to a Raspberry Pi 4.

Bright, colorful lights are the best, and this tutorial shows you how to set up Fully Configurable WS2812B led strips to run on a Pi 4 computer as quickly and flexibly as possible. In that manner, you can have the ambiance of your home reflect your tastes.

In most cases, when people talk about a "WS2812B Strip," they mean a long piece of extensible PCB with a bunch of different RGB LED Nodes spread out and dotting all along the top. As a bonus, WS2812B strips can be addressed individually. Each RGB node can independently set its own color and brightness. The functionality of non-addressable RGB strips will be identical to that of WS2812B strips. WS2812B Strips are superior in every way, allowing for more imaginative LED light shows. It is possible to create more complex animations, stripes, and chases by individually programming the actions of each LED Node.

The "WS" in WS2812B indicates that this is the second major revision of this design; "World Semi" refers to the chip's original equipment manufacturer, "2812" to its specific part number, and "B" to its revision number. Each WS2812B LED Node contains an integrated circuit chip, as shown below.

Fully Configurable Strip LEDs now come in wide varieties. It's important to remember whether the strip operates on 5 volts or 12-volt power. To power our 5V-powered Raspberry Pi Computer, we need to use a 5V power supply. Or we'll have to install extra gear to meet the 12v Dc power specifications. LED Node densities also vary across WS2812B LED strips. Since our strip consists of WS2812B nodes soldered onto rigid PCBs, it may also be controlled by the Python script included in this article. ws2812B LED strips are the ideal LEDs to use because of the benefits above. What this manual entails is listed below.

The control mechanism implemented in this tutorial works with WS2812B LED nodes, whether they are rigidly coupled on a PCB or flexibly arranged over a long strip. No prior experience with Raspberry Pi has required, thanks to our comprehensive online raspberry pi 4 for the introduction. You should be able to follow these guidelines if you've read at least chapter 1. 

Where To Buy?
No.ComponentsDistributorLink To Buy
1Jumper WiresAmazonBuy Now
2Raspberry Pi 4AmazonBuy Now

WS2812B protocol

Let's go over the protocol for these addressable LEDs so you can see how they function. Each WS2812B unit's red, green, and blue LEDs can be independently controlled to one of 256 brightness levels. Each LED module needs 24 bits of data or three groups of eight brightness bits. Here's a quick rundown of the steps involved:

  • The first LED in the string receives this data stream from the microcontroller, which consists of eight green bits, eight red bits, and eight blue bits.

  • In the case of several LEDs, the data sequence for the second LED begins with green, red, and blue information immediately after the information for the first LED. The process repeats itself until each LED is turned on.

  • The first LED acts as a receiver for data for all subsequent LEDs in the chain and then sends that data to the second LED without applying the same sequence.

  • When the original "number one" LED unit runs out of binary LED sequences, it passes the baton to the next available unit.

What You Need

What follows are detailed instructions for configuring a single Raspberry Pi board to manage many individually addressable LEDs.

  • A pi 4

  • 5v led strip

  • A DC barrel jack to 2-pin terminal block adapter. 

More than 30 WS2812B strip Nodes will necessitate the usage of an external power supply. Even with highly efficient LEDs, producing brilliant light takes a lot of energy. On average, each pixel will consume 20mA, and while projecting white light at full brightness, each pixel will consume 60mA. This information shows us that 30 Pixels can consume 600mA on average and 1.8A at full brightness. As a side note, staring directly into a room with the lights set to full white causes blind spots in my vision. Because of this, I typically set the brightness of my WS2812B lights to 20%. Ensure your WS2812B strip's power source is adequate for the illumination level you intend to achieve.

In today's world, 3.3V data logic is compatible with most WS2812B LED nodes. The GPIO Pins on a Raspberry Pi have an operational voltage range of 0 to 3.3V; therefore, this works out perfectly. This surface-mounted WS2812B strip Node has seen five minor changes since its inception. Since the earlier WS2812B strip can only work on 5V Data Logic, a logical level shifter may be necessary if you're experiencing strange or intermittent issues.

Assembling Hardware

We'll configure our Raspberry PI to look and act like a desktop PC because that's how most people use computers at home and because it's the most user-friendly setup for novice makers. To convert our Raspberry Pi into a desktop computer, we'll need to install a micro-SD card pre-flashed with the operating system. Then hook it up to a monitor via HDMI and a mouse/keyboard combo. Also, this is a good moment to install a small heatsink on the Raspberry Pi Board's central processing unit IC. Look at the image below to see the setup adjacent to a short WS2812B LED strip with three wires protruding from it. The WS2812B has three wires that have not yet been connected to the Raspberry Pi. WS2812B LED Strip PCBs are often marked with arrows to indicate the direction of data flow. It is a common problem in troubleshooting when this is ignored.

How to Configure Hardware for WS2812B Chains with fewer than 30 Nodes We need to plug in the 5V WS2812B Strip's three wires to the Raspberry Pi before turning the power on. Link the Raspberry Pi's 5V Power Input Pin with the Red Power Cable. Join the white wire labeled "Ground" to the Pi's Ground pin. Join the Raspberry Pi's Green Input Pin to its GPIO 18 port. It is important to remember that the Green Input Pin could be any GPIO pin as long as the appropriate adjustments are made in your Python programs. In this manual, GPIO 18 will be used for the Data Line in all scripts. The picture below shows how these three wires are joined together. This straightforward system can provide power and data transmission for a limited amount of LEDs.

Hardware Configuration for a WS2812B Strip with more than 30 Nodes in Length. However, the Pi 4 Power Pin Out is not powerful enough to power a full LED strip. It's important to know the power requirements of fully addressable WS2812B LEDs, especially when used in large quantities. 150 fully illuminated RGBW LEDs should be manageable by a high-quality 5v 4A power supply.

Following the diagram below, we will connect a 5V 4A power source via a DC barrel jack. Our WS2812B LEDs are pre-soldered with one green data wire, two red power wires, and two white ground wires. The white wire should be attached to the DC barrel jack's negative terminal using a screwdriver. Join the Red Wire to the Terminal With the Positive Screw Down. The White Connectors all link to one other, indicating a Common Ground shared by the Raspberry Pi and the power source. The two devices can't be connected without ground, which will prevent voltage fluctuations and data transmission mistakes.

Furthermore, the WS2812B Strip is no longer connected to the Pi 4 computer via a red power wire. We have found an alternative to using a Raspberry Pi to run our system. See the diagram below for details on connecting a Raspberry Pi to a string of WS2812B LEDs so that they may be controlled remotely.

There are several great best practices to keep in mind if you're planning on powering many LED strips. If you need to run more than a 5-meter roll of LEDs, I recommend consulting the adafruit documentation on the subject. It's important to think about heat and currents.

Now that everything is hooked up how you like it, you can turn on the Pi 4 System by inserting a USB-C cable.

Set up of software.

You'll need to install a few packages if you're starting with a clean install of Raspberry Pi OS. Since this is the case, WS2812B LEDs will function properly. When you plug the Raspberry Pi into an electrical outlet and finish the initial boot-up wizard, you will be taken to the operating system's familiar desktop.

Click the black button in the upper left corner to open a new terminal window. An interactive terminal will launch. Below is a picture of this happening, with a huge red arrow indicating the pressed terminal icon.

With this terminal window, we can search for specific programs and download them from the internet. Here are the command lines you use in the terminal to install everything you need. Type | Y | to confirm installs if prompted.

sudo pip3 install rpi_ws281x

sudo pip3 install adafruit-circuitpython-neopixel

sudo python3 -m pip install --force-reinstall adafruit-blinka

You now have the software and programming packages installed on your Device to power and run WS2812B properly.

Flashing led demonstration

You may trigger the Raspberry Pi to turn on the associated WS2812B LED strips in various ways. To begin, I will utilize the simplest and quickest technique, which involves hooking up this Raspberry Pi to a monitor, mouse, and keyboard so that I can execute Python scripts directly to control it. Below, you'll find the best and most fun Python script to start with: | strandtest.py |. Even though it's far more involved than the rest of the Python scripts in this tutorial, we felt it was essential to include it first because it provides a comprehensive overview of the various possible patterns and lighting styles.

import time

from rpi_ws281x import *

import argparse

LED_COUNT      = 30     

LED_PIN        = 18      

LED_FREQ_HZ    = 800000  # LED signal frequency in hertz (usually 800khz)

LED_DMA        = 10      # DMA channel to use for generating a signal (try 10)

LED_BRIGHTNESS = 65      # Set to 0 for darkest and 255 for brightest

LED_INVERT     = False   # True to invert the signal (when using NPN transistor level shift)

LED_CHANNEL    = 0       # set to '1' for GPIOs 13, 19, 41, 45 or 53

def colorWipe(strip, color, wait_ms=50):

    """Wipe color across display a pixel at a time."""

    for i in range(strip.numPixels()):

        strip.setPixelColor(i, color)

        strip.show()

        time.sleep(wait_ms/1000.0)

def theaterChase(strip, color, wait_ms=50, iterations=10):

    """Movie theater light style chaser animation."""

    for j in range(iterations):

        for q in range(3):

            for i in range(0, strip.numPixels(), 3):

                strip.setPixelColor(i+q, color)

            strip.show()

            time.sleep(wait_ms/1000.0)

            for i in range(0, strip.numPixels(), 3):

                strip.setPixelColor(i+q, 0)

def wheel(pos):

    """Generate rainbow colors across 0-255 positions."""

    if pos < 85:

        return Color(pos * 3, 255 - pos * 3, 0)

    elif pos < 170:

        pos -= 85

        return Color(255 - pos * 3, 0, pos * 3)

    else:

        pos -= 170

        return Color(0, pos * 3, 255 - pos * 3)

def rainbow(strip, wait_ms=20, iterations=1):

    """Draw rainbow that fades across all pixels at once."""

    for j in range(256*iterations):

        for i in range(strip.numPixels()):

            strip.setPixelColor(i, wheel((i+j) & 255))

        strip.show()

        time.sleep(wait_ms/1000.0)

def rainbowCycle(strip, wait_ms=20, iterations=5):

    """Draw rainbow that uniformly distributes itself across all pixels."""

    for j in range(256*iterations):

        for i in range(strip.numPixels()):

            strip.setPixelColor(i, wheel((int(i * 256 / strip.numPixels()) + j) & 255))

        strip.show()

        time.sleep(wait_ms/1000.0)

def theaterChaseRainbow(strip, wait_ms=50):

    """Rainbow movie theater light style chaser animation."""

    for j in range(256):

        for q in range(3):

            for i in range(0, strip.numPixels(), 3):

                strip.setPixelColor(i+q, wheel((i+j) % 255))

            strip.show()

            time.sleep(wait_ms/1000.0)

            for i in range(0, strip.numPixels(), 3):

                strip.setPixelColor(i+q, 0)

# Main program logic follows:

if __name__ == '__main__':

    # Process arguments

    parser = argparse.ArgumentParser()

    parser.add_argument('-c', '--clear', action='store_true', help='clear the display on exit')

    args = parser.parse_args()

    # Create NeoPixel object with appropriate configuration.

    strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)

    # Intialize the library (must be called once before other functions).

    strip.begin()

    print ('Press Ctrl-C to quit.')

    if not args.clear:

        print('Use "-c" argument to clear LEDs on exit')

    try:

        while True:

            print ('Color wipe animations.')

            colorWipe(strip, Color(255, 0, 0))  # Red wipe

            colorWipe(strip, Color(0, 255, 0))  # Blue wipe

            colorWipe(strip, Color(0, 0, 255))  # Green wipe

            print ('Theater chase animations.')

            theaterChase(strip, Color(127, 127, 127))  # White theater chase

            theaterChase(strip, Color(127,   0,   0))  # Red theater chase

            theaterChase(strip, Color(  0,   0, 127))  # Blue theater chase

            print ('Rainbow animations.')

            rainbow(strip)

            rainbowCycle(strip)

            theaterChaseRainbow(strip)

    except KeyboardInterrupt:

        if args.clear:

            colorWipe(strip, Color(0,0,0), 10)

Get started with Python using an IDE like Thonny IDE. You can use any Python Interpreter you like, as Thonny IDE is one of many. Thonny IDE can be accessed through the Application Menu under the Programming submenu. Then, copy the above code inside Thonny Python Editor and save it as strandtest.py on your desktop. Proceed by clicking the large green Run button. See what happens when you do that in the image below.

With that, you should see vibrant hues coming from your LED strip. If individual LEDs on your WS2812B LED Strip aren't lighting up, but the others are, open the Python script, locate the variable labeled LED COUNT, and raise its value till it's in line with the number of LEDs on your strip. The script can be saved and re-run by clicking the Run button. To accommodate the enormous quantity of WS2812B LED Strip, I set this variable to 150. In the next image, you can see a long WS2812B strip that has been wired to an external power source and is controlled by the modified Python script.

Basic Code for WS2812B LED Tape

Now you can check if your Device is properly constructed and functioning with the help of the above strandtest.py script. Moreover, the resulting illumination is just breathtaking. Maker may be left wanting more, though. This is of special importance to the readability of the code, which facilitates its adaptation to specific tasks. This section will show you how to control the WS2812B strip with a few basic Python programs easily modified to suit your needs.

To get started, look at OneStripNeopixels.py, a very basic WS2812B Control Script.

import time

import board

import neopixel

#Initialise, a strips variable, provide the GPIO Data Pin

# utilized and the amount of LED Nodes on the strip and brightness (0 to 1 value)

pixels1 = neopixel.NeoPixel(board.D18, 55, brightness=1)

#Also, create an arbitrary count variable

x=0

pixels1.fill((0, 220, 0))

#LED Node 10 and the color Blue were selected

pixels1[10] = (0, 20, 255)

#Showing a different color

time.sleep(4)

#Below will loop until variable x has a value of 35

while x<35:

    pixels1[x] = (255, 0, 0)

    pixels1[x-5] = (255, 0, 100)

    pixels1[x-10] = (0, 0, 255)

    #Add 1 to the counter

    x=x+1

    #Add a small time pause which will translate to 'smoothly' changing color

    time.sleep(0.05)

#Below section is the same process as the above loop, just in reverse

while x>-15:

    pixels1[x] = (255, 0, 0)

    pixels1[x+5] = (255, 0, 100)

    pixels1[x+10] = (0, 255, 0)

    x=x-1

    time.sleep(0.05)

#Add a brief time delay to appreciate what has happened    

time.sleep(4)

#Complete the script by returning all the LEDs to the off

pixels1.fill((0, 0, 0))

The Python script has been thoroughly commented on, so you should have no trouble following along. The script in the previous paragraph includes readily apparent dials and switches. You'll learn the fundamentals of making a captivating LED Pattern, including how to adjust the number of LED Nodes, the brightness of the LED strips, whether to illuminate the entire board or just a section of it and how to illuminate individual LEDs. Each Node color can be customized by entering a corresponding Red, Blue, or Green numeric value. A number can have any value between zero and 255. The term "RGB Color Code" is commonly used to describe this. While experimenting with different hues can be a lot of fun, the best method to find the precise shade you need is to use a website that lists RGB color codes. Choose any color on this site, and you'll get its corresponding RGB color code in three numbers. After you've located the three-digit color code, you can easily enter it into the Python program.

You can copy and paste the script into Thonny IDE and run it. Once you've saved the file, you can press the run button to activate the script. Below are some screenshots displaying the output.

Control Several LED Strips at Once

Next is to hook up a few different LED Strips to the Pi 4 SBC and run a Python script to manage everything. Hardware-wise, I've replicated the procedure described in Hardware Configuration for Small, fewer than 30 Nodes long WS2812B, adding a second, similarly-sized WS2812B LED Strip.

I wired an additional WS2812B strip of lights up to the GPIO in the manner described below. The Raspberry Pi's other 5V Pin was connected to the red power line. The Raspberry Pi's White Ground Wire was attached to the board's second Ground Port. In this case, GPIO 21 received the green data wire. Check out the diagram of the wired components below; using two WS2812B LED strips of varying density is fine.

Using Thonny IDE as previously, run the python script titled TwoStripsNeopixels.py to control these two WS2812B Strips in a no-frills fashion. Look at this thoroughly documented Python script down here.

#include all necessary packages to get LEDs to work with Raspberry Pi

import time

import board

import neopixel

#Initialise two strips variables, provide the GPIO Data Pin

# utilized and the amount of LED Nodes and brightness (0 to 1 value)

pixels1 = neopixel.NeoPixel(board.D18, 30, brightness=1)

pixels2 = neopixel.NeoPixel(board.D21, 6, brightness=1)

#Focusing on a particular strip, use the command Fill to make it all a single color

#based on decimal code R, G, B. Number can be anything from 255 - 0. Use an RGB Colour

#Code Chart Website to quickly identify a desired fill color.

pixels1.fill((0, 255, 0))

pixels2.fill((0, 0, 255))

#Sleep for one second, and then code repeats for different color combinations. Light changes

#Could happen instead in response to certain buttons being pressed or due to threshold values

time.sleep(1.5)

pixels1.fill((200, 200, 0))

pixels2.fill((0, 200, 200))

time.sleep(1.5)

pixels1.fill((50, 70, 215))

pixels2.fill((215, 50, 70))

time.sleep(1.5)

pixels1.fill((0, 0, 0))

pixels2.fill((0, 0, 0))

Note that a Pi 4Computer has four Data Wire locations that can control individual WS2812B LED Strips, provided the corresponding Python script is updated correctly. The pinouts are numbered as follows: GPIO18, GPIO21, GPIO12, and GPIO10. With some tweaking and development of this technique, you can use a single Raspberry Pi as a standalone controller for four individually addressable WS2812B strips.

Ensure the right number of LED Nodes has been assigned to both LED WS2812B Strips before running the script. Once the script is ready to be executed, click the Thonny IDE's large green Run button. Both strands will suddenly come to life, each filled with a unique color. In the picture below, you can see this in action.

Conclusion

In this tutorial, we looked at connecting a WS2812B led strip to a Raspberry Pi. We also programmed the LEDs to blink in various patterns and colors using Python. You may now explore with your raspberry pi and these led strips to create patterns or whatever you like. Next, we'll look at connecting a Pi 4 to a sharp infrared distance measurement sensor.

Interface a Fingerprint Sensor with Raspberry Pi 4

Hello friends, I hope you all are going great. Today, I am going to share the 10th tutorial of Section-III in our Raspberry Pi Programming Course. In our previous tutorial, we interfaced a Gas Sensor MQ-2 with Raspberry Pi 4. Today, we will be interfacing a Fingerprint Sensor with Raspberry Pi today.

After appearing only in science fiction films until recently, fingerprint sensors are often employed to confirm an individual's identity in various contexts. Today, fingerprint-based systems are used for everything from checking in at the office to verifying an employee's identity at the bank, withdrawing cash from an ATM, and proving one's identity at a government agency. For identifying purposes, fingerprint-detecting technology has been used for some time now.

Fingerprint recognition systems, in general, have advantages over other biometric technologies in terms of speed, affordability, and reliability. Ridges on a fingerprint model make for distinctive whorls and loops, making each fingerprint one-of-a-kind.

There are five different kinds of fingerprints: the whorl, the right circle, the left loop, the tented, and the arch. Most fingerprint identification systems have difficulty telling similar fingerprint types apart. Numerous fingerprint recognition methods exist, and neural networks are utilized to find ridge ends and other details needed to find a match.

Project Description

In today's project, we will design a security system using an optical fingerprint sensor with Raspberry Pi 4. We will use a 16x2 LCD to display the results. Moreover, we will use four buttons: one to enroll a new fingerprint, one to delete a previously stored one, and two more to adjust the index position of fingerprints currently in use.

When the fingerprint reader is ready to accept a finger for matching, an LED will light up. When the user will place his finger on the sensor, the sensor will start scanning it. If the fingerprint matches with any of the stored prints, the lock will open up, otherwise, it will generate a warning.

Components Required

These are the components required to design a fingerprint-based security system using Raspberry Pi 4:

  • Raspberry Pi 4
  • USB to Serial converter
  • Fingerprint Module
  • Push buttons
  • 16x2 LCD (Optional)
  • Bread Board
  • Jumper wires
  • LED
  • 10k pot
  • Resistor 150 ohm -1 k ohm

What is the Fingerprint Scanner?

  • A fingerprint scanner is an electronic/optical sensor, used to scan and detect fingerprints.
  • It can enroll multiple fingerprints in its built-in memory, a normal sensor can save around 100 fingerprints in its database.
  • Moreover, it also has the capability to match a fresh fingerprint with the fingerprints in its database.
  • This device's unique fingerprint biometric technology allows for increased precision, superior performance, and unbreakable security.

If you're concerned about safety, a fingerprint scanner is an excellent alternative to a keycode because the password can be easily scanned but is challenging to get a person's fingerprint. Therefore, normally a fingerprint scanner/reader in conjunction with biometric software for verification, identification, and authentication is used in highly secured places.

Optical, ultrasonic, and capacitive fingerprint readers are the three most typical kinds today. We used optical fingerprint sensors. It uses a camera-like gadget to snap an image of a fingerprint on a glass surface from a predetermined distance. Some optical sensors have added components of primitive artificial intelligence to verify that a living finger is being put on the reader, providing an extra layer of protection.

Fingerprint Sensor Working Principle

Processing plays a crucial role in the fingerprint sensor's operation. There are two essential parts of fingerprint processing i.e.

  • Enrollment of Fingerprint.
  • Matching of Fingerprint.

Each user must place their finger twice during the enrollment process.

This way, the system verifies the fingerprints for processing, creates a fingerprint pattern and saves the information. While in the matching process, the user lays a finger on the sensor and the system checks it against the templates stored in its memory.

Circuit Diagram of Fingerprint Sensor with Raspberry Pi 4

  • The fingerprint module, we are using is UART-based. So, we need to connect a USB-to-Serial adapter to connect the fingerprint module to the Raspberry Pi.
  • Here's the circuit diagram of the Fingerprint Sensor with Raspberry Pi 4:


So, let's design it on real hardware. It's easy to set up:

  • We used a USB-to-serial converter to link the Raspberry Pi's USB port with the fingerprint module.
  • All notifications are shown on a 16x2 LCD.
  • LCDs often have a 10k pot for adjusting contrast.
  • Each 16x2 LCD's RS, EN, d4, d5, d6, and d7 connections are wired to the Raspberry Pi GPIO pin: 18, 23, 24, 25, 8, and 7 respectively.
  • GPIO 5, 6, 13, and 19 on the Raspberry Pi are wired to four buttons.
  • LED is wired to RPI's Pin 26.
  • Here are the images of our hardware setup:

Fingerprint Sensor Python Library Installation

Now that we've finished hooking everything up, we can power on the Raspberry Pi and open the terminal. Now, let's look at how to install a fingerprint library for the Python code:

  • Step 1: This library requires administrator access to be installed. So, let's use the following command to get root access:

sudo bash

  • Step 2: Then, using the provided commands, you may download the necessary packages:

wget –O – http://apt.pm-codeworks.de/pm-codeworks.de.gpg | apt-key add –

wget http://apt.pm-codeworks.de/pm-codeworks.list -P /etc/apt/sources.list.d/

  • Step 3: The next step is to update our Pi 4 and deploy the acquired fingerprint sensor library:

sudo apt-get update

sudo apt-get install python-fingerprint –yes

  • Step 4: Once the library has been installed, you can verify the USB port where your fingerprint reader is attached by typing the following command:

ls /dev/ttyUSB*

On the other side of the screen, change the USB port number with the number of the USB connection you have.

Python Code For Fingerprint Sensor

Python code Operation

Running the Python code will display some introductory prompts on the LCD, after which the user will be instructed to place a finger on the fingerprint reader. Now if the fingerprints are matched with the stored prints in the sensor's database. LCDs will read something like "Fount at Pos:2" if your fingerprint has been stored there, or "No Match Found" if it has not been.

Users can enroll a fingerprint by pressing the register button and then reading the on-screen prompts.

If you want to erase a fingerprint, LCD will ask where it is located. The user can now erase a previously saved fingerprint by selecting it using the two increment/decrement push buttons and then pressing the enroll button (which now acts as the Ok button). Watch the video that is provided as part of the final deliverable to get a better grasp on the subject.

Python Code Designing

Using the fingerprint library methods in Python, connecting a fingerprint sensor with the Raspberry Pi is a breeze. If the user insists on creating the interface on their own, things could get tricky.

Since we already used the library, all that's left to do is call the appropriate library function. Defining the pins for the LCD, LED, and push buttons requires first importing libraries of fingerprint, GPIO, and time into the code.

import time

from pyfingerprint.pyfingerprint import PyFingerprint

import RPi.GPIO as gpio

RS =18

EN =23

D4 =24

D5 =25

D6 =8

D7 =7

enrol=5

delet=6

inc=13

dec=19

led=26

HIGH=1

LOW=0

  • The following step is to initialize and assign functions to the pins:

gpio.setwarnings(False)

gpio.setmode(gpio.BCM)

gpio.setup(RS, gpio.OUT)

gpio.setup(EN, gpio.OUT)

gpio.setup(D4, gpio.OUT)

gpio.setup(D5, gpio.OUT)

gpio.setup(D6, gpio.OUT)

gpio.setup(D7, gpio.OUT)

gpio.setup(enrol, gpio.IN, pull_up_down=gpio.PUD_UP)

gpio.setup(delet, gpio.IN, pull_up_down=gpio.PUD_UP)

gpio.setup(inc, gpio.IN, pull_up_down=gpio.PUD_UP)

gpio.setup(dec, gpio.IN, pull_up_down=gpio.PUD_UP)

gpio.setup(led, gpio.OUT)

  • Having successfully initialized the fingerprint sensor, let's move on:

try:

    f = PyFingerprint('/dev/ttyUSB0', 57600, 0xFFFFFFFF, 0x00000000)

    if ( f.verifyPassword() == False ):

        raise ValueError('The given fingerprint sensor password is wrong!')

except Exception as e:

    print('Exception message: ' + str(e))

    exit(1)

  • We've built some functions to initialize and control the LCD; the complete code is included below.

def begin(), def lcdcmd(ch), def lcdwrite(ch), def lcdprint(Str), def setCursor(x,y)

We have placed fingerprint enrolling, searching, and erasing functions after completing the authoring of all LCD driver functions.

  • Call the def enrollFinger() method to enroll or save fresh fingerprints.
  • The def searchFinger() function retrieves fingerprints from a database.
  • When the appropriate button is pressed, the def deleteFinger() function is called to remove the already stored fingerprint.

The Python source code for all of the functions above is included below.

Next, we'll ask the user to place their finger on the sensor to verify their identity, and the system will determine if that print is valid before displaying the findings.

begin()

lcdcmd(0x01)

lcdprint("FingerPrint ")

lcdcmd(0xc0)

lcdprint("Interfacing ")

time.sleep(3)

lcdcmd(0x01)

lcdprint("Circuit Digest")

lcdcmd(0xc0)

lcdprint("Welcomes You  ")

time.sleep(3)

flag=0

lcdclear()

while 1:

    gpio.output(led, HIGH)

    lcdcmd(1)

    lcdprint("Place Finger")

    if gpio.input(enrol) == 0:

        gpio.output(led, LOW)

        enrollFinger()

    elif gpio.input(delet) == 0:

        gpio.output(led, LOW)

        while gpio.input(delet) == 0:

            time.sleep(0.1)

        deleteFinger()

    else:

        searchFinger()

Output

Complete code

import time

from pyfingerprint.pyfingerprint import PyFingerprint

import RPi.GPIO as gpio

RS =18

EN =23

D4 =24

D5 =25

D6 =8

D7 =7

enrol=5

delet=6

inc=13

dec=19

led=26

HIGH=1

LOW=0

gpio.setwarnings(False)

gpio.setmode(gpio.BCM)

gpio.setup(RS, gpio.OUT)

gpio.setup(EN, gpio.OUT)

gpio.setup(D4, gpio.OUT)

gpio.setup(D5, gpio.OUT)

gpio.setup(D6, gpio.OUT)

gpio.setup(D7, gpio.OUT)

gpio.setup(enrol, gpio.IN, pull_up_down=gpio.PUD_UP)

gpio.setup(delet, gpio.IN, pull_up_down=gpio.PUD_UP)

gpio.setup(inc, gpio.IN, pull_up_down=gpio.PUD_UP)

gpio.setup(dec, gpio.IN, pull_up_down=gpio.PUD_UP)

gpio.setup(led, gpio.OUT)

try:

    f = PyFingerprint('/dev/ttyUSB0', 57600, 0xFFFFFFFF, 0x00000000)

    if ( f.verifyPassword() == False ):

        raise ValueError('The given fingerprint sensor password is wrong!')

except Exception as e:

    print('Exception message: ' + str(e))

    exit(1)

def begin():

  lcdcmd(0x33) 

  lcdcmd(0x32) 

  lcdcmd(0x06)

  lcdcmd(0x0C) 

  lcdcmd(0x28) 

  lcdcmd(0x01) 

  time.sleep(0.0005)

def lcdcmd(ch): 

  gpio.output(RS, 0)

  gpio.output(D4, 0)

  gpio.output(D5, 0)

  gpio.output(D6, 0)

  gpio.output(D7, 0)

  if ch&0x10==0x10:

    gpio.output(D4, 1)

  if ch&0x20==0x20:

    gpio.output(D5, 1)

  if ch&0x40==0x40:

    gpio.output(D6, 1)

  if ch&0x80==0x80:

    gpio.output(D7, 1)

  gpio.output(EN, 1)

  time.sleep(0.005)

  gpio.output(EN, 0)

  # Low bits

  gpio.output(D4, 0)

  gpio.output(D5, 0)

  gpio.output(D6, 0)

  gpio.output(D7, 0)

  if ch&0x01==0x01:

    gpio.output(D4, 1)

  if ch&0x02==0x02:

    gpio.output(D5, 1)

  if ch&0x04==0x04:

    gpio.output(D6, 1)

  if ch&0x08==0x08:

    gpio.output(D7, 1)

  gpio.output(EN, 1)

  time.sleep(0.005)

  gpio.output(EN, 0)

def lcdwrite(ch): 

  gpio.output(RS, 1)

  gpio.output(D4, 0)

  gpio.output(D5, 0)

  gpio.output(D6, 0)

  gpio.output(D7, 0)

  if ch&0x10==0x10:

    gpio.output(D4, 1)

  if ch&0x20==0x20:

    gpio.output(D5, 1)

  if ch&0x40==0x40:

    gpio.output(D6, 1)

  if ch&0x80==0x80:

    gpio.output(D7, 1)

  gpio.output(EN, 1)

  time.sleep(0.005)

  gpio.output(EN, 0)

  # Low bits

  gpio.output(D4, 0)

  gpio.output(D5, 0)

  gpio.output(D6, 0)

  gpio.output(D7, 0)

  if ch&0x01==0x01:

    gpio.output(D4, 1)

  if ch&0x02==0x02:

    gpio.output(D5, 1)

  if ch&0x04==0x04:

    gpio.output(D6, 1)

  if ch&0x08==0x08:

    gpio.output(D7, 1)

  gpio.output(EN, 1)

  time.sleep(0.005)

  gpio.output(EN, 0)

def lcdclear():

  lcdcmd(0x01)

def lcdprint(Str):

  l=0;

  l=len(Str)

  for i in range(l):

    lcdwrite(ord(Str[i]))

def setCursor(x,y):

    if y == 0:

        n=128+x

    elif y == 1:

        n=192+x

    lcdcmd(n)

def enrollFinger():

    lcdcmd(1)

    lcdprint("Enrolling Finger")

    time.sleep(2)

    print('Waiting for finger...')

    lcdcmd(1)

    lcdprint("Place Finger")

    while ( f.readImage() == False ):

        pass

    f.convertImage(0x01)

    result = f.searchTemplate()

    positionNumber = result[0]

    if ( positionNumber >= 0 ):

        print('Template already exists at position #' + str(positionNumber))

        lcdcmd(1)

        lcdprint("Finger ALready")

        lcdcmd(192)

        lcdprint("   Exists     ")

        time.sleep(2)

        return

    print('Remove finger...')

    lcdcmd(1)

    lcdprint("Remove Finger")

    time.sleep(2)

    print('Waiting for same finger again...')

    lcdcmd(1)

    lcdprint("Place Finger")

    lcdcmd(192)

    lcdprint("   Again    ")

    while ( f.readImage() == False ):

        pass

    f.convertImage(0x02)

    if ( f.compareCharacteristics() == 0 ):

        print "Fingers do not match"

        lcdcmd(1)

        lcdprint("Finger Did not")

        lcdcmd(192)

        lcdprint("   Mactched   ")

        time.sleep(2)

        return

    f.createTemplate()

    positionNumber = f.storeTemplate()

    print('Finger enrolled successfully!')

    lcdcmd(1)

    lcdprint("Stored at Pos:")

    lcdprint(str(positionNumber))

    lcdcmd(192)

    lcdprint("successfully")

    print('New template position #' + str(positionNumber))

    time.sleep(2)

def searchFinger():

    try:

        print('Waiting for finger...')

        while( f.readImage() == False ):

            #pass

            time.sleep(.5)

            return

        f.convertImage(0x01)

        result = f.searchTemplate()

        positionNumber = result[0]

        accuracyScore = result[1]

        if positionNumber == -1 :

            print('No match found!'

            lcdcmd(1)

            lcdprint("No Match Found")

            time.sleep(2)

            return

        else:

            print('Found template at position #' + str(positionNumber))

            lcdcmd(1)

            lcdprint("Found at Pos:")

            lcdprint(str(positionNumber))

            time.sleep(2)

    except Exception as e:

        print('Operation failed!')

        print('Exception message: ' + str(e))

        exit(1)

def deleteFinger():

    positionNumber = 0

    count=0

    lcdcmd(1)

    lcdprint("Delete Finger")

    lcdcmd(192)

    lcdprint("Position: ")

    lcdcmd(0xca)

    lcdprint(str(count))

    while gpio.input(enrol) == True:   # here enrol key means ok

        if gpio.input(inc) == False:

            count=count+1

            if count>1000:

                count=1000

            lcdcmd(0xca)

            lcdprint(str(count))

            time.sleep(0.2)

        elif gpio.input(dec) == False:

            count=count-1

            if count<0:

                count=0

            lcdcmd(0xca)

            lcdprint(str(count))

            time.sleep(0.2)

    positionNumber=count

    if f.deleteTemplate(positionNumber) == True :

        print('Template deleted!')

        lcdcmd(1)

        lcdprint("Finger Deleted");

        time.sleep(2)

begin()

lcdcmd(0x01)

lcdprint("FingerPrint ")

lcdcmd(0xc0)

lcdprint("Interfacing ")

time.sleep(3)

lcdcmd(0x01)

lcdprint("Circuit Digest")

lcdcmd(0xc0)

lcdprint("Welcomes You  ")

time.sleep(3)

flag=0

lcdclear()

while 1:

    gpio.output(led, HIGH)


    lcdcmd(1)

    lcdprint("Place Finger")

    if gpio.input(enrol) == 0:

        gpio.output(led, LOW)

        enrollFinger()

    elif gpio.input(delet) == 0:

        gpio.output(led, LOW)

        while gpio.input(delet) == 0:

            time.sleep(0.1)

        deleteFinger()

    else:

        searchFinger()

Conclusion

In this case, biometric authentication was implemented. To verify the identity of a user, fingerprint authentication uses an automated comparison of their fingerprint with a fingerprint template. In the next tutorial, we will discuss how to interface a Heartbeat Sensor with Raspberry Pi 4. Stay tuned. Have fun!!!

How Modern Technology is Redesigning Online Poker?

We all know technology is not only changing trends and habits, but it is also reshaping the way we live our daily lives. We are not talking about centuries ago, but even if we examine the previous two decades, everything, from our communication style to our travel means, from our shopping habits to our entertainment industry, is changing rapidly, and this has both pros and cons. In a broader view, we can say that positive impacts are more dominant than negative effects on our lives. Maybe you have the opposite opinion, but I can prove this with the help of a simple and general example that I am going to discuss in detail with you. Just like almost every other sport and game, poker has some visible technical changes, and people can play poker online. Clients and casinos are getting more and more benefits from technical assistance. We are talking about the facts and ways in which modern technologies are reshaping and redesigning online poker. Different technologies, such as artificial intelligence, are changing the way online poker works, and we will try to find the ways and facts by which this change is being seen by experts.

Collectively, we can say that the advancement in technology has positively revolutionized online poker. There are some negative points about modern technology, but the score of the positive points is higher; therefore, we have talked more about these. The techniques such as AI, machine learning, 3D machines, AR, VR, and some others are the backbone of this change, and it seems like these changes are unending because of the advancement in technology every year. If you are interested in more details then you must visit Ignition starting hands guide for the best tips and tricks on online poker.

History of Online Poker

The history of online poker is just as important as the history of the internet because, with the advancement of the internet in the 1990s, many games, including online poker, were introduced for game lovers. This growth was so interesting that everyone was attracted to the internet and online gaming, whether they were players or game developers. Many big names in the world of online poker made a great audience out of this niche, and people are moving more and more towards online poker every year.

In the records of online poker, the first visible name is Planet Poker, which was developed in 1998. This was just the start, and the real fame of online poker started in the 2000s. Another name in the poker game is more interesting. After qualifying through an online satellite tournament, Chris Moneymaker won the 2003 World Series of Poker (WSOP) Main Event, helping to popularize the game and attract more players to online poker sites.

In the market for online poker, the next few years were significant, and these played a vital role in attracting a great community to online poker. The main reason for this was, the great bonuses and discounts offered by these online websites and the great community that was involved with amazing skills there. People were getting more and more discounts by simply signing up the new accounts, and this was an attractive point in the growth of online poker.

But in this journey, there were many ups and downs, and here it is important to mention that the industry was rocked in 2006 by the passage of the Unlawful Internet Gambling Enforcement Act (UIGEA) in the United States, which made it illegal for banks to process online gambling transactions. This resulted in a decline in the US market, which had previously been one of the largest for online poker.

Despite this time, the history of online poker has undergone a positive reshaping with the advancement in technology. People seem more convenient to have this game online because of the vast community and more facilities. This will be clear with the help of the points that we are going to share with you.

Role of Modern Technology in Redesigning Online Poker

Now we are talking about some points that will justify that there are many effects of technology on online poker and in every era, we are facing the ups and downs of poker and the conclusion will be made after this discussion. 

Better Safety and Security of Players

When players are connected virtually, the first thing that comes to their mind is the transparent results and the security of the rights of the players. The developers have made the system so secure to win the confidence of the players. Modern technology has helped the owners of the system to minimize the chance of cheating and to reduce the chance of using chat bots and cheating codes to win the game. With the advancement of technology, the algorithms are becoming more and more secure to win the trust of thousands of people at the same time.

An interesting point here is to mention of the involvement of the companies like poker operators that are playing a vital role to improve security and to enhance the level of trust towards online poker platforms.

Personalized and Better Poker Experience

With the advancement in the technologies like artificial intelligence, poker is becoming more and more interesting because of the fantastic features and the availability of the options of personalization that not only gives a quality experience to the players but the rules and options are so clear that even a new player can understand all of them easily without any major issue. This is making online poker more common among the new generation and is still the favorite of the previous one.

For the best gaming experiences, the personalization of the profile and the game is playing an important role. It seems like many controls of the profile are in the hand of the player and he can easily use his profile image in different ways for the best experience.

Role of Data Fusion in Complex Decisions

Data fusion is one of the most significant points in modern technology, and if we purely talk about poker, this game is full of thrill because of its complex decisions and tactics of the game that every player must be pro in to get the best position. The advanced technology helps the player to get a better experience with the help of data fusion. This makes the game more realistic as all the players are in the same database and there is no need of putting the information manually, this makes the user experience better.

With the advancement in artificial technology, machine learning has helped the system to perform better every day by learning from the behaviour of the users every time they play.

Ease of Playing Online Poker

The start of the technology was amazing and easy, but with the passage of time and the introduction of new games and platforms, all of them are using modern technology. With the advancement in it, people have the easiest way to reach these platforms, and by the same token, the availability of multiple choices for online poker has made it more interesting to have the game as every online platform has its features and expertise. So, every user has a variety of online poker platforms with the advancement of technology, and this is the winning point of online poker.

Online Groups in Poker

As we have said, with the advancement in technology, the major work is done on the database of the players, which makes it possible to play with your groups at the same time without any issues. The traditional way of playing poker is to play at a table, and it seems perfect to play with friends in such an environment, but technology has made it possible to play with your own friends on the same table with pre-defined and decided rules according to your mode and choice. Any game with a friend is interesting, and poker is the best option to spend quality time with your friends and loved ones.

Variations with the Advancement of Technology

This is the nature of the human that more variety means more fun, especially if it is about the games. It is observed that real games do not offer more variety than online games because, because of the advancement in technology, the variations in the games are provided to the players so that every time they play, they enjoy a different type of game according to the mode.

Poker is a mind game, and every type of player needs a different game according to their skills. For example, a player at the beginner level will need some relaxation and want to play with the new players for practice. These types of facilities are provided with an online platform with the help of modern technology that gives challenges to players of the same rank and the same skills. The same is true for vice versa.

Modern Technologies of Poker for its Reshaping

Till now, our focus was to justify the points to make clear why the reshaping of online poker is related to modern technology. This time, we are moving to the expert level and will talk deeply about the technology to prove our previous discussion. Online poker and casinos are popular niches globally, and people find it more convenient to play on their mobile devices, desktops, and computers rather than going to the real markets where less security and transparency are provided. To make it more popular, many techniques are being used, and some of these are given next:

Virtual Reality Technology for Online Poker

One of the most popular technologies that we have seen in the market for online poker is virtual reality, which is not only related to this particular topic but to several fields of gaming. When we think about online poker, the only thing that we might miss is the interaction of the people just like in the real world. To overcome this deficiency, now techniques like virtual reality are used with the help of which, the players can interact and deal with the other players conveniently and can read their profiles to learn about their games and their positions. This helps a lot to the players to make the strategy and to have the perfect move at the perfect time. To make it more real, headsets and motion sensors are used for augmented reality, or simply AR, which helps the user gain knowledge about other players and the rules of the game they are playing so that they may have the strategy to win the game. The information about the objects and the working of the object is also related to it and this gives the player a more engaging and realistic experience. 

Blockchain Technology in Modern Poker

If we say that blockchain technology has revolutionized the world of online poker, then it will not be wrong because it is proven in many ways, and in such games, the most important feature is the security and privacy that are provided by the blockchain.

To make sure that every transaction is safe and clear, the blockchain provides many features, that help the online platform win the trust of its users. This means that the player will have a tension-free game with the confidence of having the perfect result without any cheating.

3D Machines in Modern Poker

If we are talking about modern techniques, then how can we forget the 3D machines? To have an immense and real-time experience in online poker, people are using 3D machines, which give a highly interesting experience in such games.  The 3D animation is closer to the real world and the fantastic design gives the best experience with creativity.

The graphics and character modelling of these machines make the game more interesting. The animations make the game more engaging, and the players feel it is more realistic and have a better experience.

We should mention here that the technologies we have mentioned here are not only convenient for the players but also for the developers and the owners of online poker. This gives the player the independence of playing and getting the reward most transparently and conveniently. So, this reshaping of online poker with modern technology is helpful.

Multi-Dimensional Arrays in Python

Hello learners! Welcome to the next episode of the arrays, in which we are moving towards the details of the arrays at an advanced level. In the previous lecture, we covered the introductions and fundamentals of arrays, dimensional arrays, and array operations. One must know that the working of the arrays does not end with simple operations, and there is a lot to learn about them. Arrays and their types are important topics in programming, and if we talk about Python, the working and concepts of the array in Python are relatively simple and more effective. The details of the advanced types of arrays will prove this statement. We have a lot of data to share with you, and for this reason, we have arranged this lecture. It is important to understand the reasons behind the reading of this lecture.

  • What are two-dimensional arrays, and how can we perform them in a Jupyter notebook?

  • How can we access all the elements of the two-dimensional arrays?

  • Can we insert the elements in the two-dimensional arrays?

  • How do we update our 2D array?

  • Is the appending process easy in the 2D arrays in Python?

  • Explain three-dimensional arrays and provide an example of how the array is updated.

All of these are important interview questions, and you will learn the concept through its practical implementation, so stay with us till the end of this lecture to get all the answers.

Two-Dimensional Array in Python

We all know a lot about one-dimensional arrays and have seen these concepts at different levels. In this type, we are dealing with the arrays at an advanced level, and to understand them, we will work on the Jupyter notebook. The second type of array is a little bit different, and we can say it is twice as difficult as the one discussed before. We all know the concept of dimensions from physics classes, and these concepts are also true for arrays. These are also referred to as "multi-dimensional arrays," and we define them as:

“The 2-D arrays are the type of arrays that are shown by two indices, and these contain rows and columns to save the data in the form of matrices.”

As you can guess, these are comparatively more complex than the one-dimensional arrays, and storing the data in them is more useful and has many applications in real life. While performing the example of a 2D array, we are going to use the simpler way where the user just has to mention the numbers of rows and columns and an array is ready. 

Syntax of a 2D Array in Python

array-name = [ [d1, d2, .... ,dn], [e1, e2, .... ,en] ]

Here,

d1,d2,...,dn=number of elements in the first dimension

e1,e2,...,en=number of elements in the second dimension

The numbers of the elements vary from zero to infinity. For more detail, have a look at the example given next:

#Initializing the two-dimensional array

array_input = [ [10.9,78.9,111.90] ,[8.0,771.2,2.0] ]

#showing the elements of each dimension separately

print("The elements in the first dimension = " ,array_input[0])

print("The elements in the first dimension = " ,array_input[1])

So you can see that the initializing of the array with the floating elements is done in the first step. Here, the point to notice is the usage of square brackets, and you have to remember that no other type of array is used in this case. 

Accessing the All Elements of Array

In the previous case, you have seen that if we wanted two or more elements as output, there was a need for more than one print function. Yet, there are also cases where the whole elements of an array are required on the screen. For this, the programmers use different types of iterations according to the requirements and get the results. We have seen the working of the iterations many times in this course and therefore, there is no need to explain why we use it. Arrays are one of the best examples to check the working of the iterations. In all the examples of the arrays, you will see the use of for loop in the nested form because we are dealing with  two-dimensional arrays.

Inserting New Elements in 2D Arrays

One must be wondering how we can add more elements to the two-dimensional arrays because of the matrix-type arrangement of the lament. For this, the method is simple, and by discussing it, we will learn the “input” method of Python. Have a look at the code given next, and we will discuss the details in just a bit. 

#importing the array from the Python 

import array as twoDArray 

#declaring our array with two dimensions of the order 2 by 2

twoDArray = [[2,2,2,2,2,2,2], [6,6]]

print("Array before insertion of elements: ", twoDArray)

#Inserting the elements in the matrix at position three

twoDArray.insert(3, [4,7,4,2,9])

print("Array after insertion of elements: ")

#Using nested for loop to inset the elements one after the other at the required position

for x in twoDArray:

    for y in x:

        print(y,end = " ")

    print()

The following points are to be discussed according to this concept:

  • Importing the array makes the code easy and effective.

  • The two-dimensional array is nothing but the arrangement of elements in the form of rows and columns. 

  • The number of rows and columns is not restricted to each other, that is, there is no restriction on using the square array all the time, and the number of elements in rows and columns may be different from each other.

  • The square brackets are used in the two-dimensional arrays in every case, whether it is the outermost bracket or dimensional bracket. 

  • Special functions such as insert, delete, etc. can be used by using the dot operator with the name of the array. 

  • To insert the elements in the two-dimensional array, a nested for loop is efficient where two loops are being used. The syntax is important in this case. 

Other rules of the code are discussed in different lectures in this course. 

Updating of the Elements in an Array

The next case that we are going to discuss is the updating of the elements in the arrays. Think about the situation when you first declare the array and work with it, but after some time, you have to change some of the elements of the arrays. In such cases, the insertion and deletion operations that must be done are time-consuming. The best way to do this is to update the elements directly. The reason why I mention this detail is that arrays are unchangeable data types in other programming languages such as C++, and once declared, the arrays can not be altered in such languages. Yet, Python gives us the ease to update, delete, insert, and change the arrays in the programs. We know programming is a vast procedure and there are several ways to do the same task, but for you, we have picked the simplest and most interesting way to do so that is given in the code next:

#Importing the array

import array as Updation

#Declaring a two-dimensional array

Updation = [[22,56,4,1], [2,4,6,8,10]]

print("Array before Updation of elements: ", Updation)

 #updating the elements in the second array and the third element of the first array

Updation[1] = [44,89,2,0]

Updation[0][3] = 5

print("Array after update of elements: ")

#using nested for loop to print the array

for x in Updation:

    for y in x:

        print(y,end = " ")

We are now able to understand such codes; therefore, there is no need for long descriptions. But, the point here to notice is, in the same code, merely by declaring the elements at certain positions, the array can be updated and the previous values are then ignored. 

Appending the values in the Array

In the previous lecture, the element at the end of the one-dimensional array was appended easily. Yet, you must think that more detail is required for the appending of the data because it has to be mentioned where the exact place is where you want to append the data. So, if you remember the previous lecture then you will find it different to append this type of array.

#importing the array 

import array as myArray

#initializing our array

myArray = [[1.4,66.90,234.0], [009.6,127.8,34.0,11.34], [0,2]]

print("Elements of my array = ", myArray)

#Using the length operator to check the length before appending the elements

length=len(myArray)

print("Length of the array before appending: ", length)

#The process of appending

myArray.append([7.9,334.90,2303])

#calculating and printing the length after appending elements

length=len(myArray)

print("Length of the array after appending: ", length)

#printing  the results after appending

for x in myArray:

    for y in x:

        print(y,end = " ")

    print()

The difference is clear; the number of elements can be easily compared with the help of the length function. We have used the length function many times in this course, and here you can see a better example of how to use it.

Three Dimensional Array

The three-dimensional array is the most complex form of the array discussed so far, and usually, at this level, the learner does not go into the details of the three-dimensional arrays to avoid complexity. The 2D array has many interesting applications and has the ability to store a lot of data in a cleaner way; therefore, 3D arrays are not used much for learning purposes, but if we talk about complex applications such as gaming and other fields, the 3D arrays have a great scope. 

The form of the 3D array can be understood by keeping the matrix of the order 3x3 in mind. Here is a little information about the initialization of the three-dimensional arrays in the Jupyter notebook. 

#initializing my three-dimensional array

ThreeD=[[[22.5,[67.9],[44.4]],[5],[23.8]],[[12,[123],[893]],[0],[78],[126]],[[70],[11]]]

print("The three dimensional array =  ", ThreeD)

#Simply updates the elements by mentioning the locations and values.

ThreeD[0][0][0] =11

ThreeD[1][0][0]  =21

ThreeD[0][0][1] =111

#Printing the results 

print("After updating the elements the array = " ,ThreeD)

Hence, this picture gives us information about the shape and form of the three-dimensional arrays. Do not think that 3D arrays have the form of a 3-by-3 matrix. I suggest you take a deep look at the brackets of the array that we have mentioned here. The complexity of the three-dimensional array is much greater than in previous cases. To make it simple, we have used the single element in the single brackets, but there are more options for the same work that will be unnecessary to learn right now. 

Another thing to be mentioned here is that, for simple operations such as displaying and updating the elements, there is no need to import the array every time. Yet, we have used it to display the proper professional coding of the array. We are not talking about the three-dimensional arrays in more detail because they are very difficult to understand and because there are some other options that work better than the three-dimensional arrays. You will learn it in detail in the next lectures. 

Therefore, we can say that we have learned a lot about the advanced level of arrays in Python which are two-dimensional arrays and three-dimensional arrays. It is interesting to note that dealing with arrays is much easier in Python than in any other programming language. Therefore, we always say that Python is interesting and easy to learn. The topic ends here, but the detail of data type is not limited to just the types of array. You have to learn a lot about iit,and we are here to share every single and necessary detail in a simple way. So, stay with us in this learning phase.

Python Arrays Practice in Jupyter Notebook

Hello Python programmers! Welcome to the engineering projects where you will find the best learning data in a precise way. We are dealing with Python nowadays, and today, the topic of discussion is the arrays in the language. We have seen different data types in Python and discussed a lot about them in detail till now. In the previous lecture, we saw the details of the procedures in dictionaries. There are certain ways to store the data in the different types of sequences, and we have highlighted a lot about almost all of them. It is time to discuss the arrays, but before this, it is better to understand the objectives of this lecture:

  • Introduction to arrays

  • Difference between contiguous and non-contiguous memory locations

  • One-dimensional arrays

  • Functions in arrays

What are Arrays in Programming Languages?

If you are from a programming background, then you have surely heard the name "arrays" and used them in your practice. Yet, if you are a beginner, you must know that arrays are present in almost all types of high-level programming languages. The array is also the way to organize and store the data in a sequential way, but it has some very basic characteristics, most of which are similar to those of other data types, but some are a little bit different, and we will work on both of these types. But before that, let's take a look at the basic definitions of an array:

“An array is a collection of items that are stored in contiguous memory locations. The idea is to group together items of the same type.”

This makes calculating the position of each element easier by simply adding an offset to a base value, i.e., the memory location of the array's first element. These are used to store a gigantic amount of data in different departments and offices, and because it is an old technique, people prefer it to other types such as sets, lists, and dictionaries.

Contiguous Locations in Array

When working with arrays, you will always notice the term "contiguous," and it makes sense because it is the best word to describe the structure of the array. It is the finite collection of data in which the elements are arranged strictly one after the other in the successive locations of memory, and in this way, a contiguous structure is obtained just like a ladder in a horizontal way. If you think it is all about knowing about the contiguous memory locations, then you are wrong. But, it is better to understand the concept by comparing it with the help of the opposite of it, that is the non-contiguous memory places.

Sr #

Feature

Contiguous Memory Allocation 

Non-Contiguous Memory Allocation 

1

Definition

Contiguous memory locations are the type of allocation that allocates a continuous block of memory without skipping any places. 

Non-contiguous memory allocation, on the other hand, is the type in which memory is not continuous but separate blocks of memory are allocated regardless of how little space exists between them. 

2

Complexity

The control of the operating system is easy in it because the memory can be smoothly be accessed. 

In this case, controlling the OS is comparatively difficult.

3

Execution time

The execution time is faster as compared to the other type, and it makes sense because the compiler does not have to sense the gap and then jump according to the length of the gap. 

In this case, the execution time is longer than in the first case because the compiler jumps from one memory location to the other. The time is determined by the gaps between the allocated memory.

4

Overhead

Because there are fewer address translations when dealing with contiguous memory allocation, there is less overhead.

Because the address translation is greater in this case, we have more overhead.

5

Special Features

The contiguous memory allocation contains single-partition allocation as well as multi-partition allocation.

When dealing with non-contiguous memory allocation, paging and segmentation are observed.

6

Type of Fragmentation

These include both internal and external fragmentation in the case of contiguous memory allocation.

The internal fragmentation does not occur in this case, and we get only external fragmentation.

7

Swap-in process

It is noted that the swap-in process can only be arranged in the space that was originally allocated.

If we talk about the non-contiguous memory allocation, the swap-in process is arranged in any memory allocation, so we get versatility in this case.

8

Wastage of memory

In this case, the wasted memory varies according to the array we are using. 

It is an advantage of this type of allocation that no memory is wasted in this case.

9

Types 

There are only two types of contiguous memory allocation:


  1. Fixed(or static) partitioning

  2. Dynamic partitioning


The hint for this point is also given in another feature.

We observe five types in this case that are mentioned below:

  1. Paging

  2. Multilevel Paging

  3. Inverted Paging

  4. Segmentation

  5. Segmented Paging


All of this is unnecessary in our case; thus, do not go into detail about this type of situation.

Importing the Array in Python

This is the distinguishing feature of arrays in Python when compared to other programming languages. Arrays, like many other functions and data types, are pre-defined in Python for the convenience of programmers. Because arrays are very general data types that programmers frequently use, it is simple to declare and import arrays in the same line and then begin working with the arrays. There are several ways to use arrays in Python, one of which is to import the arrays. Have a look at the details of this process:

There are different steps that are to be followed when dealing with the arrays in Python, and these are mentioned here:

  1. Import the arrays.

  2. Declare the name. 

  3. Use the array in different operations. 

Hence using these steps, the arrays are used in different ways and it is interesting to notice that the declaration and the usage of an array are very different in Python as compared to other higher-level programming languages such as C++, C#, etc.

To understand well, let us see all these steps in action, but I want to discuss the type of the arrays with you while performing all these steps so that we may understand both these concepts one after the other.

Dimensions in the Arrays 

Here is the point of the array that makes it different from the dictionaries and sets we have mentioned before. The arrays can be made in three ways:

  • One-dimensional array

  • Two-dimensional array

  • Three-dimensional array

Now it's the choice of the programmer according to the requirement, which type of array is he or she using. The details of each of them will be shared with you in just a bit, but before that, open your Jupyter notebook so that we can apply these arrays practically side by side.

  • Go to the search area of the window and get the Jupyter notebook there.

  • A screen will appear in front of you, and you have to go to the drop-down menu that is present on the right side of the screen.

  • Choose python there and wait for the new tab to open on your browser. 

  • Click on the new cell location and start coding. 

One-Dimensional Array

The most basic and commonly used array is one, and it does not require much effort for you to understand its concept. The very basic structure of the array that we see in the examples and discussion The elements are arranged one after the other, and the index starts at the first place where the zero number is assigned to that location. All the elements are linearly arranged, and it is the simplest form of array that is easy to create and access. In this way, the programmer gets the collection of the same data type in a linear format. The array is then stored in a variable to be used in different ways.

#importing the arrays from the Python library

import array as myArray

result = myArray.array('i', [22,68,123,90,49,167,66,129])

# accessing elements of array and printing it

print("Accessing the first element ", result[0])


print("Accessing the fourth element ", result[3])

The following output is observed as a result:

Hence, the single elements can be accessed in this way. Have you noticed that in the array, we have mentioned the “i” before, and after that, a list is being used? It has a very special reason, and you can check this by deleting the “i” in the code. You will observe that the compiler is throwing an error about the declaration of the Unicode character. Always remember that if the programmer is using the import array method in Python, there is a rule in Python for using arrays that the first argument of the array is always a Unicode character.

Functions for the Arrays in Python

Here comes the reason why we are importing the arrays into Python. The primary reason is, it has multiple functions that make the work super easy, and the programmers do not have to write the codes again and again. I am just sharing the very basic and common functions. So let’s jump to the codes:

count() in Python using Array

Take the example in your mind that when you are dealing with a gigantic amount of data at the same array and it becomes tedious to search for the frequency of the particular item. In such cases, when the detail of the element appearing in the array is required, the count function is used. The working of this function can be understood with this example:

#Declaring our array of strings

import array as myArray

result = myArray.array('i', [22,68,123,90,49,34,67,22,90,33,7,11,8,44,11,77,23,90,28,541,490,299,611,20,561,112,3,88,167,66,129])

#Using the count function to get frequency

print(result.count(90))

So, when we check the frequency of the number 90, we get the following output:

Hence, we can easily conclude that in our array, the integer 90 appears three times. 

append() in Python Array

The next function that is to be tested is the append function. For this, we add a new element at the end of the array, and doing this is very simple, as you can see in the code given next:

#Declaring our array of integers

import array as myArray

result = myArray.array('i', [22,68,123,90,49,34,67,22,90,33,7,11,8,44,

                             11,77,23,90,28,541,490,299,611,20,561,112,3,88,167,66,129])

#appending a new 90 at the end of array

result.append(90)

print(result)

reverse() in Python Array

The next function is reverse(), and as you can guess, the reverse of the array can be obtained with the help of a short command that we are going to test in the code next:

#Declaring our array of strings

import array as myArray

result = myArray.array('i', [22,68,123,90,49,34,67,22,90,33,7,11,8,44,

                             11,77,23,90,28,541,490,299,611,20,561,112,3,88,167,66,129])

result.reverse()

print(result)

As you can see, the order of all the elements is reversed in such a way that the first element is the last and vice versa.  

Consequently, in this lecture, we have seen the details of arrays in a different way than when the introduction was done at the start. After that, we have seen what the workings of the contiguous memory location are and how it is different from the other types of contiguous memory locations. Different functions were also discussed in this regard, and more will be discussed in the next lecture. 

Python Dictionary Operations Using Jupyter Notebook

Hello peeps! Welcome to the new episode of the Python tutorial. We have been working with different types of data collection in Python, and it is amazing to see that there are several ways to store and retrieve data. In the previous lecture, our focus was on the basics of dictionaries. We observed that there are many important topics in the dictionaries, and we must know all of them to make our base of concepts solid. For this, we are now dealing with the dictionaries in different ways, and this tutorial is going to be very interesting because we will pay more heed to the practical work and, by choosing a few cases in our codes, we will apply multiple operations to them. So have the highlights of today’s learning, and then we will move forward with the concepts.

  • What are nested dictionaries, and how do we use them?

  • How do you access the elements in the nested dictionary?

  • Tell us the procedure to add and delete elements from the dictionary.

  • Can we modify the elements of the dictionary? If yes, then how can we do so?

  • What is the membership test, and what is the procedure to use it in the dictionary?

  • Write the simple example in which the iteration is used with the dictionary.

Nested Dictionaries in Python

In the previous lecture, we saw simple dictionaries and applied their functions to them. In the present lecture, the details of the dictionaries will be discussed in detail. These functions are not new to us but have been learned while dealing with sets and lists. Yet, the working and the results of every function are different with different types of data, and therefore, we are using the predefined functions again but with a twist. In the previous lecture, we saw the nested dictionary in an example but have not mentioned the details because we were discussing the list in dictionaries and it was not suitable to discuss it at that moment. Yet, have a look at the definition of a nested dictionary:

“A nested dictionary is a type of dictionary in Python that contains more than one dictionary separated by commas in it with different indexes, and each dictionary has a specific number according to its order.” 

Accessing the data is a little bit more difficult in the nested dictionaries than in the simpler ones because the index is so important. The dictionaries are then divided with the help of commas between them. Open your Jupyter notebook by following these steps:

  • Go to the search bar on your PC.

  • Search for the Jupyter notebook.

  • Now go to the drop-down menu and choose Python there.

  • Wait for the new local host to be opened in your browser. 

  • Go to the new cell and start coding.

Copy this code and paste it into the cell. By pushing the run button, you will get the perfect nested dictionary. 

Accessing the Data From a Nested Dictionary

Do you know the meaning of our statement that accessing the data from a nested dictionary is a little bit different? It is because we need to type more of the data, and therefore, it is important to mention all the information accurately, as with all types of data, and this becomes tricky for  non-programmers.

#Declaring the nested dictionary containing the information of the books in a library

bookData = {1: {'subjectName': 'Physic', 'coverColor': 'red', 'Pages': '125'},

          2: {'subjectName': 'Chemistry', 'coverColor': 'blue', 'Pages': '234'},

           3: { 'subjectName': 'Biology', 'coverColor': 'green and blue', 'Pages': '564'}}

#Printing the required value

print("Your required data = ", bookData[2]['coverColor'] )

So, as you can see, the real use of a nested dictionary is to get more readable and clean data every time. These are the advantages of the nested dictionary it is more practical, and a large amount of data can be stored and accessed easily. 

Addition of The New Element in Nested Dictionary

It is the plus point of the dictionary that programmers can easily add the element in the nested dictionary by using some simple steps. The point here is to e discussed is to show you that the concept of an empty dictionary is present in Python. Many other data types do not have this characteristic. Hence, the addition of a new element becomes easy while using the dictionary. Have a look at the output of the code and after that, we will discuss the points about it.

#Declaring the nested dictionary containing the information of the books in a library

bookData = {1: {'subjectName': 'Physic', 'coverColor': 'red', 'Pages': 12},

          2: {'subjectName': 'Chemistry', 'coverColor': 'blue', 'Pages': 234},

           3: { 'subjectName': 'Biology', 'coverColor': 'green and blue', 'Pages': 564}}

print("Dictionary before modification = ",bookData )

print()

#Making the room for the new element by creating the empty dictionary

bookData[4]={}

#inserting elements in the next space

bookData[4]['subjectName']= 'English'

bookData[4]['coverColor']= 'yellow'

bookData[4]['Pages']= 611

print("The modified dictionary= ", bookData)

We can conclude the following points from the data given above:

  • The addition of the new dictionary to the existing nested dictionary is easy.

  • There is a need for a blank element so that we may fill in the required items.

  • The programmer in the code has declared the number of the dictionary and not the index, therefore, the data is not started with a zero and instead, the numbers of our choice are used. The programmer may name its dictionary anything no matter if it is the number of the alphabet. 

Deleting the Dictionary from Nested Dictionary

Let us discuss the case in which the programmer wants to delete the whole dictionary from the nested collection for some reason. For this, the procedure is not too long and the simple delete command is used for it. For better elaboration, we are using the same example and deleting the second dictionary from our list.

#Declaring the nested dictionary containing the information of the books in a library

bookData = {1: {'subjectName': 'Physic', 'coverColor': 'red', 'Pages': 12},

          2: {'subjectName': 'Chemistry', 'coverColor': 'blue', 'Pages': 234},

           3: { 'subjectName': 'Biology', 'coverColor': 'green and blue', 'Pages': 564}}

print("Dictionary before modification = ",bookData )

print()

#Deleting the 2nd dictionary

del bookData[2]

print("The modified dictionary= ", bookData

Here, the question arises if the single element is to be deleted only, what will be the code? There are only minor changes in the code given above, and only the particular element of the mentioned dictionary will be deleted. 

#Declaring the nested dictionary containing the information of the books in a library

bookData = {1: {'subjectName': 'Physic', 'coverColor': 'red', 'Pages': 12},

          2: {'subjectName': 'Chemistry', 'coverColor': 'blue', 'Pages': 234},

           3: { 'subjectName': 'Biology', 'coverColor': 'green and blue', 'Pages': 564}}

print("Dictionary before modification = ",bookData )

print()

#Deleting the specific elements from the dictionary

del bookData[2]['coverColor']

del bookData[3]['subjectName']

print("The modified dictionary= ", bookData)

Modifying Data From Dictionary

The next step is to learn about the modification process of the dictionary, and for that, we are choosing another example because it is boring to check the conditions from the same example all the time. For the sake of simplicity, we are using the simple dictionary instead of the nested type of the dictionary.

#Declaring the initial data of the staff

staffInfo = {"2C32": "HR", "2C34": "Chemist", "2C20": "Doctor"}

print("Initial Staff Information: ", staffInfo)

#Changing the staff information 

staffInfo["2C32"] = "Compounder"

#Printing the results

print("Updated Staff Information: ", staffInfo)

Hence, in this way, we do not have to first delete and then add the new element in its place; simply changing the element is enough. The new value is masked over the previous one, and in this way, the task becomes easy.

Membership Test on the Dictionary

Until now, we have seen some simple and short examples so that the concepts may be easily understood. Yet you must know that in real-life applications, dictionaries are so large that it becomes difficult to notice the existence of specific elements in them. For such cases, it is important to learn the command to check the availability. 

# Membership Test for our new dictionary

AvailableFood = {1: "chicken", 2: "beef", 3: "barbeque", 4: "burger", 5: "soup",

                6: "salad", 7: "cake", 8: "lasagna", 9: "pizza", 10: "pie",11: "sandwiches",

                12: "pasta", 13: "mushrooms", 14: "sausage", 15: "ice cream", 16: "cola",  17: "cupcakes",

                18: "chocolate", 19: "biryani", 20: "golgappy", 21: "bread", 22: "jam", 23: "eggs" }

#Checking the availability by using just the key

print(6 in AvailableFood) 

#checking if the certain key is "not" available

print(18 not in AvailableFood) 

#Using a false value to check the behaviour of the keyword 

print(49 in AvailableFood) 

If we go into the details of this code, we may get the idea that:

  • Dictionaries can be used to store a massive amount of data. 

  • The addition of the data is so simple and uncomplicated, and we can access any element easily.

  • The keys are useful to get the data easily without any complexity in typing in such cases if we use the integers as keys. 

  • The “in” function searches for the required elements of the user and gives the result about the availability of the element. 

  • The “not in” function is totally opposite from the former case, and the programmer can use it to check whether the specific element is absent or not. 

  • The third case is interesting, we simply put the value to check how the “in” function responds when the element is not present in the dictionary, and the result was as expected.

Using the Iterations in Dictionary

The iteration process is fascinating, and we always try to provide you with examples that you will use in the practical implementation over and over again. The iterations are an important concept, and you will learn them in detail in the coming sessions, but we believe that, for now, you have an idea of what they are and how the programmers use them in their codes. It is time to check what the dictionary will do if we use it in the for loop. 

# Membership Test for our new dictionary

AvailableFood = {1: "chicken", 2: "beef", 3: "barbeque", 4: "burger", 5: "soup",

                6: "salad", 7: "cake", 8: "lasagna", 9: "pizza", 10: "pie",11: "sandwiches",

                12: "pasta", 13: "mushrooms", 14: "sausage", 15: "ice cream", 16: "cola",  17: "cupcakes",

                18: "chocolate", 19: "biryani", 20: "golgappy", 21: "bread", 22: "jam", 23: "eggs" }

#using the for loop with the "in" keyword to get the list of each and every food item

for element in AvailableFood:

 print(AvailableFood[element])

Hence, all the elements are printed one after the other in a new line, and the programmers can simply get the available food items by using a simple command.

For more practice, I want to check the behaviour of this loop when I use it with the nested dictionary:

#Declaring the nested dictionary containing the information of the books in a library

bookData = {1: {'subjectName': 'Physic', 'coverColor': 'red', 'Pages': 12},

          2: {'subjectName': 'Chemistry', 'coverColor': 'blue', 'Pages': 234},

           3: { 'subjectName': 'Biology', 'coverColor': 'green and blue', 'Pages': 564}}

print("Elements of the dictionaries = ",bookData )

print()

#printing All the dictionaries using iteration.

for myBooks in bookData:

 print("Elements of single dictionary using the for loop = ", bookData[myBooks])

The results of the code given above are clean and more understandable:

Hence, the use of iterations makes our output uncomplicated and ordered. So it was all about the dictionary in this episode of the Python programming language. It was amazing to see the different examples, and all of them were related to the dictionaries. The usage of the dictionary in Python is important to understand; therefore, we used the Jupyter notebook to access, add, delete, and modify the elements of nested dictionaries and simple dictionaries with the help of examples. Moreover, the membership test was also interesting to learn and easy. In the end, the iterations made our work easy, and we got a cleaner output with the help of the iterations. We hope it was an attractive way to learn the dictionaries and stay with us for more concepts of Python. Happy learning to all of you.

Dictionaries in Python using Jupyter Notebook

Hello students! Welcome to the new Python tutorial, where we are learning a lot about this programming language by applying the codes in a Jupyter notebook. It is interesting to see how simple codes with easy syntax can be useful to store, retrieve, and use data in different ways. Many things in Python are so unadorned and pre-defined that programmers may use them in a productive way without any issue. 

In the previous lecture, we have seen the details of the sets and how different types of mathematical operations are used to get the required results. We have seen many codes, the examples of which were taken from day-to-day life. In the present lecture, the mission is to learn a new topic that is related to the concepts of previous lectures. Yet, it is important to have a glance at the points that will be discussed in detail here:

  • Introduction to the dictionaries in the python programming language.

  • Why do we need dictionaries if we have different ways to store the data?

  • How can we use dictionaries in Jupyter notebook?

  • How do you define the concept of keys in dictionaries?

  • What are some characteristics that make the dictionaries different from others?

  • How do you justify that using the list with dictionaries makes the working better?

These points are the important interview questions and all of these will be crystal clear in your mind when we will go deep into these concepts one after the other. So stay in this lecture till the end and we will discuss the basic concept today.

What is Dictionary in Python?

To understand the topic, the first question that arises in the mind is what actually constitutes a dictionary and why it is important to understand this concept. An interesting piece of information to share here is that dictionaries are not new concepts; these were defined in the older versions of Python as well, but the difference is that in the older versions, from Python 3.6 onward, dictionaries were considered unordered, and if we talk about the current introduction, we will get the following lines:

"In Python 3.6 and later, a Python dictionary is an ordered collection of data that stores data in the form of pairs in keys or values."

The word  “ordered” is not new to us and from the above information, we can understand that in the older versions of Python dictionaries when displayed in the output, does not have the proper indexing and the order of the element was unpredictable but when talking about the updated version (that we are using during this tutorial) the order of the elements in the dictionaries is well defined and the elements will be arranged in the same manner always that is defined by the programmer. Here it is important to notice that usually, the students are using the updated version of Python and there is no need to mention the older versions but the reason to mention this is, the older versions are preferred by the users that have older personal computers or because of any other reason, if they are using the previous versions, then they will find the dictionaries a little bit different from this tutorial. 

Why We Need Dictionaries?

We have been working with the data types in Python that all are used to have the collection of data and the question here is why we need another entity that can store the data if we have lists, sets, and others. The answer here is simply because the way to store the data is different for all of these and as the topic of discussion today is dictionaries, you must know that it uses the key values to store the data and therefore, it becomes uncomplicated to store the data using the key value mapping format. The most common advantage is, the retrieval of data from the dictionary becomes super easy with the help of these key values. If we talk about the complexity of the dictionaries, we will get the following data:

  • The best case of a dictionary has O(1) complexity.

  • The worst case of a dictionary has the O(n) complexity. 

Using the Dictionaries in Jupyter Notebook

Now, that you understand the basics of dictionaries, to make the discussion clear, examples are being used in the Jupyter notebook. We have been using it in our tutorial, and therefore, we know that we simply have to start the software and get the new tab in the browser by clicking on the “new” dialogue box and clicking on “Python 3." 

Once you get the worksheet now it's time to get used to all the codes that will clarify the concepts in a better way. So let’s start learning the concept and then simply use all the learning in our codes. This will be easy to understand because we have been working with such types of codes in this whole course but the difference here is the key of the dictionary. 

Concept of Keys in Dictionary

You must know that dictionaries are declared by using the curly brackets in Python and if you have seen our previous tutorial, you must have the idea that the same representation was used in the sets then how can the compiler differentiate between these two and what is the reason to introduce the concept of dictionary in Python? Well, as we move towards the complex problems, we get the idea that simply storing the data is not enough, there is a need of providing the reference of the data and this happens when we use the keys in dictionaries.

“A key in Python dictionary is the specific and unique value assigned to each element and that has the immutable data type.”

The role of keys in the dictionaries will be clear by using the output of the code given next:

#declaring the dictionaries containing the grocery items

GroceryItems={"lettuce":4, "onion":34,"pepper":8,"plum":12, "frozen fruits":22}

print(GroceryItems)

Hence, the keys add more details to the dictionaries, and the data is stored in a better manner while being used in dictionaries. The usage of the keys is still ambiguous in the mind, hence, we are using different examples to express it well. There are different ways to use the dictionaries, and these procedures are given next:

#declaring the dictionaries containing the grocery items

GroceryItems={"lettuce":4, "onion":34,"pepper":8,"plum":12, "frozen fruits":22}

print(GroceryItems)

#retriving the data using the concept of keys in a dictionary

print("The required data = ", GroceryItems["pepper"])

Hence, the data stored in the key can be used easily to retrieve the data. In the example given above, when the person wants to get the number of groceries they want with the help of items. 

Characteristics of Dictionaries

We have focused on the examples, but before going into the details of them, you must know some important points about the dictionaries.

  • The dictionaries are declared with the help of curly brackets. 

  • The keys are used with the elements and to declare them, the colon is used along with each element. 

  • The value of the keys can be obtained by mentioning the element. 

  • The dictionaries are ordered and every time when the same dictionary is declared, we get the element as same as that was mentioned in the code. 

  • The usage of any data type is allowed in the dictionaries, and therefore, the working of a large amount of data is possible in the dictionaries. 

  • Same as the sets, duplicate elements in the dictionaries are not possible. It means when the element is repeating in the code, the compiler automatically ignores the second third, or any type of repeating of the same element and therefore, the repetition is not allowed in dictionaries. 

Let us now look at some examples of dictionaries where we will use our Python concepts and some functions to interact with the dictionaries. 

Using List with Dictionaries in Python

We know about the details of lists in the Python programming language, and now we want to connect things together so that we may understand why the students had to learn a lot about lists. Python provides uncomplicated ways to use different functions and concepts and get useful results. In the Jupyter Notebook, we are now inserting the list into our dictionaries in two ways, and in this way, the concepts of lists will also refresh our minds. 

Inserting the List as an Element in Dictionaries

During discussion about some important characteristics of dictionaries, it was mentioned that any data type can be inserted into the dictionaries, and this point will be proved with the help of the following code:

#declaring the dictionary of tooth brush 

toothBrush = {

  "Name of Item": "toothbrush",

  "electric": False,

    "price": 60,

  "available colours": ["red", "white", "blue"]

}

print("Features of tooth brush in detail: ",toothBrush)

print("Price of the tooth brush= ", toothBrush["price"])

When we input this code in the new cell of our local host, after pushing the run button, the following results can be obtained:

Hence, it is proved that any data type in Python can be inserted into the dictionary, and this characteristic gives the programmers the independence to use the collection of data and relate it to a single item in the dictionary. In the example we have just seen, there were multiple options for the same brush about its colours, and hence, in such cases, the programmers use dictionaries to get the required results.

Using the Dictionary in List

Here comes a different kind of concept that we have not learned in this tutorial until now. The list can also have the dictionaries as the element and if you are wondering why the programmers use them then you must know, the characteristics of the data types matter, and each data type has its own speciality therefore, the combination of both these data types in different ways gives us the variety of uses. 

#Create a list of dictionaries that represent the prices of different items

#along with their serial number in the grocery store.

myStoreItems = [{345: 'chicken', 567: 'eggs',

                 561: 'beef', 879: 'mutton'},

                {348: 'milk', 670: 'butter',

                127: 'bread', 445: 'tea bags'},

                {237: 'chocolate spread', 381: 'jam',

                 890: 'sauce', 340: 'sandwich'}]

 

print(myStoreItems)

#accessing the data from the first dictionary

print("The required item is ",myStoreItems[0][561])


#accessing the data from the second dictionary

print("The required item is ",myStoreItems[1][127])


#accessing the data from the second dictionary

print("The required item is ",myStoreItems[2][340])

In this way, we can extract the following concept from this code:

  • The dictionaries can be used in the lists.

  • There is the possibility of using different dictionaries in the same code.

  • The data can be accessed from any dictionary by using the index of the data.

  • To get the exact element, the programmers have to write the index of the element. 

  • For using the right indexing method, first, we have to mention the dictionary number and then the key of the element. 

  • It's a reminder that indexing starts at 0. 

  • It becomes easy to manage the data with the keys and more data can be stored in a single dictionary in a more manageable way. 

  • The declaration of the dictionaries resembles the sets and we see many features of these two concepts that resemble each other. 

In this lecture, we started our discussion with the introduction of dictionaries. The list has many informative features, and the combination of dictionaries with the list makes many useful tasks easy to complete without facing any issues because of the smooth process. The user simply has to feed the required data, and at the appropriate time, the data can be retrieved easily. So, that was all for today. Dictionaries have applications in different ways, and therefore, it is not possible to provide students with all the necessary information in a single lecture. Therefore, in the second part, we will discuss more details about dictionaries and learn a lot through examples.

Online Casino: What is its technology? & How it's replicating the real-world Casino?

Online technology has had a profound impact on the real world, revolutionizing various industries and areas of our lives. From e-commerce and communication to education, healthcare, and entertainment, online technology has made many aspects of daily life more convenient, accessible, and efficient.

This technology has fundamentally changed the way people interact with the world around them — and there is no denying — another industry that has been significantly transformed by online technology is — the gaming industry.

With the rise of Live casino online technology and advancements in internet connectivity, players can now connect and compete with others from anywhere in the world. Online technology has also enabled the development of massively multiplayer online games (MMOs) that allow thousands of players to interact in shared virtual worlds.

Additionally, online gaming has become more accessible than ever before, with the rise of mobile gaming and the development of cloud gaming platforms that allow players to access games from anywhere on any device.  

And online casinos are no different.

Many players find online casinos to be just as exciting, if not more so, than real-world casinos due to the convenience and accessibility of being able to play from anywhere and at any time. Plus, the availability of a wide selection of games, including live dealer games, can add to the excitement and realism of the online casino experience.

However, it is important to note that gambling can be addictive, and players should always gamble responsibly and within their means to ensure that their online casino experience remains enjoyable and is not detrimental to their overall well-being.

What is an Online Casino?

An online casino is a virtual platform that allows players to gamble and wager on various casino games via the internet. These games include slots, table games, card games, and live dealer games. 

Players can access online casinos using their computer or mobile device, and the games are played using software that simulates the experience of a traditional casino. The outcome of the games is determined by a random number generator , which ensures that the results are fair and unbiased.

Players can make deposits and withdrawals using a variety of payment methods, including credit cards, e-wallets, and bank transfers. These casinos are regulated by various authorities, depending on their location, to ensure they operate fairly and securely.

What technology is used in an online casino?

Online casinos use a variety of technologies to provide players with a seamless gaming experience. Some of the most common technologies include:

VR and AR technology:

Virtual Reality (VR) and Augmented Reality (AR) technology are becoming increasingly popular in the online casino industry, as they provide a more immersive and interactive gaming experience for players.

VR technology allows players to enter a virtual casino environment, where they can interact with other players and dealers as if they were in a real-world casino. This technology uses headsets and motion sensors to create a lifelike and immersive environment that can transport players to a virtual casino floor.

AR technology, on the other hand, overlays virtual objects and information in the real-world environment. In the online casino context, AR can be used to provide players with information about the games they are playing, such as the rules and payouts, or to create a more interactive and engaging gaming experience by overlaying virtual objects in the real-world casino environment.

Blockchain Technology:

Blockchain technology has the potential to revolutionize the online casino industry by offering a more secure and fair gaming experience for players.

One of the main benefits of blockchain technology is its transparency and security. By using a decentralized network of computers to verify and store data, blockchain technology ensures that all transactions are safe and clear, and cannot be tampered with or altered.

This means that players can have greater trust and confidence in the fairness of online casino games, as the results of each game can be independently verified and audited.

Artificial Intelligence:

Artificial Intelligence (AI) can be used to enhance the gaming experience for players and improve the efficiency and effectiveness of casino operations.

One application of AI in the online casino industry is the development of intelligent gaming algorithms that can optimize the gaming experience for players. By analyzing player data and behavior, AI algorithms can identify patterns and preferences, and customize the gaming experience to better meet the needs and preferences of each individual player.

AI can also be used to improve the security and fraud detection capabilities of online casinos. By using machine learning algorithms to analyze data and detect patterns, online casinos can identify suspicious activity and prevent fraud, money laundering, and other illegal activities.

3D Slot Machines:

3D slot machines are a relatively new addition to the online casino industry and have quickly become popular among players due to their immersive and engaging gameplay. Unlike traditional slot machines, which feature two-dimensional graphics and simple animations, 3D slot machines feature more advanced graphics and animations that create a more realistic and enticing gaming experience.

3D slot machines use advanced software and graphics technology to create highly realistic 3D graphics and animations, including detailed character models, intricate backgrounds, and realistic sound effects. These elements combine to create a gaming experience that is highly lively and engaging, and that allows players to feel as though they are part of the game.

How do online casinos replicate real-world casinos?

Online casinos strive to replicate the real-world casino experience as closely as possible. The following are some ways that online casinos replicate the real-world casino experience:

1: Game selection

Online casinos offer a wide range of games that are similar to those found in real-world casinos. Some of the most popular games found in online casinos include:

Slots: 

Online casinos offer online slots as one of their most popular games. They come in different themes, graphics, and features and offer various ways to win.

Table games: 

Online casinos offer a variety of table games, including blackjack, roulette, baccarat, craps, and sic bo. These games are usually played against the computer, but some online casinos offer live dealer versions.

Video poker: 

Video poker is a game that combines the elements of slots and poker. Players are dealt a hand of cards and must decide which cards to keep and which to discard in the hopes of making a winning hand.

Live dealer games: 

Online casinos offer live dealer games streamed in real-time from a casino studio. Players can interact with a real dealer and other players, creating a more authentic gaming experience.

2: Graphics and sound effects

These virtual casino games are designed with high-quality graphics and sound effects that help to replicate the look and feel of a real-world casino.

The following are some of the ways that graphics and sound effects enhance the online casino experience:

Visual appeal: 

High-quality graphics make the games more visually appealing, creating a more engaging and entertaining gaming experience.

Theme and story: 

Graphics and sound effects are used to create a theme and story for each game. This can include anything from a classic slot machine theme that tells a story or transports players to a different time or place.

Realism: 

These graphics and sound effects can offer more realistic exposure. For example, in live dealer games, the sound of the dealer shuffling cards and the cards' visuals can create a more authentic event like you’re part of the entire process.

Feedback and rewards: 

These visuals and effects are often used to provide feedback and rewards to players. For example, when a player wins a game, the graphics and sound effects may create a celebratory experience to enhance the player's excitement.

3: Live dealer games

Live casino online technology offers live dealer games streamed in real time from a casino studio. This allows players to interact with a real dealer and other players, creating a more authentic gaming atmosphere that both parties can enjoy.

Some of the key aspects of live dealer games include:

Real dealers: 

Live dealer games are hosted by real dealers who operate the game in real time from a casino studio. Players can interact with the dealer and other players like in a real-world casino. 

Game selection: 

Many of the most popular table games are available as live dealer games, including blackjack, roulette, baccarat, and casino hold'em.

Betting options: 

Live dealer games offer a range of betting options, from low-stakes games to high-stakes games for high rollers.

Convenience: 

These games provide the convenience of online gaming, allowing players to enjoy the casino experience from the comfort of their own homes.

4: Bonuses and promotions

Bonuses and promotions are an essential part of the online casino experience, offering players the opportunity to boost their bankroll and increase their chances of winning. Some of the most common types of bonuses and promotions offered by online casinos include:

Welcome bonuses: 

Welcome bonuses are offered to new players when they sign up for an online casino. These bonuses usually come in the form of a match bonus, where the casino matches a percentage of the player's first deposit.

Free spins: 

Free spins are a type of bonus that allows players to spin the reels of a slot machine without having to place a bet. Free spins may be awarded as part of a welcome bonus or as a promotion to existing players.

Reload bonuses: 

Reload bonuses are bonuses offered to existing players when they make a deposit. These bonuses are usually smaller than welcome bonuses, but they still offer players the opportunity to boost their bankroll.

Loyalty rewards programs: 

Many online casinos offer loyalty rewards programs that reward players for their continued play. These programs may offer players points that can be redeemed for cash or prizes, or access to exclusive bonuses and promotions.

Cashback bonuses: 

Cashback bonuses offer players a percentage of their losses back as a bonus. For example, a casino may offer a 10% cashback bonus on losses incurred over a certain period.

5: Payment methods

Online casinos offer a range of payment methods that are similar to those offered in real-world casinos. The following are some of the most common payment methods used by online casinos:

Credit and debit cards: 

Visa and Mastercard are the most commonly accepted credit and debit cards at online casinos. These payment methods offer fast and convenient transactions, but players should be aware that some banks may decline transactions with online casinos due to local gambling regulations.

E-wallets: 

E-wallets like PayPal, Neteller, and Skrill are popular payment methods for online casino players. These payment methods offer fast and secure transactions, with many online casinos offering bonuses and promotions for players who use e-wallets.

Bank transfers: 

Bank transfers are a standard payment method for players who want to transfer large amounts of money. However, bank transfers can take several days to process, which may not be ideal for players who want to start playing immediately.

Cryptocurrencies: 

Some online casinos accept cryptocurrencies like Bitcoin and Ethereum as payment methods. Cryptocurrencies offer fast and secure transactions, but players should be aware of the volatility of these currencies and the potential for significant value fluctuations.

Wrap Up

In conclusion, online casinos have revolutionized the gambling industry by offering players a convenient and accessible way to play their favorite casino games from the comfort of their own homes.

With advancements in technology, online casinos have been able to replicate the real-world casino experience through features such as live dealer games, high-quality graphics and sound effects, and a wide selection of games.

Additionally, the availability of various payment methods and bonuses, and promotions have made online gambling more attractive to players. However, it is important to note that online gambling can be addictive, and players should always gamble responsibly and within their means.

Needless to say, online casinos provide a convenient and entertaining way to enjoy the thrill of gambling, but it is important to approach online gambling with caution and moderation.

That’s all for today. Hope you’ve enjoyed reading the article. If you have experienced playing in online casinos, we’d appreciate your input in the section below. Thanks for your precious time. Until next time!

Syed Zain Nasir

I am Syed Zain Nasir, the founder of <a href=https://www.TheEngineeringProjects.com/>The Engineering Projects</a> (TEP). I am a programmer since 2009 before that I just search things, make small projects and now I am sharing my knowledge through this platform.I also work as a freelancer and did many projects related to programming and electrical circuitry. <a href=https://plus.google.com/+SyedZainNasir/>My Google Profile+</a>

Share
Published by
Syed Zain Nasir