Sending SMS & Call with GSM Module and Raspberry Pi 4

Greetings, and welcome to another tutorial in our series on the raspberry pi 4 Python programming. The previous guide covered the basics of transmitting data over the radio using the nrf24l01 chip in Pi 4. We also learned about interfacing Arduino and raspberry pi 4 and sending radio signals between the two devices. However, this tutorial will walk you through building a Raspberry Pi-based mobile phone with a microphone and speaker for making and receiving calls and reading text messages (SMS). This Project also serves as a proper GSM Module for the Raspberry Pi interface, with all the necessary Code to run the most fundamental features of any modern smartphone. First, we will understand what gsm is, its architecture and how it works, then we will learn how to program it in our pi 4; therefore, let us begin.

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

Components:

  • Raspberry Pi 4

  • GSM Module

  • 16x2 LCD

  • 4 *4 Keypad

  • 10k pot

  • Breadboard

  • Connecting jumper wire

  • Power supply

  • Speaker

  • Microphone

  • SIM Card

  • Loudspeaker

Structure and Uses of the Global System for Mobile Communications

The acronym "GSM" refers to the "global system for mobile communication" and is the name of a type of mobile communication modem (GSM). Bell Labs was responsible for conceptualizing GSM in the 1970s. It's one of the most common forms of mobile communication around the globe. The 850MegaHertz, 900MegaHertz, 1800 Megahertz, and 1900 Megahertz frequency bands are utilized by GSM networks, which are part of an open and digital mobile network used to carry voice and data services.

Using the telecommunications method of multiple time division access (TDMA), GSM technology was created as a digital system. For transmission, a GSM converts analog signals to digital ones, compresses them further and delivers them through a channel sharing bandwidth with two data streams from separate clients. The data rates transported by the digital system range from 64 kilobytes per second to 120 Megabytes per second.

In a GSM network, macro, micro, and umbrella cells coexist. The implementation context determines the specifics of each cell. The macro, micro, and umbrella cell sizes are in use in a GSM network. Each cell may have a different range of coverage depending on the setting.

Time-division multiple access (TDMA) works by giving each user a specific amount of time to transmit on the same frequency. It's flexible, supporting data rates from 64kbps to 120Mbps and allowing for clear voice communications.

Structure of GSM-Based Technologies

The following are the primary components of the GSM architecture.

  • Connectivity and Switching Infrastructure (NSS)

  • All three of these components—the Base Station (BS), the Mobile Station (MS), and the Operations and Maintenance Subsystem (OSS)—are necessary for proper communication (OSS)

Network Switching Subsystem (NSS)

Each component of the GSM system design contributes to what is collectively called the core system/network. In this case, the mobile network system is primarily controlled and interfaced with via a data network consisting of several different components. Listed below are some of the most crucial elements of the underlying network.

Mobile Switching Centre (MSC)

One of the essential parts of a GSM network is its core network, where the Mobile Switching Center (MSC) resides. This MSC performs the same functions as a common switching node in an ISDN or PSTN. Still, it provides additional features to accommodate mobile users' requirements, such as authentication, registration, inter-MSC handovers, call localization, and routing.

In addition, it gives users an advantage in connecting their mobile phone networks to the PSTN (public switched telephone network) for making and receiving landline calls. To facilitate mobile-to-mobile calls across different networks, interfaces to all other switched telephone networks ( PSTN center servers are given.

Home Location Register (HLR)

Every subscriber's administrative details, including their last known location, are stored in this HLR database. This manner, calls can be routed over the GSM network to the appropriate mobile switch base station. If a call comes in when an operator has their phone turned on, the network can determine which base transmitter station the call is coming from and link it to the correct phone.

When the phone is turned on but not being used, it nevertheless registers to ensure the HLR system is aware of its current location. Each network has a single HLR, which may be physically split across several data centers for practical reasons.

Visitor Location Register (VLR)

To facilitate the VLR's desired services for the individual subscriber, it incorporates data from the HLR network. It is possible to run the visitor coordinates register independently, but it is most commonly implemented as a core component of the MSC. Because of this, getting access is more manageable, and it takes less time overall.

Equipment Identity Register (EIR)

The Equipment Identity Register (EIR) is the part of the network infrastructure in charge of deciding whether or not certain pieces of mobile equipment are allowed access. The International Mobile Equipment Identification (IMEI) numbers uniquely identify each mobile technology work.

This IMEI number is permanently embedded within the mobile device and checked by the network after registration. Depending on the data in the EIR, the mobile phone may be given one of three possible network access states: allowed, banned, or monitored.

Authentication Centre (AuC)

When users insert their SIM card into their phone, the secret key is stored in a secure file known as the AUC (authentication center). The AUC sees the extensive application as a radio channel coding and verification standard.

Gateway Mobile Switching Centre (GMSC)

In the absence of location information for the mobile station (MS), a call placed by a ME terminates with the GMSC (Gateway Mobile Switching Centre). Using the Mobile Subscriber Identifier Service Data Number (MSISDN) and the HLR, the GMSC can locate the specific MSC that has been visited and connect the call to the appropriate location. It's unclear what the "MSC" part of GMSC stands for, as the gateway procedure does not require relating to an MSC.

SMS Gateway (SMS-G)

Both SMS-Gateways are referred to collectively as the SMS gateway in the GSM specifications. The messages passing via these gateways are directed in various ways.

Sending a short message to mobile equipment (ME) requires the usage of the Short Messaging Service Gateway Switching Center. Short messages sent over a mobile network are routed through the  SMS Inter-Working Switching Center. While the SMS-primary GMSC's function concerns the GMSC, the SMS-IWMSC serves as a constant endpoint for access to the Short Message Service Centre.

These were the primary nodes in the GSM system's infrastructure. While they frequently shared physical space, the entire middle network would sometimes be broadcast throughout the country. In the event of a failure, it will provide a degree of leeway.

Base Station Subsystem (BSS)

The connection point between the mobile node and the broader network infrastructure. The radio transceivers and protocol management for mobile devices are housed in the Base Transceiver Station. In addition, a Base Station Controller manages the Base Transceiver and serves as a bridge between mobile devices and the mobile switching hub.

The network subsystem handles connectivity between the network and the mobile stations. The Phone Service Switch Centre is the backbone of the Network Subsystem, allowing users to connect to other networks (ISDN, PSTN, etc.). The GSM system's ability to route calls and allow for roaming depends on two additional components, the Home Location Record and the guest Location Record.

In addition, it stores the Equipment Identity Register, which keeps track of all the mobile devices and their associated IMEI numbers. The acronym IMEI refers to the unique identifier for mobile devices worldwide.

In the second generation of GSM network design, the mobile devices communicate with the BSS, or Base Station Subsystem. These components comprise this subsystem, and each will be examined.

Base Transceiver Station (BTS)

As part of a GSM network, the radio Tx, Rx, and their associated antennas make up the base Transceiver Station, which is used for transmitting, receiving, and communicating directly through mobiles. The base station is the central component of each cell, and it communicates with mobile devices using an interface known as the Um interface and related protocols.

Base Station Controller (BSC)

The base station controller (BSC) is employed for the following step back into GSM technology. This controller is typically co-located within one of the base transceiver stations it controls. This controller handles radio resource management, including channel allocation and handover between base station groups. Over the Abis interface, it communicates with the BTSs.

The acceptable radio technology is used by the GSM network's subsystems component in the ground station to ensure that multiple operators can utilize the system at the same time. Each base station can support many operators because each channel can support up to eight users.

The network provider strategically places these to ensure comprehensive coverage. A base station, sometimes known as a "cell," can surround this space. Signals can't be prevented from bleeding into neighbouring cells, and the channels used in one don't transfer to the next.

Mobile Station

Mobile phones include a transceiver, a display, and a CPU, all of which are network-connected and operated using a SIM card. In a GSM mobile transmission medium, the operator monitors and controls the mobile station or mobile equipment, which are most commonly represented by cell phones. Their size has shrunk significantly while their functionality has skyrocketed. The benefit of a much longer interval between charges is still another advantage. Phone hardware and the subscriber identity module (SIM) are two of many components.

A mobile device's hardware consists of its primary components, such as the housing, screen, battery, and electronics used to generate the signal and process the signal receiver before transmission. The IMEI is a unique number assigned to each mobile device. This feature can be permanently programmed into a phone throughout its manufacturing process. During the registration process, the network accesses this database to see if the device has been flagged as stolen.

A user's identity on the network is stored in the information contained in their SIMcard. It also includes other data, such as the IMSI number. With this IMSI stored in the Sim, the phone user could easily switch phones by swapping SIM cards. As a result, if switching to a new mobile phone were simple and didn't require a unique phone number, more people would do it, generating more revenue for network operators and contributing to GSM's overall economic triumph.

Operation and Support Subsystem (OSS)

The OSS is an integral aspect of any functional GSM network. The NSS and BSC parts are linked here. The GSM network and BSS traffic load are the primary areas of focus for this OSS. It is worth noting that some preservation responsibilities are relocated to the base station controller to lower the maintenance expense of the system when the amount of BS increases through the consumer population growth.

The 2G GSM network architecture is predicated on a rational functioning method. This approach is remarkably straightforward compared to today's mobile network architectures, which rely on software-defined units to facilitate highly adaptable operations. However, the 2G GSM architecture will show how the necessary voice and essential operational functions are organized. 

Specifications of a GSM Module

The following are some of the functions provided by the GSM module.

  • Enhanced spectrum efficiency

  • Features including "international roaming," "integrated services digital network" (ISDN) compatibility, and "support for future services" are also included.

  • High-quality voice communications; encrypted phone conversations;

  • Features like a programmable alarm clock, high-quality voice communication, a fixed calling number, a real-time clock, and the ability to send and receive SMS messages are all standard on modern smartphones (SMS)

As a result of its rigorous security measures, the GSM system is currently the safest available for use in the telecommunications industry. Call privacy and subscriber anonymity for GSM users are only protected during transmission, but this is still a massive step toward attaining end-to-end security.

GSM Modem

In either its mobile phone or modem form, a Global System for Mobile Communications (GSM) modem enables two computers or processors to connect across a network. A SIM card is needed to run a GSM modem, and it can only be used within the coverage area the network provider has paid for. It has serial, USB, and Bluetooth connectivity options for linking to a personal computer.

Any regular GSM cell phone can double as a GSM modem if you have a suitable cable and driver installed on your PC. It would be best if you used a GSM modem instead of a GSM cell phone. The GSM modem is helpful in many devices, including POS terminals, inventory management systems, surveillance cameras, weather stations, and GPRS-mode remote data loggers.

GSM Module Operation

Below is a circuit showing how to connect a GSM modem to the MC using the level-shifting IC Max232. When a numeric command is received by short message service (SMS) from any mobile device, the SIM card-mounted GSM modem transfers that information to the MC via serial connection. The GSM modem is programmed to respond to the order "STOP" by producing an MC output, the point which is utilized to deactivate the ignition switch.

If the input is driven low, the GSM modem will send a predetermined message (in this case, "ALERT") to the user. A 162 LCD screen displays the entirety of the procedure.

In-depth working Explanation of raspberry pi 4

We have utilized a GSM module and a Raspberry Pi 4 to manage the entire system and interface its many parts in this Project. You can input data of any kind, including phone numbers, text messages, and phone calls, read and respond to text messages, and more, using a 4x4 alphanumeric keypad. The SIM900A GSM module connects mobile phones to wireless networks for making and receiving calls and sending and receiving text messages. We've integrated a microphone, a loudspeaker for making and receiving voice calls, and a 16 * 2 liquid crystal displays information like menu options and alarms.

With alphanumeric input, you can use the same keyboard to type in both numbers and letters. For the Code we used to allow alphabets in addition to numbers in this method, scroll down to the "Code in Code" section.

It's simple to put this plan into action. The alphanumeric keypad is used for all functions. Below you'll find a link to the complete Code and a demonstration video. This section will elaborate on the four aspects of the listed projects.

The Pi 4 Mobile Phone Four Main Attributes

Make Call

The Pi 4 phone we built requires us to press the letter "C" and provide the cellphone number we wish to call. We'll use an alphanumeric keyboard to enter the number. Once the correct number has been entered, we must hit "C" again. The AT command is now processed by pi 4 to connect the call to a specified number.

ATDxxxxxxxxxx; <Enter>     where xxxxxxxxx is entered Mobile Number.

Receive Call

Answering a phone call is simple. When a call comes into the SIM number stored in the GSM Module of your system, the LCD will display the message "Incoming..." along with the caller's number. All that's left to do is hit the 'A' key to answer the call. Pi 4 will send the following command to the GSM Module when the "A" button is pressed:

ATA <enter>

Transmit SMS

Pressing "D" on our Raspberry Pi phone allows us to send a text message. To whom (or what) should we address the SMS message that the system has just requested? Once the number has been entered, pressing "D" again will prompt the LCD to request a message. To send an SMS, enter the message using the keypad as you would with any other mobile device, and then hit the 'D' key again. Raspberry Pi can send SMS with the following command:

AT+CMGF=1 <enter>

AT+CMGS=”xxxxxxxxxx” <enter>     where: xxxxxxxxxx is entered mobile number

Receive and Read SMS

Even this component is easy to use. Here, the SIM card is used to receive SMS messages from the GSM. The Raspberry Pi also keeps a close eye on the UART SMS signal. New notes are shown by the LCD displaying the text "New message," and reading them is as simple as pressing the "B" key. This is an SMS Received signal:

+CMTI: "SM," 6  Where 6 is the message location where it is stored in the SIM card.

When the RPi detects the 'SMS received' signal, it will get the SMS storage location and instruct the Global system for mobile to read the message. Moreover, the LCD will flash the words "New Message" in a prominent location.

AT+CMGR=<SMS stored location><enter>

The GSM now delivers the saved message to the Raspberry Pi, and the Pi, having extracted the primary SMS, shows it on the LCD. When it comes to MIC and Speaker, there is no secret code.

Detailed Circuit Layout and Explanation

The GPIO pins of the Raspberry Pi are wired to the RS, EN, D4, D5, D6, and D7 pins of the 16 * 2 liquid crystal display. A direct connection is made between the GSM module's Rx and Tx pins and the Raspberry Pi's Tx and Rx pins. Connectors R1, R2, R3, and R4 of a 4 * 4 keypad are connected to GPIOs 12, 16, 20, and 21, whereas pins C1, C2, C3, and C4 are connected to GPIOs 26, 19, 13, and 6. If you want to boost the audio volume from the GSM Module, you can join the microphone directly to the mic+ and mic- pins and the loudspeaker to the sp+ and sp- pins. The loudspeaker can be connected directly to the GSM module without using the Audio Amplifier circuit.

Explanation of the Code

This Pi 4 mobile phone's programming interface may be challenging to novices—the programming language of choice for this Project is Python.

Here, we define the keypad() function to be used with a basic numeric keypad. We've also added a def alpha keypad(): for typing alphabets so that you may use the same keypad for both purposes. To make it compatible with the Arduino keypad library, we've given this keypad a wide range of new capabilities. This keypad only takes 10 presses to enter a whole string of text or a numeric value.

For example, if we push key 2 (abc2) once, the LCD will display the letter 'a.' If we press it again, the letter 'b' will take its place, and if we hit it three more times, the letter 'c' will appear in the same spot. After holding down a key for a short time, the LCD pointer will advance to the following available location. We can now proceed to the next character or number. Any other keys can be processed in the same way.

def keypad():

   for j in range(4):

     gpio.setup(COL[j], gpio.OUT)

     gpio.output(COL[j], 0)

     ch=0

     for i in range(4):

       if gpio.input(ROW[i])==0:

         ch=MATRIX[i][j]

         return ch

         while (gpio.input(ROW[i]) == 0):

           pass

     gpio.output(COL[j],1)

def alphaKeypad():

    lcdclear()

    setCursor(x,y)

    lcdcmd(0x0f)

    msg=""

    while 1:

        key=0

        count=0

        key=keypad()

        if key == '1':

            ind=0

            maxInd=6

            Key='1'

            getChar(Key, ind, maxInd)

            .... .....

            ..... .....

To begin, we have declared the pins for the liquid crystal display, the keypad, and other components, as well as included the necessary libraries in this python script:

import RPi.GPIO as gpio

import serial

import time


msg=""

alpha="1!@.,:?ABC2DEF3GHI4JKL5MNO6PQRS7TUV8WXYZ90 *#"

x=0

y=0


MATRIX = [

            ['1','2','3','A'],

            ['4','5','6','B'],

            ['7','8','9','C'],

            ['*','0','#','D']

         ]

ROW = [21,20,16,12]

COL = [26,19,13,6]

... .....

..... .....

The pins need to be pointed in the proper direction.

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(led, gpio.OUT)

gpio.setup(buz, gpio.OUT)

gpio.setup(m11, gpio.OUT)

gpio.setup(m12, gpio.OUT)

gpio.setup(button, gpio.IN)

gpio.output(led , 0)

gpio.output(buz , 0)

gpio.output(m11 , 0)

gpio.output(m12 , 0)

To begin Serial communication, follow the steps below.

Serial = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=2)

We must now create a liquid crystal display driving function. The def lcdcmd(ch): and def lcdwrite(ch): functions are used to deliver commands and data to the LCD, respectively. The liquid crystal display may also be cleared with def lcdclear(), the cursor position can be set with def setCursor(x,y), and a string can be sent to the liquid crystal display with def lcdprint(Str).

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)

    .... .....

    ..... ....

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)

    .... .....

    ..... ....

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)

Next, we'll need to code some features for interacting with text messages, phone calls, and incoming calls.

The call is placed using the function def call():. Also, the LCD can display the receiving message and number via the function def receiveCall(data):. Finally, the call is answered with def attendCall():.

The message is composed and sent using the alphaKeypad() method, accessed via the def sendSMS(): function. The SMS is received, and its location is retrieved using the def receive SMS(data) function. And finally, the LCD gets updated with the message thanks to def readSMS(index:).

All of the operations mentioned above are included in the Code that follows.

import RPi.GPIO as gpio

import serial

import time

msg=""

#     0      7   11  15  19  23  27   32  36   414244   ROLL45

alpha="1!@.,:?ABC2DEF3GHI4JKL5MNO6PQRS7TUV8WXYZ90 *#"

x=0

y=0

MATRIX = [

            ['1','2','3','A'],

            ['4','5','6','B'],

            ['7','8','9','C'],

            ['*','0','#','D']

         ]

ROW = [21,20,16,12]

COL = [26,19,13,6]

moNum=['0','0','0','0','0','0','0','0','0','0']

m11=17

m12=27

led=5

buz=26

button=19

RS =18

EN =23

D4 =24

D5 =25

D6 =8

D7 =7

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(led, gpio.OUT)

gpio.setup(buz, gpio.OUT)

gpio.setup(m11, gpio.OUT)

gpio.setup(m12, gpio.OUT)

gpio.setup(button, gpio.IN)

gpio.output(led , 0)

gpio.output(buz , 0)

gpio.output(m11 , 0)

gpio.output(m12 , 0)

for j in range(4):

    gpio.setup(COL[j], gpio.OUT)

    gpio.setup(COL[j],1)

for i in range (4):

    gpio.setup(ROW[i],gpio.IN,pull_up_down=gpio.PUD_UP)

Serial = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=2)

 

data=""

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 keypad():

   for j in range(4):

     gpio.setup(COL[j], gpio.OUT)

     gpio.output(COL[j], 0)

     ch=0

     for i in range(4):

       if gpio.input(ROW[i])==0:

         ch=MATRIX[i][j]

         #lcdwrite(ord(ch))

        # print "Key Pressed:",ch

        # time.sleep(2)

         return ch

         while (gpio.input(ROW[i]) == 0):

           pass

     gpio.output(COL[j],1)

    # callNum[n]=ch

def serialEvent():

    data = Serial.read(20)

    #if data != '\0':

    print data

    data=""

def gsmInit():

    lcdclear()

    lcdprint("Finding Module");

    time.sleep(1)

    while 1:

        data=""

        Serial.write("AT\r");

        data=Serial.read(10)

        print data

        r=data.find("OK")

        if r>=0:

            break

        time.sleep(0.5)

    while 1:

        data=""

        Serial.write("AT+CLIP=1\r");

        data=Serial.read(10)

        print data

        r=data.find("OK")

        if r>=0:

            break

        time.sleep(0.5)

    lcdclear()

    lcdprint("Finding Network")

    time.sleep(1)

    while 1:

        data=""

        Serial.flush()

        Serial.write("AT+CPIN?\r");

        data=Serial.read(30)

        print data

        r=data.find("READY")

        if r>=0:

            break

        time.sleep(0.5)

    lcdclear()

    lcdprint("Finding Operator")

    time.sleep(1)

    while 1:

        data=""

        Serial.flush()

        Serial.read(20)

        Serial.write("AT+COPS?\r");

        data=Serial.read(40)

        #print data

        r=data.find("+COPS:")

        if r>=0:

            l1=data.find(",\"")+2

            l2=data.find("\"\r")

            operator=data[l1:l2]

            lcdclear()

            lcdprint(operator)

            time.sleep(3)

            print operator

            break;

        time.sleep(0.5)

    Serial.write("AT+CMGF=1\r");

    time.sleep(0.5)

   # Serial.write("AT+CNMI=2,2,0,0,0\r");

   # time.sleep(0.5)

    Serial.write("AT+CSMP=17,167,0,0\r");

    time.sleep(0.5)

def receiveCall(data):

        inNumber=""

        r=data.find("+CLIP:")

        if r>0:

            inNumber=""

            inNumber=data[r+8:r+21]

            lcdclear()

            lcdprint("incoming")

            setCursor(0,1)

            lcdprint(inNumber)

            time.sleep(1)

            return 1

def receive SMS(data):

    print data

    r=data.find("\",")

    print r

    if r>0:

        if data[r+4] == "\r":

            smsNum=data[r+2:r+4]

        elif data[r+3] == "\r":

            smsNum=data[r+2]

        elif data[r+5] == "\r":

            smsNum=data[r+2:r+5]

        else:

            print "else"

        print smsNum

        if r>0:

            lcdclear()

            lcdprint("SMS Received")

            setCursor(0,1)

            lcdprint("Press Button B")

            print "AT+CMGR="+smsNum+"\r"

            time.sleep(2)

            return str(smsNum)

    else:

        return 0

def attendCall():

    print "Attend call"

    Serial.write("ATA\r")

    data=""

    data=Serial.read(10)

    l=data.find("OK")

    if l>=0:

        lcdclear()

        lcdprint("Call attended")

        time.sleep(2)

        flag=-1;

        while flag<0:

            data=Serial.read(12);

            print data

            flag=data.find("NO CARRIER")

            #flag=data.find("BUSY")

            print flag

        lcdclear()

        lcdprint("Call Ended")

        time.sleep(1)

        lcdclear()

def readSMS(index):

                print index

                Serial.write("AT+CMGR="+index+"\r")

                data=""

                data=Serial.read(200)

                print data

                r=data.find("OK")

                if r>=0:

                    r1=data.find("\"\r\n")

                    msg=""

                    msg=data[r1+3:r-4]

                    lcdclear()

                    lcdprint(msg)

                    print msg

                    time.sleep(5)

                    lcdclear();

                    smsFlag=0

                    print "Receive SMS"

def getChar(Key, ind, maxInd):

            ch=0

            ch=ind

            lcdcmd(0x0e)

           Char=''

            count=0

 

            global msg

            global x

            global y

            while count<20:

                key=keypad()

                print key

                if key== Key:

                    setCursor(x,y)

                    Char=alpha[ch]

                    lcdwrite(ord(Char))

                    ch=ch+1

                    if ch>maxInd:

                        ch=ind

                    count=0

                count=count+1

                time.sleep(0.1)

            msg+=Char

            x=x+1

            if x>15:

                x=0

                y=1

            lcdcmd(0x0f)

 

def alphaKeypad():

    lcdclear()

    setCursor(x,y)

    lcdcmd(0x0f)

    msg=""

    while 1:

        key=0

        count=0

        key=keypad()

        if key == '1':

            ind=0

            maxInd=6

            Key='1'

            getChar(Key, ind, maxInd)

        elif key == '2':

            ind=7

            maxInd=10

            Key='2'

            getChar(Key, ind, maxInd)

        elif key == '3':

            ind=11

            maxInd=14

            Key='3'

            getChar(Key, ind, maxInd)

        elif key == '4':

            ind=15

            maxInd=18

            Key='4'

            getChar(Key, ind, maxInd)

        elif key == '5':

            ind=19

            maxInd=22

            Key='5'

            getChar(Key, ind, maxInd)

        elif key == '6':

            ind=23

            maxInd=26

            Key='6'

            getChar(Key, ind, maxInd)

        elif key == '7':

            ind=27

            maxInd=31

            Key='7'

            getChar(Key, ind, maxInd)

        elif key == '8':

            ind=32

            maxInd=35

            Key='8'

            getChar(Key, ind, maxInd)

        elif key == '9':

            ind=36

            maxInd=40

            Key='9'

            getChar(Key, ind, maxInd)

        elif key == '0':

            ind=41

            maxInd=42

            Key='0'

            getChar(Key, ind, maxInd)

        elif key == '*':

            ind=43

            maxInd=43

            Key='*'

            getChar(Key, ind, maxInd)

        elif key == '#':

            ind=44

            maxInd=44

            Key='#'

            getChar(Key, ind, maxInd)

        elif key== 'D':

            return

def sendSMS():

    print"Sending sms"

    lcdclear()

    lcdprint("Enter Number:")

    setCursor(0,1)

    time.sleep(2)

    moNum=""

    while 1:

        key=0;

        key=keypad()

        #print key

        if key>0:

            if key == 'A'  or key== 'B' or key== 'C':

                print key

                return

            elif key == 'D':

                print key

                print moNum

                Serial.write("AT+CMGF=1\r")

                time.sleep(1)

                Serial.write("AT+CMGS=\"+91"+moNum+"\"\r")

                time.sleep(2)

                data=""

                data=Serial.read(60)

                print data

                alphaKeypad()

                print msg

                lcdclear()

                lcdprint("Sending.....")

                Serial.write(msg)

                time.sleep(1)

                Serial.write("\x1A")

                while 1:

                    data=""

                    data=Serial.read(40)

                    print data

                    l=data.find("+CMGS:")

                   if l>=0:

                        lcdclear()

                        lcdprint("SMS Sent.")

                        time.sleep(2)

                        return;

                    l=data.find("Error")

                    if l>=0:

                        lcdclear()

                        lcdprint("Error")

                        time.sleep(1)

                        return

            else:

                print key

                moNum+=key

                lcdwrite(ord(key))

                time.sleep(0.5)

def call():

    print "Call"

    n=0

    moNum=""

    lcdclear()

    lcdprint("Enter Number:")

    setCursor(0,1)

    time.sleep(2)

    while 1:

        key=0;

        key=keypad()

        #print key

        if key>0:

            if key == 'A'  or key== 'B' or key== 'D':

                print key

                return

            elif key == 'C':

                print key

                print moNum

                Serial.write("ATD+91"+moNum+";\r")

                data=""

                time.sleep(2)

                data=Serial.read(30)

                l=data.find("OK")

                if l>=0:

                    lcdclear()

                    lcdprint("Calling.....")

                   setCursor(0,1)

                    lcdprint("+91"+moNum)

                    time.sleep(30)

                    lcdclear()

                    return

                #l=data.find("Error")

                #if l>=0:

                else:

                    lcdclear()

                    lcdprint("Error")

                    time.sleep(1)

                    return

            else:

                print key

                moNum+=key

                lcdwrite(ord(key))

                n=n+1

                time.sleep(0.5)

begin()

lcdcmd(0x01)

lcdprint("  Mobile Phone  ")

lcdcmd(0xc0)

lcdprint("    Using RPI     ")

time.sleep(3)

lcdcmd(0x01)

lcdprint("Circuit Digest")

lcdcmd(0xc0)

lcdprint("Welcomes you")

time.sleep(3)

gsmInit()

smsFlag=0

index=""

while 1:

    key=0

    key=keypad()

    print key

    if key == 'A':

      attendCall()

    elif key == 'B':

      readSMS(index)

      smsFlag=0

    elif key == 'C':

      call()

    elif key == 'D':

      sendSMS()

    data=""

    Serial.flush()

    data=Serial.read(150)

    print data

    l=data.find("RING")

    if l>=0:

      callstr=data

      receiveCall(data)

    l=data.find("\"SM\"")

    if l>=0:

      smsstr=data

      smsIndex=""

      (smsIndex)=receiveSMS(smsstr)

      print smsIndex

      if smsIndex>0:

          smsFlag=1

          index=smsIndex

    if smsFlag == 1:

        lcdclear()

        lcdprint("New Message")

        time.sleep(1)

    setCursor(0,0)

    lcdprint("C--> Call <--A");

    setCursor(0,1);

    lcdprint("D--> SMS  <--B")

GSM Technology Applications

Here are some examples of how GSM technology can be put to use.

  1. Automation and Safety via Smart GSM Technology

Nowadays, we can't live without our GSM mobile terminal. The Mobile phone terminal is essentially an extension of ourselves, allowing us to connect with the world in the same way our wallet/purse, keys, or watch does. Many people like not having to worry about being unavailable or who they can call at any given moment.

It's clear from the name that this Project relies on the SMS transmission capabilities of GSM networks. The ability to send and receive text messages is widely utilized to provide access to equipment and facilitate home security breach management. There are two proposed subsystems in the system. Controlling appliances in one's house from afar is made possible by the appliance control subsystem, while the security alert subsystem provides automatic security monitoring.

The system can send consumers instructions via SMS from a designated phone number to adjust the home appliance's state as needed. An automatic SMS can be generated by the system upon detection of an intrusion, warning the user of a potential threat to their data.

The advent of GSM technology will make global, instantaneous, and universal communication possible. GSM's functional architecture employs intelligent networking principles as the first step toward a genuinely personal communication system with sufficient standards to ensure interoperability.

  1. Medical Uses for GSM-Based Systems

Here are two examples of similar situations to think about.

  • The patient has sustained a life-threatening injury or illness and requires emergency medical attention. A mobile phone is the only thing he (or his companion) has.

  • After being released from the hospital, the patient plans to rest at home but is reminded that he must return for routine exams. A mobile phone and perhaps some health monitoring or other medical sensor gadgets may be in his possession.

The only way to solve either problem is via a mobile communication system. In other words, the above scenarios are easily manageable with today's communication technology because all that needs to be done is send the patient's information across a network and have it processed at the receiving end, which may be a hospital or the doctor's office.

In the first scenario, the doctor keeps tabs on the patient's information and returns the instructions to him so he can take whatever precautions before getting to the hospital. In the second scenario, the doctor keeps tabs on the patient's test results and, if necessary, proceeds with treatment.

Telemedicine services are the driving force behind this entire operation. The telemedicine system has three different applications.

  • Video conferencing lets patients in one location have face-to-face contact with their doctors and nurses, speeding up the healing process.

  • With the help of sensors that constantly report on a patient's condition and direct medical staff on how to proceed with treatment.

  • By sending the gathered health information for further review and analysis.

A wireless method of communication is used for the three options mentioned above. When providing healthcare, it is necessary to have many data retrieval mechanisms in place. These can be online medical databases or hosts with equipment that aid recovery and health monitoring. Broadband networks, medium-throughput media, and narrowband GSM access are all viable possibilities.

There are several benefits to using GSM technology in a telemedicine setup.

  • Cost savings and widespread availability of GSM receivers (including cell phones and modems)

  • It can transfer data quickly.

  1. Typical Telemedical Infrastructure

The four components that make up a standard telemedicine system are as follows:

  1. The Patient Unit: It takes data from the patient, either in its original analog form or after being converted to digital format, and then manages the data stream before sending it. It is made up of several different types of medical sensors, such as those used to track heart rate, blood pressure, body temperature, spirometry, etc., each of which generates an electrical signal that is sent to a processor or controller for analysis before being transmitted over a wireless network.

  2. Communication Network: As such, it is employed for both data transmission and security. Networks, mobile stations, and base stations are all components of the Global System for Mobile Communication (GSM) system. The mobile station, also known as the mobile phone or primary mobile access point, is the device responsible for connecting mobile devices to the global system for mobile communications (GSM) network.

  3. Receiving/Server Side: This is a healthcare system with a GSM modem installed to receive, decode, and forward signals to the presenting device.

  4. Presentation Unit: This is the brains of the operation. This processor saves the data in a standard format for later retrieval and analysis by doctors and from which they can send text messages to the client side if necessary.

To demonstrate the fundamentals of telemedicine, a rudimentary model will suffice. It has a sender and a receiver, both of which are separate components. The sensor input is transmitted by the transmitter and received by the receiver unit for processing.

See below for a simplified telemedicine system to track a patient's heart rate and apply the results as needed.

The data collected by the heartbeat detector (a light-emitting device whose light is modified as it flows through human blood) is transformed into electrical pulses at the transmitter unit. When the Microcontroller picks up on these pulses, it calculates the heart rate and communicates that information and other data collected to the medical team via a Gsm network. An IC called a Max 232 connects the Microcontroller to the GSM modem.

The GSM modem at the receiving end grabs the information and passes it to the Microcontroller. The Microcontroller then performs an analysis using the input from the Personal computer and displays the outcome on the LCD. Medical professionals can keep tabs on the patient and begin the necessary treatment after reviewing the results on the screen.

Medical Applications of Global Systems for Mobile Communication

The following are some real-world applications for GSM technology.

  1. AT&T Health GlowCaps

These plain pill bottles serve as a gentle prompt to the patient to take their prescribed medications. It uses GSM technology to contact the patient on their mobile phone at the specified pill-taking time, at which point the cap will light up, the buzzer will sound, and the patient will be reminded to take their medication. Each time a bottle is uncorked, it is documented.

  1. Ultrasound technology

With the help of a portable ultrasound transducer that connects to a smartphone, it is possible to send ultrasound images captured with a handheld device to a distant location using a global system for mobile communications (GSM).

  1. A Continuous Glucose Monitor (CGM)

The patient's blood sugar levels can be tracked and reported to the doctor. A sensor is implanted under the skin and monitors blood glucose levels, sending the data to a receiver (a mobile phone) at regular intervals.

Conclusion

As part of this guide, we analyzed GSM's architecture and learned how it operates in practice. We wrote a Python program to turn our Raspberry Pi 4 into a fully functional mobile phone. No technical difficulties were encountered as we watched text and phone calls travel between the raspberry pi and our mobile phone. You should feel confident in your ability to apply the ideas and understand the circuits of GSM now. One way to up the difficulty level of this Project is to try to make a live video call using the raspberry pi 4 mobile. Next, we'll look at connecting the pcf8591 ADC/DAC analog-digital converter module to a Raspberry Pi.

RF Communication with nRF24L01 and Raspberry Pi 4

Where To Buy?
No.ComponentsDistributorLink To Buy
1BreadboardAmazonBuy Now
2Jumper WiresAmazonBuy Now
3LCD 16x2AmazonBuy Now
4nRF24L01AmazonBuy Now
5Arduino UnoAmazonBuy Now
6Raspberry Pi 4AmazonBuy Now

Introduction

We're glad you could join us for another lesson in our series on programming for the Raspberry Pi 4. The previous chapter covered how to interface the USB barcode scanner with raspberry pi 4. We looked at different types of barcodes and what each stripe represents as well as the different types of barcode scanners available today. We also built a python program for the intelligent shopping cart and now our familiarity with barcodes and scanners and how they function has significantly increased. The benefits and drawbacks of its use were also discussed, but what we're interested in for this article is the transmission of radio frequency signals using the nrf24l01 Module in a raspberry pi 4.

Components

  • nRF24L01 RF module

  • Raspberry pi 4

  • Arduino Uno

  • Jumper wires

  • Power supply

  • 16x2 liquid crystal display

Wireless communication systems, such as ESPS266 WiFi modules, are widely used in the design process. Further, the media chosen is determined by the function it will serve. It's no secret that the nRF24L01 is a widely used wireless channel for local area network communication. These modules have a band rate of 250Kbps to 2Mbps and transmit on the 2.4GHz (ISM band), which is permitted in many states and suitable for usage in industrial and healthcare settings. There is also the claim that these modules can communicate at a distance of up to 100 meters with the correct antennae.

This tutorial demonstrates how to set up wireless communication between an Arduino UNO and a Raspberry Pi by utilizing the nRF24L01 - 2.4GHz RF Transceiver module. Raspberry Pi will broadcast data via nRF24L01, and Arduino Board will receive the data and display it on a 16x2 LCD. In addition to its built-in WiFi and Bluetooth Low Energy (BLE) capabilities, the nRF24L01 is also capable of wireless communication via BLE.

Both parts of the tutorial are equally important. In the first, we'll see how to connect the nRF24L01 to an Arduino so that it can function as a receiver, and in the second, we'll do the same thing with a Raspberry Pi can send out signals.

The meaning of "wireless radio frequency."

There are many different types of electromagnetic waves. Still, the ones utilized for radar signals and communications fall into roughly 3 kHz to 300 GHz range, known as "radio frequencies."

The term "radio frequency" is more commonly used to refer to electrical than mechanical oscillations. There are, however, examples of mechanical RF systems. Although radio frequency (RF) refers to an oscillation rate, the term "radio frequency" (RF) is sometimes used interchangeably with "radio" to describe the practice of communicating without the need for wires.

Numerous wireless technologies rely on RF fields, including cordless and cell phones, radio and television broadcasting stations, satellite telecommunication networks, Bluetooth communication modules and WiFi, and two-way radios.

External communications include various products like garage doors and microwave ovens, which use radio frequencies. The infrared frequencies of various wireless devices, like TV remote controllers, computer mice, and some wireless computer keyboards, have shorter electromagnetic wavelengths.

So, How Exactly Does Radio Frequency Operate?

The frequency of radio transmission is expressed in hertz (Hz) units, which stand for the count of cycles per second. Radio waves can travel from one thousand hertz (kHz) to several gigahertz (GHz). Microwaves, a form of radio wave, operate at much higher frequencies. Because of this, we can't see radio frequencies (RFs).

The wavelength' of a radio wave is proportional to the square root of the frequency 'f.' The relationship between frequency and wavelength can be expressed in megahertz and meters, respectively.

s = 300/f

At higher frequencies, electromagnetic radiation is manifested as infrared (IR), ultraviolet (UV), visible (Visible), X-ray (XR), and gamma-ray (GJ).

Traits of Radio Frequency

The following are some of the defining features of RF:

  • Low energy consumption

  • It has an excellent operational range (three to thirty meters), a data rate of up to two megabits per second, the ability to pass through walls, and can transmit in any direction.

The nRF24L01 Radio Frequency (RF) Module

Due to their half-duplex design, the nRF24L01 modules can only send or receive data but not do both. The Module's data transmission and reception are handled by the generic Nordic semi-conductor nRF24L01 IC. The IC uses the simple serial peripheral interface (SPI) protocol for communication, making it compatible with virtually all microcontrollers. Arduino makes things much simpler because there are numerous library resources available. The following table depicts the pin configurations of a typical nRF24L01 module.

The Module is battery efficient, as its operating voltage ranges from 1.9V to 3.6V, and it draws minimal current (only 12mA) during regular operation. Most pins can be connected directly with 5V chipsets like Arduino, even though the voltage rating is 3.3V. Each Module also includes 6 Pipelines, which is a huge time saver. Simply put, each Module can exchange information with up to six others. Therefore, the Module can be used for IoT applications requiring the creation of star or mesh networks. With an extensive network address of 125 unique IDs, we may use 125 such components in a contained space without worrying about them interfering with one another.

Mechanics of Operation

Given that the Module supports 125 separate channels, creating a network containing 125 fully available modems at a single location is theoretically possible. Each device can simultaneously interface with up to six others on the same channel.

Transmission with this Module only uses about 12mA of power, less than a single display LED screen. The Module requires a voltage of 1.9V to 3.6V to function. Still, the other pins are 5V logic compatible, allowing us to connect it directly to an Arduino without needing logic-level converters.

Three of these terminals are used for SPI communication and must be hooked up to the SPI pins on the Arduino; however, the SPI pins on different Arduino boards are labelled differently. Connecting the CSN and CE pins to any input pin on the Arduino board toggles between standby and active modes and transmit and command modes for the Module. The last connector is an interrupt pin, which is optional.

Variations in Modules

The NRF24L01 modules can be found in a wide range of versions. The model with a built-in antenna is the clear frontrunner. This reduces the transmission range of the Module to around 100 meters but allows for a smaller module size.

In the second variant, an SMA connector replaces the onboard antenna, allowing us to use a duck transmitter for enhanced signal strength.

The third variant displayed here also features the duck antenna with an RFX2401C microprocessor with an integrated Power Amplifier and Low-Noise Amplifier). This can increase the NRF24L01's transmission range in open areas by 1000.

Circuit Schematic

Integrating nRF24L01 with Arduino

The components in the circuit design for linking nRF24L01 to Arduino are few, and the process is straightforward. SPI will be used to link the nRF24l01, and I2C will connect the 16x2 LCD.

Integrating nRF24L01 on a Raspberry Pi

Because only the SPI adapter is required to link the Raspberry Pi and the nRF24L01, the corresponding circuit schematic is pretty straightforward.

How to Use nRF24l01 with Raspberry Pi to Communicate

Python3 will be used for Raspberry Pi's programming. The Arduino platform is not the only one that can use C/C++. However, if you're programming in Python, you can get a library for nRF24l01 that's already been made. Keep in mind that the library and the python program must be in the same folder for the python program to use it. Create a folder to house your applications and library files after you have downloaded and extracted the library. After the necessary libraries have been installed, you can begin coding immediately. Importing libraries like the GPIO library for communicating with the Raspberry Pi's GPIO pins and the time library for using the Pi's clock and date functions are the first steps in writing any program.

import RPi.GPIO as GPIO 

import time     

import spidev

from lib_nrf24 import NRF24

It would be best if you switched to the "Broadcom SOC channel" for the GPIO setting. Pins are referred to by their "Broadcom SOC channel" numbers, which follow the letters "GPIO" (GPIO01, GPIO02, etc.). The Board Numbers are not these.

GPIO.setmode(GPIO.BCM)

After that, we'll assign a permanent address for the pipe. To send data to Arduino, you'll need to use this address. There will be a hexadecimal representation of the address.

pipes = [[0xE0, 0xE0, 0xF1, 0xF1, 0xE0], [0xF1, 0xF1, 0xF0, 0xF0, 0xE0]]

Start the radio with the CE pin (GPIO08) and the CSN pin (GPIO25).

radio.begin(0, 25)

Change the power levels to minimal, the channel address to 76, the data rate to 1 Mbps, and the payload size to 32 bits.

radio.setPayloadSize(32)  

radio.setChannel(0x76) 

radio.setDataRate(NRF24.BR_1MBPS)    

radio.setPALevel(NRF24.PA_MIN)

Start the data writing process by opening the pipes and displaying some nRF24l01 basics.

radio.openWritingPipe(pipes[0])     

radio.printDetails()

Get your message ready to send as a string. Arduino UNO will receive this message.

sendMessage = list("Hi..Arduino UNO")  

while len(sendMessage) < 32:    

    sendMessage.append(0)

Send the string's first character to the stereo and continue doing so until the radio is ready to receive it. In addition, a debug statement detailing the time and date the message was delivered should be printed.

While True:

    start = time.time()      

    radio.write(sendMessage)   

    print("Sent the message: {}".format(sendMessage))  

send

    radio.start listening()


A timed-out error message should be printed if the thread is finished and the conduit is closed.

while not radio.available(0):

        time.sleep(1/100)

        If time.time() - start > 2:

            print("Timed out.")  # print error message if radio disconnected or not functioning anymore

            break

If you want to send another message, turn off the radio and disconnect from the connection for three seconds.

radio.stopListening()     # close radio

    time.sleep(3)  # give a delay of 3 seconds

If you know the fundamentals of Python, you can easily comprehend the Raspberry program. You will find a fully functional Python program at the end of this tutorial.

Putting the Python Code for the Raspberry Pi to Work

If you follow the steps below, running the software will be a breeze.

  • You should keep the Python source code and library files together.

    • My Sender program file is nrfsend.py, and all the related files are in the same directory.

      • Access Raspberry Pi's command prompt. Use the cd command to get to the directory containing the python script.

        • Navigate to the directory, type "sudo python3 your program.py," and hit enter to run the program. In less than a minute, you'll likely see nRf24's essentials laid out, and the broadcaster will begin broadcasting its bulletins at three-second intervals. Once the send is complete, the debug message will appear.

        The Arduino UNO will now display the same code as the receiver.

        The nRF24l01 and Arduino UNO: Message Reception Programming

        The Arduino UNO can be programmed in a manner not dissimilar to that of the Raspberry Pi. Our procedures will be very similar; however, we'll use a different language for programming and other processes. The procedure will incorporate the nRF24l01 readout. Download the nRF24l01 Arduino library from GitHub. To get started, make sure all required libraries are installed. We're using a 16x2 I2C LCD, so we need to include the Wire.h library; the nRF24l01 communicates via SPI, so we also need the SPI library.

        #include<SPI.h>                   

        #include <Wire.h>

        Don't forget to add the RF24 and LCD libraries so you may use them.

        #include<RF24.h>                  

        #include <LiquidCrystal_I2C.h>

        Put the LCD's I2C address—27 in this case, as it's a 16x2 display—into the appropriate function.

        LiquidCrystal_I2C lcd(0x27, 16, 2);

        Pin 9 serves as the RF24's Common Emitter, and pin 10 serves as its Common Source Negative.

        RF24 radio(9, 10) ;  

        Turn the radio on and tune in to channel 76. In addition, open the pipe for reading by setting the address to that of the Raspberry Pi.

        radio.begin();        

          radio.setPALevel(RF24_PA_MAX) ;   

          radio.setChannel(0x76) ;            

          const uint64_t pipe = 0xE0E0F1F1E0LL ;    

          radio.openReadingPipe(1, pipe) ;

        Start the I2C data transfer and initialize the LCD screen.

        Wire.begin();                 

          lcd.begin();                    

          lcd.home();                       

          lcd.print("Ready to Receive");

        Turn on the radio's receiver and enter a message length of 32.

        radio.startListening() ;        

          char receivedMessage[32] = {0}

        The message will be read and saved immediately if a radio is connected. Display the message on the screen and send it to the serial monitor till the following message is received. Put the radio on hold while you tune in, then try again later. Right this way, in ten microseconds.

        if (radio.available()) {       

            radio.read(receivedMessage, sizeof(receivedMessage));        

            Serial.println(receivedMessage) ;    

            Serial.println("Turning off the radio.") ;   

            radio.stopListening() ;   

            String stringMessage(receivedMessage) ;     

            lcd.clear();    

            delay(1000);    

            lcd.print(stringMessage);   

          }

        Copy and paste the code below into your server and allow time for the response to arrive.

        NRF Transmitter Side Code (Raspberry Pi)

        import RPi.GPIO as GPIO  # import gpio

        import time      #import time library

        import spidev

        from lib_nrf24 import NRF24   #import NRF24 library

        GPIO.setmode(GPIO.BCM)       # set the gpio mode

          # set the pipe address. This address should be entered on the receiver to

        pipes = [[0xE0, 0xE0, 0xF1, 0xF1, 0xE0], [0xF1, 0xF1, 0xF0, 0xF0, 0xE0]]

        radio = NRF24(GPIO, spidev.SpiDev())   # use the gpio pins

        radio.begin(0, 25)   # start the radio and set the ce,csn pin ce= GPIO08, csn= GPIO25

        radio.setPayloadSize(32)  #set the payload size as 32 bytes

        radio.setChannel(0x76) # set the channel as 76 hex

        radio.setDataRate(NRF24.BR_1MBPS)    # set radio data rate

        radio.setPALevel(NRF24.PA_MIN)  # set PA level

        radio.setAutoAck(True)       # set acknowledgement as true 

        radio.enableDynamicPayloads()

        radio.enableAckPayload()

        radio.openWritingPipe(pipes[0])     # open the defined pipe for writing

        radio.printDetails()      # print basic detals of radio

        sendMessage = list("Hi..Arduino UNO")  #the message to be sent

        while len(sendMessage) < 32:    

            sendMessage.append(0)

        While True:

            start = time.time()      #start the time for checking delivery time

            radio.write(sendMessage)   # just write the message to radio

            print("Sent the message: {}".format(sendMessage))  # print a message after succesfull send

            radio.startListening()        # Start listening the radio

            while not radio.available(0):

                time.sleep(1/100)

                if time.time() - start > 2:

                    print("Timed out.")  # print error message if the radio disconnected or not functioning anymore

                    break

            radio.stopListening()     # close radio

            time.sleep(3)  # give delay of 3 seconds

        NRF Receiver Side Code (Arduino):

        #include<SPI.h>                   // spi library for connecting nrf

        #include <Wire.h>                             // i2c libary fro 16x2 lcd display

        #include<RF24.h>                  // nrf library

        #include <LiquidCrystal_I2C.h>     // 16x2 lcd display library

        LiquidCrystal_I2C lcd(0x27, 16, 2);         // i2c address is 0x27

        RF24 radio(9, 10) ;  // ce, csn pins    

        void setup(void) {

          while (!Serial) ;

          Serial.begin(9600) ;     // start serial monitor baud rate

          Serial.println("Starting.. Setting Up.. Radio on..") ; // debug message

          radio.begin();        // start radio at ce csn pin 9 and 10

          radio.setPALevel(RF24_PA_MAX) ;   // set power level

          radio.setChannel(0x76) ;            // set chanel at 76

          const uint64_t pipe = 0xE0E0F1F1E0LL ;    // pipe address same as sender i.e. raspberry pi

          radio.openReadingPipe(1, pipe) ;        // start reading pipe 

          radio.enableDynamicPayloads() ;

          radio.powerUp() ;          

          Wire.begin();                 //start i2c address

          lcd.begin();                    // start lcd 

          lcd.home();                       

          lcd.print("Ready to Receive");  // print starting message on lcd 

          delay(2000);

          lcd.clear();

        }

        void loop(void) {

          radio.startListening() ;        // start listening forever

          char receivedMessage[32] = {0} ;   // set incmng message for 32 bytes

          if (radio.available()) {       // check if message is coming

            radio.read(receivedMessage, sizeof(receivedMessage));    // read the message and save

            Serial.println(receivedMessage) ;    // print message on serial monitor 

            Serial.println("Turning off the radio.") ;   // print message on serial monitor

            radio.stopListening() ;   // stop listening radio

            String stringMessage(receivedMessage) ;     // change char to string

            lcd.clear();    // clear screen for new message

            delay(1000);    // delay of 1 second 

            lcd.print(stringMessage);   // print received mesage

          }

          delay(10);

        }

        Features That Have the Most Impact on RF Module Efficiency

        The RF module's performance will be affected by the same factors as any other RF component. For instance, a transmitter's output power can be increased to extend the range of a transmission. However, this will cause a greater consumption of electricity by the transmitters (TX) device, reducing the useful life of battery-operated gadgets. Increasing the system's transmit power also makes it more vulnerable to interference from a second RF source.

        Similarly, boosting the receiver's sensitivity increases the usable communication range but increases the risk of an error brought on by interference from other RF equipment. Matching antennas on both ends of a communication link can potentially boost the overall system's performance.

        Finally, the regarded remote distance of any given system is typically measured in an open-air line-of-sight outline without any interference; nevertheless, problems such as floors, walls, and dense structures will frequently grasp the radio wave signals; thus, the actual operational distance will typically be less than specified.

        Uses for Radio Frequency Communication

        The most common uses of radio frequency communication are in the areas of wireless data and voice transfer, home automation, and remote control, as well as in the industrial and commercial sectors.

        RF-controlled switches can be used in home automation applications as an alternative to traditional switches. An RF remote allows one to operate lights and other electronics without leaving their current location. Those with mobility issues will benefit the most from this app. RF communication is helpful in industrial settings for directing autonomous robots and motorized vehicles. These robot vehicles are often employed in hazardous tasks humans cannot undertake. A data transmission unit is required to direct the motion of the robotic vehicles.

        Multiple factors make radio frequency (RF) transmission preferable to infrared (IR) (infrared). The more extended range of RF signals makes them ideal for long-distance communications. Unlike radio frequency (RF), which can go across obstacles, infrared (IR) generally requires a clear path from transmitter to receiver. The reliability of RF transmission is far greater than that of infrared remote communications. While radio frequency (RF) communications require other IR-emitting devices that can disrupt a precise frequency range, infrared (IR) communications.

        Problems with Radio Frequency

        These are some of RF's drawbacks.

        • Preschoolers, expectant mothers, the elderly, those with pacemakers, little birds, flora, wildlife, insects, etc., are all negatively impacted by unregulated RF radiation.

        • More lightning has been seen in nearby cellular towers that use radio frequency than in other areas.

        • Some fruit crops in the vicinity of RF towers are also negatively impacted.

        • Because RF waves are accessible in both line-of-sight (LOS) and non-LOS zones of the transmitter, hackers can easily break into the system and decode sensitive personal or government data.

        • This problem can be avoided by employing highly protected methods like AES, WEP, WPA, etc., while transmitting data over radio frequency waves. Spread spectrum and frequency hopping modulation methods can also be applied to RF signals to prevent such eavesdropping.


        Conclusion

        This concludes the comprehensive instruction on wireless communication between a Raspberry Pi and an Arduino UNO via nRf24l01 modules. The 16 * 2 liquid crystal display will show the message. Pipe addresses are crucial on the Arduino UNO and the Raspberry Pi 4. In the following tutorial, we will learn how to Call and Text using Raspberry Pi and GSM Module in pi 4.

        Interface USB Barcode Scanner with Raspberry Pi 4

        Hello friends, I hope you all are doing great. Today, we are going to start a new section in our Raspberry Pi Programming Course. In this section-VIII, we will implement advance protocols in the RPi4 board. Today's our first lecture in this section and we are going to interface a USB Bar Code Scanner with Raspberry Pi 4.

        If you have visited any big grocery store, you must have seen, it's quite important as well as difficult to maintain the products in stock at all times. To ease the job, barcode technology is used because it can easily maintain an organized database of your items, costs, and inventory levels in one convenient location. Price changes can be implemented whenever you desire without requiring new labels for previously packaged goods. You can tell exactly when your supply of a particular item is getting low, so you may place a new purchase before you run out. Since the barcode system is so precise, you may assume that any missing (and seemingly unsold) items have been stolen.

        Here's the video demonstration of this barcode tutorial:


        So, let's get started with the implementation of a barcode scanner with Raspberry Pi 4:

        Project Description

        In this post, you'll learn how to read the Barcode scanner's output in the Serial interface of Raspberry Pi 4 and display the scanned code on the 16x2 LCD. When a User reviews an item's code, the LCD will update to reflect the new total number of items in the shopping basket. This configuration allows us to create an intelligent cart with an integrated billing system.

        Components Required

        Here's the list of components, used in designing today's project:

        • Raspberry Pi 4
        • USB Handheld Barcode Scanner
        • 16x2 alphanumeric LCD
        • I2C Module for LCD
        • Jumper Wires
        • Sample Barcoded Items

        Simple Bar Code Scanner: The Fundamentals

        • A barcode is an electronic module used to read a graphical code represented by a series of black-and-white parallel bars.
        • These black and white bars are actually representing a numeric digit, which is extracted by the barcode scanner.
        • Barcode Scanner sends its data to the microcontroller via USB/UART.
        • We are going to use the below barcode scanner:

        Barcode Scanner can read a wide range of linear barcodes. Barcode scanners are commonly utilized in retail settings like supermarkets, grocery stores, restaurants, boutiques, warehouse inventory,  invoices for bookkeeping and other retail establishments. Intelligent shopping carts now use barcode scanners to quickly and accurately identify products.

        Connecting your handheld barcode scanner to a computer is as simple as plugging it into a USB port. Barcode scanners can typically decode at speeds of up to 300 scans/second. Additionally, they can easily read a wide range of scratchy, blurry barcodes.

        Serial output through USB is provided in either H.I.D. mode or RS232 mode, depending on the device's configuration. Users can change the Baud rate from 9600 to 115200 and modify the Suffix by adding a C.R., L.F., CR+LF, or no ending characters. And you may set it to read in either Trigger Mode or Continuous Mode. Scanning the included settings sheet's Barcode will also restore the machine to its factory defaults.

        Barcode Working Principle

        As we discussed above, the black & white bars are actually representing a numeric digit. We are hiding the numeric digit in black & white bars because it's difficult for computers to recognize decimal numbers but reading a simple bar is quite easy. The below figure shows the respective bars for numeric digits 0-9:

        Looking at a barcode, it might be difficult to determine, where one set of numbers stops and another starts. But in reality, it's pretty easy. There are precisely seven units of horizontal space in each letter. So, in order to get the numeric digit "1", the bar code(starting from left) has two white lines, two black lines, two white lines, and finally one black line, as shown in the above figure.

        The barcode printing on the consumer goods has a universal representation i.e. a series of vertical stripes and the numeric code imprinted below, so that,  the Barcode can be manually keyed in, if it is incorrectly printed or scratched in the store. Two-dimensional barcodes are also used on some items i.e. postal stamps, as shown in the below figure:

        Let's pretend that barcodes are specific on-off binary sequences, with every black stripe representing a one and every white stripe representing a zero. (We've seen that actual barcodes are more complex than this, but for now, simplicity is in order.)

        1. The Barcode is illuminated by the scanning head's L.E.D. or laser.
        2. Second, a photoelectric cell, an electronic component that detects light, receives the light reflected from the Barcode. The Barcode's white spaces are the most reflective, while the black ones are the least.
        3. Third, the cell produces an on/off pulse sequence corresponding to black and white lines when the scanner goes through the Barcode. The cell would read "off off off off off off" if the shown Code were to be entered.
        4. These on/off pulses are then translated into numeric values via an electronic circuit connected to the scanner.
        5. A computer program generates the final Barcode using the digital data sent from the scanner.

        Some scanners use a single photosensitive cell that reads the barcode pixel by pixel as you slide the sensor head over the item (or the product across the reader). The complete Code is detected in a single pass, thanks to a row of photoelectric cells in more complex scanners.

        Types of Barcodes

        The following are examples of well-known barcode types:

        • The European Item Numbering Scheme (EAN) is a specialized version of the Uniform Product Code (U.P.C.) for items with a thirteen-digit identifier. There are 13 digits in an EAN13 barcode.

          • The retail sector heavily uses UPC-A barcodes based on the U.P.C. The Universal Product Code, Extended (UPC-A), comprises 12 digits.

            • (EAN -8) uses a set of numbers superseding the U.P.C. EAN-8 for compact shipments; these numbers include eight digits.

              • Like code 128's character set C, Intermingled 2 of 5 (I.T.F.) is an arithmetic barcode used to encode pairs of integers in a space-efficient manner.

                • The Code 39 Q.R. code is the most straightforward of all the alphanumeric barcodes because it performs its character verification.

                  • Code 128 is a high-density, efficient symbology for encoding alphanumeric data. The checksum digit is incorporated into the symbology, and the Barcode's integrity can be checked by comparing the checksum with the original data or by comparing the Barcode's bytes to the original data's parity.

                  Since Code 128 is widely utilized for its ability to hold alphanumeric data of a fixed length, we've chosen it to employ in our project.

                  Types of Barcode Scanners

                  1. Pen-type Barcode

                  This scanner is widely used in retail stores as its cordless. A photodiode and L.E.D. are integrated into its tip. When light is shone on a barcode, its dark bars soak up the rays. In addition, the photodiode's output is reflected in the white areas. Because of this, the scanner can read the generated output waveform. They guarantee low costs and long service life. More specifically, the scanner has to maintain a fixed angle as it moves across the barcodes at a fixed rate. The user may have to spend some time at the gym to get good at this.

                  1. Laser-type Barcode

                  They follow the same principle as traditional pen readers. They use a laser beam as the light source and a revolving prism to detect it. Therefore, they are effective even at a distance of two feet. This allows them to be surface-mounted, eliminating the need for handshakes. Compared to traditional pen-style scanners, these are far superior due to their speed and accuracy.

                  1. Light-Emitting Diode Scanner

                  The ambient light that the Barcode emits is what is measured. The information is translated into a voltage pattern, which is then read by an L.E.D. scanner. Unlike other barcode scanners, this one doesn't come with a light source. Although the C.C.D. systems are pricey, they are more adaptable and accurate than alternatives. They're commonly found in stores.

                  1. Camera barcode reader 

                  The two-dimensional Barcode is usually scanned using a barcode scanner with a two-dimensional camera. The camera must be set to auto-focus and maintained at a fixed distance. Multiple small lights are placed to form the camera. The barcodes will be photographed digitally and uploaded to the system.

                  1. Imaging barcodes with a cell phone

                  These days, practically every smartphone has a built-in scanner. Successfully scanning the 2-dimensional Bar code will not necessitate autofocus. These barcodes are unreadable by a regular scanner.

                  Circuit Diagram of Barcode Scanner with Raspberry Pi 4

                  The Barcode detected by the barcode reader will be displayed on a 16x2 LCD screen connected to the Raspberry Pi 4.

                  The image below illustrates the circuit diagram of Raspberry Pi 4 with an LCD display and barcode scanner.

                  The Barcode scanner is connected via USB to Raspberry Pi 4, while the LCD is connected to the SPI pins of RPi4. The SPI pinout is as follows:

                  Here's the circuit diagram of the LCD 16x2 with RPi4:

                  Here's our hardware setup and as you can see, we have interfaced both LCD and barcode scanner with the Raspberry Pi 4. We also have a sheet of barcodes to scan:

                  Configuring Raspberry Pi's I2C Interface

                  To begin, we need to turn on I2C on the Raspberry Pi. Here is the command to enter in the terminal:

                  sudo raspi-config

                  Now, use the down arrow key to access the Interfacing menu, and from there, select the P5 option, which is the I2C Enable/Disable menu item.

                  Once that's done, it'll inquire whether or not "you want the A.R.M. interface to be enabled." If you want to see "The ARM I2C adapter is enabled," select "Yes>." Select "ok" and then "Complete" to confirm your selections.

                  To begin working on the Liquid crystal display, you must first verify its I2C address in the Python console.

                  sudo i2cdetect -y 1

                  The attached I2C device has address 27, as shown above.

                  Barcode Scanner Configuration

                  This came together with my barcode scanner. This card will allow us to quickly and easily alter the device's default settings and change the Data rate, Trigger mode, and more.

                  Make sure the method of data transmission is USB transmission before we begin programming. The reading mode should be set to Triggering, and the Suffix should be C.R.*. The end of a data set information is always signaled by an enter command when a carriage return is used.

                  Python Code for Barcode Scanner with Raspberry Pi 4

                  Now, access the Pi's command prompt and type pip install RPI LCD to get the software package downloaded and set up. My laptop and Raspberry Pi share the same wifi network; thus, I can control it from here using a V.N.C. viewer. In addition, I used THONNY and Python 3.7.3 to write the Code.

                  Since we'll be using Delay to show the material on the LCD, we're starting the Program by importing the Sleep object from time. Then, the RPI LCD object, used for integrating the 16 x 2 display, will be imported.

                  from time import sleep

                  from rpi_lcd import LCD

                  The number of objects scanned up until the loop's execution is kept in an item count variable. At first, it is set to 0 so that no invalid values are stored. For the same reason, the scanned Barcode will be saved in a variable called score, which will initially be empty.

                  item_count=0   

                  scode="" 

                  LCD.text("Scan the Code... ", 1)   

                  As long as the while loop is active, scanning will continue indefinitely unless the controller is reset. Terminal input is required for this loop's input() function, and the resulting String will be saved in the variable scope. Then, we'll get it shown on an LCD screen:

                  While 1:   

                      scode= str(input())  

                      LCD.text("Scanned Barcode is", 1)

                      LCD.text(code,2)  

                      sleep(2)   

                      LCD.text("   Item Added", 1)

                      sleep(2)

                      item_count=item_count+1   

                      IC=str(item_count)   

                      LCD.text("  Total Item = ",1)

                      LCD.text(IC,2) 

                      sleep(1)

                  The initial value of the item count was 0; however, it will be increased while the loop is executed. The item count is currently set to 1. We'll use typecasting to change the item count value from an integer to a string so that it can be shown on the LCD screen through the LCD.text() function.

                  Viewing the accompanying illustrations may help clarify matters. After two seconds, the LCD will show the total number of items scanned rather than the scanned Barcode itself (which will remain on the screen for two seconds).

                  Complete Code

                  from time import sleep

                  from rpi_lcd import LCD

                  LCD = LCD() 

                  item_count=0   

                  scode="" 

                  LCD.text("Scan the Code... ", 1)   

                  while 1:   

                      scode= str(input()) 

                      LCD.text("Scanned Barcode is", 1)

                      LCD.text(code,2)  

                      sleep(2)   #Delay of 2 seconds

                      LCD.text("   Item Added", 1)

                      sleep(2)

                      item_count=item_count+1   

                      IC=str(item_count)  

                      LCD.text("  Total Item = ",1)

                      LCD.text(IC,2) 

                      sleep(1)

                  Assembling a Shopping Cart with a Barcode Scanner

                  Electrical Schematic of a High-Tech Shopping Cart

                  The following illustration depicts the wiring for connecting a barcode reader, thermal printers, and Liquid crystal display to a Raspberry Pi 4. The following table shows the relationships between these terms for your convenience.

                  Smart Shopping Cart Programming

                  Now that we have all the parts hooked up, we can begin writing the Program for the intelligent cart. Before moving further, let's review the ideas we've covered in our prior assignments. I am compiling a summary of the essential takeaways from the preceding part.

                  • Turn on the I2C port to connect the 20x4 alphanumeric LCD to the computer and the serial port to connect the thermal printer.
                  • Adapt your USB barcode scanner to your specific needs.
                  • Make a Google doc and use it with your Google Apps account.
                  • Use as few commands as possible to test all of the peripherals.
                  • Putting in the Necessary Libraries:
                  • Python ESCPOS
                  • Python RPLCD
                  • Python Gspread

                  Complete Code

                  import spread

                  from time import sleep

                  from RPLCD.i2c import CharLCD

                  LCD = CharLCD('PCF8574', 0x27)

                  from escpos.printer import Serial

                  from DateTime import DateTime

                  now = DateTime.now()

                  dt_string = now.strftime("%b/%d/%Y %H:%M:%S")

                  lcd.cursor_pos = (0, 0)

                  LCD.write_string("Initialising...")

                  #locating the spreadsheet JSON file

                  GC = spread.service_account(filename='/home/pi/Ali Proj/Proj 4 Shopping Cart with Thermal Printer/Shopping Cart on 20_4 LCD/shop-data-thermal-585dc7bffa1f.json')

                  #sheet name is to be passed

                  sh = GC.open("Shop Data for Thermal")

                  worksheet=sh.get_worksheet(0)

                  The preceding Code includes imports for all required libraries, including spread for the Google Sheets Application programming interface, time for wait or rest functions, RPLCD for 20X4 Liquid crystal display, escapes for serially controlling the Heated Printer, and date and Time for retrieving the current date.

                  Using my Google account, I made a spreadsheet titled "Shop Data for Thermal." Please create your own and give it any name you wish. Please see the G spread docs for information on setting up your Google Spreadsheet and JSON for your Google service account.

                  Next, we'll launch Sheet1 by invoking get worksheet(0) and loading it into the sh editor.

                  """ 9600 Baud, 8N1, Flow Control Enabled """

                  p = Serial(devfile='/dev/serial0',

                             baudrate=9600,

                             bytesize=8,

                             parity='N',

                             stopbits=1,

                             timeout=1.00,

                             dsrdtr=True)

                  This Code will be used to set up and initialize the serial port based on the parameters provided.

                  count=0

                  item_cost=0

                  totalCost=0

                  SNo=0

                  scode=""

                  qty=1

                  scodePrev=0

                  item_name=""

                  entryF=[]

                  p.set(

                      align="center",

                      font="a",

                      width=1,

                      height=1, 

                      )

                  The necessary variables will now be initialized to " " or " 0 " to prevent any invalid data from being stored in them. In addition, the set() function will be used to establish the thermal printer's default printing settings.

                  def print_receipt():

                      p.text("\n")

                      p.set(

                              align="center",

                              font="a",

                              width=1,

                              height=1,   

                          )

                      #Printing the image

                      p.image("/home/pi/Ali Proj/Proj 3 Interfacing thermal printer with pi/CD_new_Logo_black.png",impl="bitImageColumn")

                      #printing the initial data

                      p.set(width=2,

                           height=2,

                           align="center",)

                      p.text(" ===============\n")

                      p.text("Tax Invoice\n")

                      p.text(" ===============\n")

                      p.set(width=1,

                           height=1,

                           align="left",)

                      p.text("CIRCUIT DIGEST\n")

                      p.text("AIRPORT ROAD\n")

                      p.text("LOCATION : JAIPUR\n")

                      p.text("TEL : 0141222585\n")

                      p.text("GSTIN : 08AAMFT88558855\n")

                      p.text("Bill No. : \n\n")

                      p.text("DATE : ")

                      p.text(dt_string)

                      p.text("\n")

                      p.text("CASHIER : \n")

                      p.text(" ===========================\n")

                      p.text("S.No     ITEM   QTY   PRICE\n")

                      p.text(" ------------------------------\n")

                      print(text_F)

                      p.text(text_F)

                      p.text(" -------------------------------\n")

                      p.set(

                              # underline=0,

                              align="right",

                           )

                      p.text("     SUBTOTAL:  ")

                      p.text(totalCostS)

                      p.text("\n")         

                      p.text("     DISCOUNT:  0\n")

                      p.text("     VAT @ 0%: 0\n")

                      p.text(" ===========================\n")

                      p.set(align="center", 

                         )

                      p.text("    BILL TOTAL: ")

                      p.text(totalCostS)

                      p.text("\n")

                      p.text(" --------------------------\n")

                      p.text("THANK YOU\n")   

                      p.set(width=2,

                           height=2,

                           align="center",)

                      p.text(" ===============\n")

                      p.text("Please scan\nto Pay\n")

                      p.text(" ===============\n")

                      p.set(

                              align="center",

                              font="a",

                              width=1,

                              height=1,

                              density=2,

                              invert=0,

                              smooth=False,

                              flip=False,      

                          )

                      p.qr("9509957951@ybl",native=True,size=12)

                      p.text("\n")

                      p.barcode('123456', 'CODE39')

                      #if your printer has paper cutting facility, then you can use this function

                      p.cut()

                      print("printing done")

                  With the Code above, we can quickly generate a method to output the total due. The invoice's format is also determined in the same procedure. A '123456' barcode can be printed using the p.barcode() method.

                  Suppose the detected Barcode does not match the database sheet. In that case, a message will be displayed on the terminal's Liquid crystal display and in the terminal's memory reading "Unknown Barcode" or "Item Not Registered," respectively, using the try/except logic. You can view this under the following line of Code.

                  lcd.cursor_pos = (0, 0)

                  LCD.write_string('Please Scan...')

                  while 1:

                      try:

                          scode=input("Scan the barcode")      

                          if scode=="8906128542687": #Bill Printing Barcode pasted on the Thermal Printer

                              print("done shopping ")

                              LCD.clear()

                              print(*entryF)

                              print("in string")

                              print(len(entryF))

                              text_F=" "

                              for i in range(0,len(entryF)):

                                  text_F=text_F+entryF[i]

                                  i=i+1          

                              lcd.cursor_pos = (0, 0)

                              lcd.write_string("Thanks for Shopping")         

                              lcd.cursor_pos = (1, 7)

                              lcd.write_string("With Us")          

                              lcd.cursor_pos = (3, 0)

                              lcd.write_string("Printing Invoice...")

                              print_receipt()

                          else:

                              cell=worksheet.find(code)

                              print("found on R%sC%s"%(cell.row,cell.col))

                              item_cost = worksheet.cell(cell.row, cell.col+2).value

                              item_name = worksheet.cell(cell.row, cell.col+1).value

                              lcd.clear()

                              SNo=SNo+1   

                              entry = [SNo,item_name,qty,item_cost]

                              entryS=str(entry)+'\n'

                              print("New Item ",*entry)

                              lcd.cursor_pos = (0, 2)

                              LCD.write_string(str(SNo))

                              lcd.cursor_pos = (0, 5)

                              LCD.write_string("Item(s) added")          

                              lcd.cursor_pos = (1, 1)

                              LCD.write_string(item_name)          

                              lcd.cursor_pos = (2, 5)

                              LCD.write_string("of Rs.")

                              lcd.cursor_pos = (2, 11)

                              LCD.write_string(item_cost)           

                              item_cost=int(item_cost)

                              totalCost=item_cost+totalCost           

                              lcd.cursor_pos = (3, 4)

                              LCD.write_string("Cart Total")           

                              lcd.cursor_pos = (3, 15)

                              lcd.write_string(str(totalCost))           

                              entryF.append(entryS)   #adding entry in Final Buffer

                              sleep(2)           

                      except:

                          print("Unknown Barcode or Item Not Registered")

                          LCD.clear()

                          lcd.cursor_pos = (0, 0)

                          LCD.write_string("Item Not Found...")

                          lcd.cursor_pos = (2, 0)

                          LCD.write_string("Scan Again...")

                          sleep(2)

                  Cart Usage Guide

                  1. First, you pick out the product you want and scan its Barcode.

                  2. Verify the accuracy of the LCD.

                  3. Scan something else and perform the same thing

                  4. Once you have everything you need, scan the Barcode affixed to the thermal printer to initiate the billing process.

                  5. Collect the bill and use the Q.R. code to pay using a U.P.I. account.

                  Real-life Applications of Barcode Scanners

                  • Managing libraries is a specialty of library automation.

                  Each book is equipped with a barcode that the system uses to keep track of its current availability. The barcode scanner provides the librarian with up-to-date information on the books that have been checked out. Books can be checked automatically, allowing for less workforce.

                  • Maintaining a stock-taking system.

                  Barcodes provide for more efficient product recognition and data deployment. Manually entering data at the front end raises the risk of human error, which can cause delays and financial losses. But the barcode scanner is highly accurate and rarely makes mistakes when processing product orders. Because the data is automatically recorded with each sale, this simplifies stock-taking by cutting down on time spent manually looking for items.

                  • Reservations for travel

                  The billing procedure can be lengthy and frustrating at movie theaters, motels, and other establishments. Bills generated through electronic billing systems include a barcode or Q.R. code that can be easily decoded using a scanner kept by the relevant authorities.

                  • Billing office

                  It lessens the likelihood of mistakes occurring during billing's manual data entry process. Barcode scanners have many applications in billing departments, including speedy data gathering and the ability to check pricing and promotions.

                  • For Office Biometrics

                  A company's employees are obligated daily to record their attendance and clock in/out times. Scan the Barcode on their I.D. cards instead of having them manually enter their information.

                  1. For use in the production and logistics sectors

                  Using a barcode scanner, keeping tabs on company property is possible. A quick snapshot of the warehouse's inventory is provided. Raw materials utilized in production must also be sent to different markets. Consequently, there can be no mistakes in the labeling. As a result, it speeds up transactions and generates more money.

                  Reducing the likelihood of making mistakes and responding quickly to consumer requests are critical to growing the business. Time constraints can be met with more efficiency when both incoming and leaving shipments are monitored regularly. As industrial processes become increasingly mechanized, the cost of human labor declines.

                  1. On campus

                  The main features include tracking fixed assets like computers, lab equipment, machinery, etc. Teachers or employees responsible for the safety of their assets, such as the craft, can keep tabs on them with this feature. Barcode scanning keeps track of books and supplies that have gone missing in a library. A student's entrance and exit from the library can be quickly and accurately recorded using barcode scanners.

                  1. Industry of Health Care

                  Surgical supplies, patient specimens, pharmaceuticals, etc., must be tracked. Barcodes on patients' wrists allow doctors to quickly and readily verify that their care is being administered properly. These barcodes make it simple to record and monitor the previous distribution of prescriptions.

                  1. Governmental and Military Affairs

                  They take great care to ensure that sensitive information about the country does not leak. Problems with data recording or disclosure could lead to legal trouble. Official data can be kept safe with the use of barcodes.

                  1. Logistics

                  A worker working in logistics could be accountable for juggling multiple products at once, which increases the likelihood of making mistakes and sending out the wrong items. A barcode scanner can be used to automate this process with little room for error.

                  1. The Retail Industry

                  Including a barcode on each item will speed up the billing process by eliminating the need to enter each purchase manually. It will also make it simpler to view stock levels. Theft can be prevented by installing a barcode-based sensor on the exit door. In addition, this technology makes it easy to track the discounts applied to each item and ensure that they are still valid, reducing the need for human labor.

                  Conclusion

                  Barcode scanners prove essential for managing a wide variety of administrative processes. It appears that barcode scanning technology will continue to evolve in the future. We have seen how to construct our own "Smart Shopping Cart," complete with a barcode scanner to read the item's Barcode, retrieve the prices from the databases, show the information of the scanned object on an LCD for reference, and print the invoice using a thermal receipt printer. In the next tutorial, we will discuss How to design a Cryptocurrency Miner with Raspberry Pi 4. So, stay tuned. Have a good day.

                  Interactive Voice Response System With Raspberry Pi 4 & SIM800L

                  A low-literate audience can nevertheless have their voices heard and their questions answered by using an IVR system, as has been proven time and time again. However, achieving such aims in a development setting calls for a cheap system that welcomes input from various parties. RASP-IVR is an inexpensive IVR system that operates on a PI 4 and a local Global System for Mobile Communications modem. RASP-IVR was designed as an open-source, community-driven solution. It's unusual to find a customer-focused company that still uses human operators rather than an interactive voice response system. Credit card companies typically have IVR systems that can be used to make payments or file fraud reports. Airlines use elaborate IVR systems to schedule flights and check their current status. To facilitate medication refills, pharmacies implement interactive voice response systems. Furthermore, IVRs are widely used for forwarding calls to other extensions and providing directory assistance.

                  Enterprises of all sizes have adopted IVR technology due to its cost savings over using actual, flesh-and-blood staff. The number of callers who desire to speak with a human indicates an IVR system's success. As the percentage drops, the system becomes more efficient. Of course, some IVRs will never let you bypass the system and talk to a human being. However, that's frowned upon even by IVR advocates. As most people know, Raspberry Pi is a development board that packs a fair amount of processing power into a little package (about the size of a palm). When coupled with python's adaptability, this might lead to the creation of a wide variety of useful but diminutive devices. I recently had to construct an interactive voice response system using a Raspberry Pi, which essentially entails dialing phone numbers, sending messages, and receiving DTMF inputs from the recipient when they pick up the phone.

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

                  Components

                  • Pi 4

                  • SIM800L GSM Module

                  • 2G SIM Card (Airtel)

                  • Aux Cable

                  • LM2596 Buck Converter Module

                  • USB to TTL Converter

                  • 12V 2A Adapter

                  • Perf Board

                  • Berg Sticks

                  • Connecting wires

                  • Soldering Kit

                  Interactive voice response and its Operation

                  Computer and phone systems can be integrated into various ways, and IVR systems are one such way (CTI). Key tones are the most common way a phone can exchange data with a computer. Dual-tone multi-frequency frequency is what you get. A telephone's number pad emits a low and high-frequency tone. A "1" can be generated in a 697-Hz tone or a 1209-Hz tone, both of which are recognized by the PSTN as the numeral 1. For a computer to interpret the DTMF frequency produced by a phone, specialized hardware known as a telephony circuit or telephony board is required. Using a telephony board to connect a computer to a phone line and some low-cost IVR software, it is possible to create a rudimentary IVR system. The IVR program lets you record messages and menu items that callers can navigate using their phone keypads.

                  Speech-recognition software is a part of more sophisticated IVR systems, enabling callers to interact with computers via voice commands. The technology behind speech recognition is now advanced enough to comprehend things like full names and long series of digits. Text-to-speech software can be used on the receiving end to fully automate a firm's outgoing telephone calls. To better serve customers, computers may now generate personalized text to answer their inquiries, such as financial statements or flight times, and have an automatic voice read to them. Voice extendable mark-up language is a popular foundation for many cutting-edge interactive voice response systems today.

                  RASP-IVR: A Comprehensive Approach to Interactive Voice Response

                  The "RASP-IVR" moniker comes from the fact that it was created on the inexpensive Linux-based single-board computer known as a raspberry pi. The operating system is built on RASPBX, with several additions and modifications to improve compatibility for interactive voice response (IVR) use. Model 4 Raspberry Pi and GSM mobile phone modem make up the system. An Asterisk server is connected to the GSM modem via an interface. FreePBX is a web-based interface for managing an Asterisk server, allowing users to set up and modify IVR menus and VoIP settings. Using open-source libraries, we've written scripts to bring RASPBX's functionality for Voice over IP (VoIP), short messaging service, and localized SIP transfers to a broader.

                  Depending on the situation, the Asterisk domain server can route the incoming GSM call over a local or worldwide VoIP network. The VoIP communications can be directed to different extensions based on the client's dial input. They can be answered from any desktop or mobile device with a domestic SIP account and a SIP client like Zoiper. Furthermore, the VoIP conversation can be routed to third-party platforms like Twillio to use their cloud-based solutions like speech-to-text engines or cloud-based storage. In contrast, RASP-IVR requires no external resources, making it ideal for collaborative innovation or limited rollouts.

                  Why use GSM Module and not just the API to make phone calls?

                  The cost of using an API to make phone calls from a Raspberry Pi can add up quickly. You can use python and Raspberry Pi to make inexpensive phone calls using several different service providers, including Twilio. These solutions are fantastic; however, the price has two significant drawbacks. Almost wherever you go, you'll be charged by the minute, which goes for both outgoing and incoming communications. You might not think this is significant, but if you make more than a hundred calls daily, you'll soon realize how much it costs. The second issue is buying and managing a different cellphone number from which to make these calls. You cannot use an existing number because these are all made up, and depending on your area, you may have to pay more to get a number that works in your nation.

                  How can I make inexpensive phone calls with a Raspberry Pi 4?

                  After researching the rates of several API-based telephone conversation services, it became evident that the cheapest option is to use a Gsm technology like SIM800L with Pi to place calls through a network service provider like Airtel. To that aim, we'll connect a SIM800L module to a Raspberry Pi so we can send text messages and make phone calls automatically.

                  Which GSM module should we use with my Raspberry Pi 4 to do IVR calls?

                  As 5G and the IoT become increasingly popular, numerous innovative new GSM modules have been released that are compatible with 5G networks while using less energy. But I had the bright notion of employing a ubiquitous and inexpensive commodity to purchase at any nearby hobby store. So, we put the popular SIM800L and the Ai-thinking A9 through their paces. Even when just powered by my laptop's USB port, the artificial intelligent-thinker A9 Gsm modem proved completely reliable and responsive right from the get-go. However, the primary issue was that the in-line voice input interface did not operate very well, and the artificial intelligent Thinker A9 Gsm modem did not enable DTMF recognition. So, I switched to the SIM800L Global System for Mobile communications Modem, a power-hungry beast that, if fed enough juice, proved ideal for this task. There is no need for expensive external DTMF hardware because it has both in-line audio for playing automated voice and built-in DTMF detection. 

                  What kind of SIM card works with the SIM800L?

                  The SIM800L is only compatible with 2G networks, not 3G or 4G. Only Airtel and BSNL provide 2G services in this area. Therefore, get an Airtel SIM card or use one we already have. After purchasing a new Airtel subscriber identity module, card, I activated it on my cell phone and began using it with my SIM800L. 

                  A SIM800L-Based interactive voice response System's Typical Circuit Diagram

                  Complete schematics for a Raspberry Pi-based telephone and message system are provided below. It's clear how simple it is to draw connections between ideas.

                  Powering the SIM800L Module

                  The method by which the SIM800L module is supplied with electricity is crucial here. Within a voltage range of 3.7V to 4.2V, the SIM800L chip functioned. The optimum working voltage is close to 4V. For the SIM800L module, we needed to reduce the adapter's 12V 2A output to 4V; thus, we utilized an LM2596 Buck converter. Thicker, shorter wires are preferable when linking the buck component to the SIM800L so that the module can easily handle the high current. When powered, if the element detects improper power connections, it will reset and send invalid data through the serial port. You'll need a 12V 2A adapter to power the SIM800L module, and you should use bulky wires just to carry a lot of current without causing too much resistance. Connecting a fully loaded Lithium battery across the SIM800L module's Vcc and Ground pins should resolve any power difficulties.

                  SIM800L-to-Raspberry Pi Serial Data Transfer

                  Those unfamiliar with the jargon of electronics engineering know that "AT Commands" are what we use to talk to the SIM800L module. Calling, texting, and keypress detection are just a few of the many functions that may be accomplished with AT commands. This tutorial will use Py from RPi to transmit these AT instructions to the Global System for Mobile Communications SIM800L module. Connecting the SIM800L module's Rx and Tx pins to the Raspberry Pi's USB port required a universal serial bus to TTL converter.

                  Audio transmission from the Pi 4 to the SIM800L component

                  Through its MIC+ and microphone- pins, the SIM800L component supports mic input. Any audio information sent to these pins after the call has been placed will play on the call recipient's phone. In our scenario, we have to play recorded audio from the Rpi; however, these go pins are primarily designed to connect a microphone. To hear it on the GSM component, we must convert our audio output from the RPi through the 3.5mm port, known as line-out audio, to mic-level audio. You might construct a line-to-mic converter circuit to complete this task professionally. Still, I connected the two devices and set the volume level on the Raspberry Pi to barely two decibels. I had no trouble getting it to function this way.

                  I assembled the entire circuit on the perf board, ensuring the voltage connectors got enough lead to offer low-resistance contact. This is how my board appears after soldering. Since the LM2596 is an adjustable buck converter, ensure you use the onboard trim pot to set the voltage output to 4 Volts before using it. Anything above 4.2 volts can permanently damage the SIM800L component.

                  Simply turn on the circuit and attach the Cell phone card when you get here. Once more, confirm that the SIM card is inserted correctly and that the antenna is securely fastened. If all is done correctly, you should see the SIM800L board's inbuilt led flashing once every three seconds. As a result, the SIM800L module may create a network using our SIM card. This guarantees the appropriate Operation of our powering circuit. Now that the board is connected, we can build our Python code without an RPi.

                  Making Calls and Sending SMS on a Pi 4 with a SIM800L Component

                  You may find the entire Python script for the RPi interactive voice response system at the end of this tutorial. Due to the size of the code, it is not practical to detail every step. It is incorporated with comments and procedures to do reading and comprehending the code easier. Importing the necessary header files allows us to launch the program. We used the serial module to enable the serial connection between the Raspberry Pi and SIM800L components. The pygame software is employed to play audio, in this case, audio files. We also have the time component to cause delays, so that's something. You don't need to install anything new because the Buster OS comes pre-installed with all three packages.

                  import serial #for serial communication with GSM SIM800L

                  import time

                  import pygame #to play music

                  def SIM800 (Command)

                  Using this method, an AT command can be sent from a PI computer to a SIM800L device and then received in return. All AT commands transmitted to SIM800L must be written in ASCII and conclude with the character "rn." Before sending them to SIM800L, this method appends the character "rn" to all our AT instructions and transforms them into the ASCII character set. Once the response has been read, it decodes the ASCII data so we may utilize them in our code.

                  def SIM800(command):

                      AT_command = command + "\r\n"

                      ser.write(str(AT_command).encode('ascii'))

                      time.sleep(1)

                      if ser.inWaiting() > 0:

                          echo = ser.readline() #waste the echo

                          response_byte = ser.readline()

                          response_str = response_byte.decode('ascii')

                          return (response_str)

                      else:

                          return ("ERROR")

                  def wait_for_SIM800()

                  This function is quite similar to the one before, except instead of sending a value to the SIM800 component, it just awaits a response from the SIM800L module. As a result, it returns the answer when it receives one.

                  def wait_for_SIM800():

                      echo = ser.readline()  # waste the echo

                      response_byte = ser.readline()

                      response_str = response_byte.decode('ascii')

                      return (response_str)

                  def Init_GSM()

                  The GSM modem is ready for interactive voice response operations after being initialized. Before sending particular AT instructions to the Gsm modem to activate the message and DTMF receiver modes, it sends an "AT" to check for the module and waits for an "OK" response. In addition, it turns off all alerts so that we won't be distracted throughout a call by texting notifications.

                  def Init_GSM():

                      if "OK" in SIM800("AT"):

                          if ("OK" in (SIM800("AT+CLCC=1"))) and ("OK" in (SIM800("AT+DDET=1"))) and ("OK" in (SIM800("AT+CNMI =0,0,0,0,0"))) and ("OK" in (SIM800("AT+CMGF=1"))) and ("OK" in (SIM800("AT+CSMP=17,167,0,0"))):  # enble DTMF / disable notifications

                              print("SIM800 Module -> Active and Ready")

                      else:

                          print("------->ERROR -> SIM800 Module not found")

                  def play_wav (file_name)

                  After answering the call, the following method is employed to play the audio files. We have recorded audio files like "cancel.wav," "confirm.wav," and "intro.wav" stored. Following the user's keyboard answer, we must play every one of these files. We can use the play audio function to play any audio file of our choosing. Assume that your Python script is stored within the same folder as these audio files.

                  def play_wav(file_name):

                      pygame.mixer.init(8000)

                      pygame.mixer.music.load(file_name)

                      pygame.mixer.music.play()

                      #while pygame.mixer.music.get_busy() == True:

                          #continue

                  def Call_response_for (phone_number)

                  The software's most crucial feature is this one. It obtains the mobile number that has to be called and offers the callback for that session. Any response, such as NOT REACHABLE, CALL REJECTED, CONFIRMED, CANCELED, etc., can be given in return. The function calls a specified phone number using AT instructions and then plays recorded audio. The system then listens for the caller's DTMF reply and, depending on that reaction, plays the relevant recorded voice before informing us of the caller's choice. The method will also respond with that information if the caller declines the call or cannot be reached.

                  def Call_response_for (phone_number):

                      AT_call = "ATD" + phone_number + ";"

                      response = "NONE"

                      time.sleep(1)

                      ser.flushInput() #clear serial data in buffer if any

                      if ("OK" in (SIM800(AT_call))) and (",2," in (wait_for_SIM800())) and (",3," in (wait_for_SIM800())):

                          print("RINGING...->", phone_number)

                          call_status = wait_for_SIM800()

                          if "1,0,0,0,0" in call_status:

                              print("**ANSWERED**")

                              ser.flushInput()

                              play_wav("intro.wav")

                              time.sleep(0.5)

                              dtmf_response = "start_over"

                              while dtmf_response == "start_over":

                                  play_wav("press_request.wav")

                                  time.sleep(1)

                                  dtmf_response = wait_for_SIM800()

                                  if "+DTMF: 1" in dtmf_response:

                                      play_wav("confirmed.wav")

                                      response = "CONFIRMED"

                                      hang = SIM800("ATH")

                                      break

                                  if "+DTMF: 2" in dtmf_response:

                                      play_wav("canceled.wav")

                                      response = "CANCELED"

                                      hang = SIM800("ATH")

                                      break

                                  if "+DTMF: 9" in dtmf_response:

                                      play_wav("callback_response.wav")

                                      response = "REQ_CALLBACK"

                                      hang = SIM800("ATH")

                                      break

                                  if "+DTMF: 0" in dtmf_response:

                                      dtmf_response = "start_over"

                                      continue

                                  if "+DTMF: " in dtmf_response:

                                      play_wav("invalid_input.wav")

                                      dtmf_response = "start_over"

                                      continue

                                  else:

                                      response = "REJECTED_AFTER_ANSWERING"

                                      break

                          else:

                              #print("REJECTED")

                              response = "CALL_REJECTED"

                              hang = SIM800("ATH")

                              time.sleep(1)

                              #ser.flushInput()

                      else:

                          #print("NOT_REACHABLE")

                          response = "NOT_REACHABLE"

                          hang = SIM800("ATH")

                          time.sleep(1)

                          #ser.flushInput()

                      ser.flushInput()

                      return (response)

                  def send_message (message, recipient) 

                  The send message method in this program enables us to send messages in addition to making calls and receiving responses. The message is sent after it receives both the text and the participant's mobile number.

                  def send_message(message, recipient):

                      ser.write(b'AT+CMGS="' + recipient.encode() + b'"\r')

                      time.sleep(0.5)

                      ser.write(message.encode() + b"\r")

                      time.sleep(0.5)

                      ser.write(bytes([26]))

                      time.sleep(0.5)

                      print ("Message sent to customer")

                      time.sleep(2)

                      ser.flushInput()  # clear serial data in buffer if any

                  def incoming_call()

                  The very last method I created for this project allows you to figure out who is calling by their phone number. Some people might attempt to call back to this line because this SIM card will make calls to new persons. If so, you can use this function to see which line is making the call, send them a message, or create a follow-up call if necessary.

                  def incoming_call():

                      while ser.in_waiting: #if I have something in the serial monitor

                          print ("%%Wait got something in the buffer")

                          ser.flushInput()

                          response = SIM800("ATH") #cut the incoming call

                          if "+CLCC" in response:

                              cus_phone = response[21:31]

                              print("%%Incoming Phone call detect from ->", cus_phone)

                              return (cus_phone)

                          else:

                              print("Nope its something else")

                              return "0"

                      return "0"

                  It's time to create the main program, in which we will employ all of these functions to accomplish something nice now that all of them have been defined. The customer id and phone number are now being hard-coded for demonstration purposes, but you can obtain them using a Shopify API request or retrieve them from a spreadsheet as needed. For testing purposes, we use the customer's identity, "AISHA," and phone number, "9877XXXXXX."

                  cus_name = "Aisha"

                  cus_phone = "968837XXXX"

                  We will begin a serial conversation with a 15-second delay at 9600 baud speeds within the main endless while loop block. Considering that various SIM800L components may operate at a different baud rate, ensure that you enter the correct COM folder and baud rate in this field.

                  ser = serial.Serial("/dev/ttyUSB0", baudrate=9600, timeout=15)  # timeout affects call duration and waiting for response currently 30sec

                  print("Established communication with", ser.name)

                  After making the call and getting the necessary reply from the consumer, we will send the recipient a text based on their response. For instance, if the answer is validated, we can send a message about it. Likewise, we can alter the message if the client provides a different reply.

                  response = Call_response_for(cus_phone) #place a call and get response from customer

                  print ("Response from customer => ", response)

                  if response == "CONFIRMED":

                      text_message = "Hi " + cus_name + ". Your booking has been confirmed.Thank you. -Circuitdigest"

                      send_message(text_message, cus_phone)

                  if response == "CANCELED":  # if the response was to cancel

                      text_message = "Hi " + cus_name +. "Sorry that you have decided to cancel your booking. If you canceled by mistake, kindly contact us by phone. -Circuitdigest"

                      send_message(text_message, cus_phone)

                  if ((response == "CALL_REJECTED") or (response == "REJECTED_AFTER_ANSWERING")):  # if the response was rejected

                      text_message = "Hi " + cus_name + ". We from circuitdigest.com have been trying to reach you, to confirm your 

                      booking. You will receive another call within a few minutes, and we kindly request you answer it. Thank you"

                      send_message(text_message, cus_phone)

                  Testing our interactive voice response system on the Pi

                  Just double-check the connectors and turn on the GSM component board and RPi. Make that the appropriate COM port is listed in the code before running the application; in my instance, it was "/dev/ttyUSB0." After that, check that the sound is set to atrioventricular ( av ) node jack by right-clicking on the loudspeaker icon and that the audio level is low.

                  Simply alter the contact number and client name in the following step to your liking, or modify the program to retrieve the information from an excel spreadsheet or cloud Application programming interface, and our automated interactive voice response is ready to go.

                  The application will dial the specified number and listen for DTMF responses. Additionally, it will play relevant sound clips and transmit a text message dependent on the recipient's response. Below are a few sample messages that I obtained on my cellphone.

                  The audio tracks and texts can easily be changed to meet your application's needs. I hope the assignment was enjoyable for you and that you learned something.

                  RASP-IVR application

                  1. Call routing within a company is among the most popular uses of an interactive voice response system. Previously, you would employ a switchboard controller or receptionist to answer all callers and direct callers to the appropriate line. When answering customer calls, an interactive voice response system is beneficial. A caller may be given a menu of choices and inquiries about the system's type of call. If possible, the system will respond to the more typical inquiries while referring the less common questions to qualified experts.

                  2. Interactive voice response systems are excellent for getting detailed, current info from databases—for instance, movie times. On a significant database, the weekly movie lists are updated. The cinema theater's website can also be filled with information from these databases. When making a call to the cinema, the caller can use the keypad or voice instructions to search the database for movie timings. The same technology can be used to check account balances, evaluate the latest credit card payments, check flight times, refill medicines at a pharmacy, plan auto maintenance, and register for university classes. The list is endless.

                  3. Interactive voice response systems are helpful for sales as well. A sales department can create an interactive voice response order form, enabling callers to complete it on their phone's keyboard. When the form is finished, the computer can send a copy to a sales team representative through fax or email. The sales department could also use the IVR as a virtual flyer that highlights the characteristics of a good or service and offers customers the chance to speak with a live agent at any time.

                  4. Marketing teams and election pollsters can use the interactive voice response systems' outgoing call functions. A political campaign may send a voicemail message with a phone-in survey for voters to complete. An advertiser may determine whether a buyer is interested in his goods or services. They might press a key to speak with a sales representative if interested in the advertiser's computerized pitch.

                  5. Electronic alert systems may also be combined with interactive voice response systems. Let's assume that your company has worldwide workers working from home. Worker contact details, such as home phone numbers, mobile phone numbers, fax numbers, pager numbers, email addresses, etc., can be coded into the interactive voice response system. The IVR prog will use every form of contact until a connection is established if a call has to be directed to that worker.

                  6. Transcribing health records is an intriguing application of interactive voice response technology. Currently, doctors record their patient notes and submit the audio to a service that performs medical transcription. However, a doctor may contact the interactive voice response system, record his notes, and have a filed transcript emailed to their office thanks to advanced speech recognition software.

                  7. The creators have been collaborating with a few Rwandan health industry partners. The developers want to create solutions that will expand the coverage and reach of the partners' already-existing face-to-face operations. Interactive voice response can extend services to clients who cannot travel to existing facilities. Interestingly, one non-partner frequently visits remote communities and considers the interactive voice response as a tool for drawing people to these outreach efforts. By providing automated processes that operate outside of regular business hours or by gathering and analyzing customer data, the IVR can lessen the employees' workload. One partner will use this function to computerize donor-sponsor reports. In the opinion of one of the partners, the interactive voice response is a small step towards a more significant switch from hard copies to soft copies. Before conversing with a counselor, the web service might pull up the patient's EHR using information gathered by the IVR synchronized with the hard copy to soft copy system and the interactive voice response. After the call, a text message is sent to the customer, and another is sent to the dispatch center that is most convenient for the client.

                  Advantages of RASP-IVR

                  Using its speech and texting platforms, the RASP-interactive voice response system opens the door to creating unique apps that can assist with contextually relevant difficulties. Features including automated call rerouting, user-selected content, caller audio content recording, text message-based engagement, data collecting, and tailored resources that can be accessed on caller ID are all made possible by the RASP-Interactive voice response system.

                  We acknowledge, however, that interactive voice response-based solutions, like all technology, must be developed to enhance current human development efforts. The following are IVR-based systems' benefits, although certain limitations are covered below.

                  • A voice-only system is more appealing to people with limited literacy

                   than texting or internet-based apps. 

                  • To use an IVR system, users just dial a number on their readily available cell phone, as they would with any other service.

                  • I am using a mobile phone to get entry to discreet and stigma-free services like psychological counseling, and family planning might be advantageous.

                  • Interactive voice response systems can reconnect dropped calls thanks to caller ID and track many simultaneous activities from the same telephone.

                  • Finally, the speech signal is informative, providing estimations of the speaker's age, body weight, sexuality, anxiety, and other health indicators.

                   

                  Interactive voice response development Obstacles

                  Some drawbacks exist, though, which must be weighed against the advantages. Since the interactive voice response system is language-dependent, the prompts must be recorded in users' native tongues. Interactive voice response ern systems are constrained by emerging communities' cultural and social conventions, even though the telephone interface is familiar.

                  Users more accustomed to interpersonal communication may resist automated data inquiries and exchanges. To that end, one of the partners believes that in-person demonstrations of the IVR system to clients will provide the most positive results.

                  Another barrier we discovered for people with few resources was the lack of phone access. Due to fluctuating electricity prices and supply, charging a phone is not always possible. In many cases, people will use various telephones, or multiple people will use the same phone. It's possible that follow-up calls and texts won't be received.

                  In addition, having a shared phone line can raise questions and suspicions about who is calling. Finally, there are several ways in which users' privacy could be compromised by IVR technologies, from the storage and transmission of data to the reporting of such data to the difficulty of preventing one user from accessing the information of another.

                  The existing system demands developer-side programming expertise that a CBO might not have access to. The dongle's inability to talk to the Raspberry Pi occasionally resulted from a hardware malfunction. The network failed in some cases. When making a mobile-to-mobile call, one internet provider did not forward the touch-tone signals.

                  Unfortunately, the system can only handle a single call at a time, making it unsuitable for deployments with a high rate of incoming calls. Our co-operators who expect low call volumes can benefit from the RASP-IVR. A shift to a more scalable approach would be justifiable if volume increased.

                  Conclusion

                  Through this tutorial, we have gained a thorough understanding of IVRs and their inner workings. We proceeded to assemble our own Raspberry Pi 4 IVR with a handful of components and some test audio samples. We have investigated the mechanism behind this system and spoken about some of the primary uses for the IVR system. We also had a look at some of the advantages and disadvantages of using it. The following tutorial will teach you how to connect a USB barcode scanner to a Raspberry Pi so that you can read 2D barcodes.

                  Create a WiFi Extender with Raspberry Pi 4

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

                  Introduction

                  Welcome to the following tutorial in our raspberry pi four programming tutorial. In the previous tutorial, we learned how to build a raspberry pi four website monitoring tool. We say how beautiful soap is applied in browser automation tasks such as tracking website activities. But in this guide will discover how to utilize our Raspberry Pi 4 as a wifi repeater. If you want a lag-free wireless network, a wifi Wireless Adapter is exactly what you need. You may want to set up a wifi repeater if your signal is weak in certain rooms of your home or if you have entirely lost service in one or more rooms that are too small to accommodate your current network setup. If you want to increase the range of the wifi connection without breaking the bank or wasting a lot of energy, consider getting a Raspberry Wifi Extender. Compared to a wireless access point, a wifi extender has significant differences.

                  The critical distinction is that instead of using an Ethernet cable, it uses a WiFi adapter to connect to the internet. Two WiFi adapters are required to finish this tutorial, and one of them must be able to function as an access point. You might expect a significant slowdown in your network speed when using the WiFi repeater. That's because devices can't join your network until your initial WiFi communication has gone through and been rebroadcast from your Pi 4.

                  Our Virtual private network Access Point tutorial, which explains how to set up a VPN connection, complements this one nicely and can be found immediately. It will demonstrate how to install an OpenVPN client and route all network traffic through that app. You'll need two Wireless dongles to finish this guide, at least one of which should be able to function as an AP. Those components are listed below.

                  Components

                  • Raspberry Pi

                  • Power Supply

                  • WiFi x 2

                  How WiFi boosters improve your internet connection?

                  A standard wireless range extender may pick up the signal from your existing wireless router, boost its signal strength using several channels, and broadcast it over a larger region in your house or workplace. Say, for instance, you have your WiFi router put on the ground floor of your building, and you are studying on the 2nd floor of your room. You're trying to link up your computer or mobile device, but obstacles keep popping up. A WiFi Extender, which, once activated, enables wireless connectivity to the router, is an ideal solution for resolving this issue.

                  How to Setup a WiFi Range Extender

                  Because it doubles as a Domain Name System (DNS) and a Dynamic Host Configuration Protocol server, the dnsmasq package is essential to setting up our RPi Wireless Extender and doing the bulk of the legwork for this guide. Another program we'll need to use is hosted, enabling us to use one of your wifi gadgets as an AP. Don't forget that you'll need access to a working wireless router and an Ethernet device to bridge your wireless connection; follow this guide. For starters, we'll update the rPi by typing the two commands below into the terminal.

                  sudo apt update

                  sudo apt upgrade

                  Installing dnsmasq and hostapd, two necessary packages, is now a simple matter of running the appropriate commands.

                  sudo apt install dnsmasq

                  sudo apt install hostapd

                  It's important to prepare the wlan0 network connection before moving forward. It is possible to skip to Step 5 if you have previously established a wireless network connection. Alternatively, you can access the WPA-supplicant.conf script by issuing the command below on your RPi:

                  sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

                  Incorporate the following into this file, switching out "ssid" for the network's id and "psk" for the passcode.

                  network={

                          ssid="networkname"

                          psk="networkpassword"

                  }

                  Save the script by clicking Control + X, followed by Y, then finally, ENTER key once you have provided your network username and password. Assuming you successfully installed all the packages and connected to the wifi network, the next step would be to configure dhcpcd to provide our RPi with a permanent IP address. This can be accomplished by adding the command below to the dhcpcd.conf script:

                  sudo nano /etc/dhcpcd.conf

                  The lines below, added to the file's end, will configure the wlan1 connection as desired. Please insert the lines below.

                  interface wlan1

                  static ip_address=192.168.220.1/24

                  static routers=192.168.220.0

                  Clicking Control + X, followed by Y, and then Return will save the file and allow us to exit the program. After making changes to the DHCP configuration, it is necessary to restart the service.

                  sudo service dhcpcd restart

                  Next, we'll change the configuration file for hostapd by entering the following command into the terminal of your RPi.

                  sudo nano /etc/hostapd/hostapd.conf

                  The following lines, which must be written into this file, establish the framework for our communication with the WLAN hardware. The only two lines in this file that warrant serious consideration are the ssid= and WPA passphrase= entries. Some wifi devices have particular driver needs; thus, you may need to modify the driver= line to point to the most significant driver for your device. A quick Google search will do the trick if you need help figuring out which driver to use.

                  interface=wlan1

                  driver=nl80211

                  hw_mode=g

                  channel=6

                  ieee80211n=1

                  wmm_enabled=1

                  ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]

                  macaddr_acl=0

                  ignore_broadcast_ssid=0

                  auth_algs=1

                  wpa=2

                  wpa_key_mgmt=WPA-PSK

                  rsn_pairwise=CCMP

                  ssid=Pi3-Extender

                  wpa_passphrase=raspberry

                  To restrict access to your wifi booster from prying users, you need to modify your WPA passphrase to a strong password of your choosing. We can save the file and exit the program using Ctrl + X, Y, and Enter. Once that is complete, we can make changes to the hostapd configuration script in /etc/default/ and /etc/init.d/. It must first read these files for hosting to use the newly produced configuration file. The command below will open the initial of these two script for editing.

                  sudo nano /etc/default/hostapd

                  The following line needs to be updated in this document.

                  Find:

                  Instead, substitute

                  DAEMON_CONF="/etc/hostapd/hostapd.conf"

                  Clicking Control + X, followed by Y, and ENTER will save the file and allow us to exit the program. We'll modify the next script we need to set up now, which can be located in the init.d folder. The command prompt will allow us to make changes to the file:

                  sudo nano /etc/init.d/hostapd

                  The lines below need to be updated in this document.

                  Find:

                  Change to:

                  Tapping Control + X, followed by Y, and afterwards, ENTER will save the file and allow us to exit the program. Now that hostapd is ready to go, we can move on to configuring disease, but first, we need to relocate the default config file. Let's use the command below to accomplish this:

                  sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.Orig

                  After relocating the old configuration script, you can start working on your new file. The command below will be used to make the new file and make any necessary changes:

                  sudo nano /etc/dnsmasq.conf

                  Including the lines below this file is recommended, instructing the dnsmasq service about handling incoming connections.

                  interface=wlan1       # Use interface wlan1  

                  listen-address=192.168.220.1   # Specify the address to listen on  

                  bind-interfaces      # Bind to the interface

                  server=8.8.8.8       # Use Google DNS  

                  domain-needed        # Don't forward short names  

                  bogus-private           # Drop the non-routed address spaces.  

                  DHCP-range=192.168.220.50,192.168.220.150,12h # IP range and lease time  

                  Pressing CTRL + X, followed by Y, and afterwards ENTER will save the file and allow us to exit the program. Now we must set up our Raspberry Pi to relay all wlan1 traffic over to wlan0. To begin, modify the sysctl.conf config file using the command below to activate it:

                  sudo nano /etc/sysctl.conf

                  locate the line below in this file and delete the hash symbol (#).

                  Locate:

                  substitute with

                  net.ipv4.ip_forward=1

                  Pressing Control + X, followed by Y, and then ENTER will save the file and allow us to exit the program.

                  In any case, if you don't want to wait for it to activate on the next boot, you can use the command below to make it happen instantly:

                  sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

                  Now that IPv4 Forwarding is working, we can set up NAT across our wlan0 and wlan1 networks. Essentially, this will redirect all wireless network traffic from our AP to our ethernet link. To implement our new iptable rules, we must execute the following commands:

                  sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE  

                  sudo iptables -A FORWARD -i wlan0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT  

                  sudo iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT

                  If you have any problems after typing the above lines, try doing a sudo reboot on the Pi. The new rules we create will need to be saved somewhere so that they can be reloaded into iptables after each reboot of the Raspberry Pi. Use this command to store our modified set of rules permanently:

                  sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

                  Now that we have our new rules written down, we need to ensure they have loaded back in every time the system restarts. Changing the RC.local file is the simplest solution. To begin making changes to the file, type in the following command:

                  sudo nano /etc/rc.local

                  Since we're already here, we might add this line that follows the file. See that this line is visible from Exit 0 and higher. This line extracts our iptables configuration settings. Iptables takes the rules from the ipv4.nat file and applies them.

                  Locate:

                  Add this:

                  iptables-restore < /etc/iptables.ipv4.nat

                  We can now save the file and exit the program. We may conclude by using systemctl to enable the two services we just started. Put these two commands to work:

                  sudo service hostapd start

                  sudo service dnsmasq start

                  If everything went smoothly up to this point, you should now have a fully functional Pi Wireless AP, which you can test by linking any of your wifi devices to it with the Id and WPA Passcode you established earlier the tutorial. A restart may be all that's needed to get things back up and running when an error has been detected. This will guarantee that the Raspberry Pi's re-enabled features work correctly after restarting. To force a reboot of the Raspberry Pi, type the following command:

                  sudo reboot

                  Implementing a Virtual Private Network on the Pi 4 wifi Extender

                  Any device, regardless of whether it has VPN software installed, can be routed through a secure connection by connecting to a VPN Access Point since all traffic from that device will immediately begin passing through a VPN tunnel after being connected to your Pi 4 wireless access point. This article expands upon our earlier guide on setting up a wifi access point by making one significant adjustment: redirecting all data traffic through a virtual private network. Using either VyprVPN or NordVPN, we'll demonstrate how to set up this secure tunnelling protocol. For this guide, we tested several different VPN services, which proved to be among the most dependable in terms of speed and privacy policies.

                  Installation of OpenVPN on the App

                  This guide will explain how to use your VPN provider's software to establish an encrypted tunnel between your local network and the wider internet. This guide will discuss using VyprVPN and NordVPN as Virtual Private Networks. Both of these met our requirements for dependability, speed, and sound privacy protections, so we settled on them. OpenVPN will be used for the VPN connection; as both services, we'll discuss offering complete support for OpenVPN standard and supply us with the necessary.open files to get it up and running. Now that everything has been up to date, we can set up OpenVPN, the program we'll be using. Using the terminal, we may accomplish this by inputting the command below:

                  sudo apt install OpenVPN -y

                  Let's now move into the OpenVPN directory, where we'll keep all the files and configuration settings for our Raspberry Pi VPN server. Let's use the change folder command to go directly to that folder.

                  cd /etc/openvpn

                  We need to generate an authorized file now that we are in the OpenVPN directory. The auth.txt file we will make is where your VPN login information will be stored.

                  Create the file initially by issuing the below nano instruction.

                  sudo nano /etc/openvpn/auth.txt

                  Copy and paste the example login and password below into the file. We will configure OpenVPN to use this file as its login credentials whenever you connect to your VPN.

                  When you're finished making changes, save the script, and we'll go on.

                  Where to Locate the VyprVPN OVPN script

                  First, execute this command to verify that you are still in that OpenVPN folder before proceeding with downloading the VyprVPN installation files. Of course, you'll need a VyprVPN account before using these files.

                  cd /etc/openvpn

                  Once the VyprVPN OVPN files have been downloaded, you can access the configuration directory. We will be loading these components to connect to Vypr's server network. Download the archive from VyprVPN's servers using the wget command.

                  sudo wget -O vyprvpn.zip \

                  https://support.goldenfrog.com/hc/article_attachments/360008728172/GF_OpenVPN_10142016.zip

                  After transferring the zipped file to the RPi, we must extract it to use its contents. The unzip command below can be executed in the terminal to extract the file.

                  sudo unzip vyprvpn.zip

                  Now that the.ovpn files have been generated, you can explore them in the corresponding directory. Make a note of the target server's location, as you'll need to supply it in a later operation.

                  cd OpenVPN256

                  Execute the command below to display a list of all.ovpn files are currently stored here. Remember the filename of the desired location; for example, "USA - San Francisco.ovpn" would be remembered if a connection to San Francisco, California, in the U.s was desired.

                  ls

                  The required ovpn file should be transferred from the OpenVPN256 folder to the OpenVPN folder. Since we'll be making modifications to the file, having it under the OpenVPN directory will make autostarting the daemon much less hassle. Our sample file may be relocated to the correct folder with a command like this. You must be in the VyprVPN folder to run this command. You'll need to rename the extension if you want OpenVPN to recognize and use the file.ovpn to.conf. We will modify the file after moving it to make it more user-friendly.

                  sudo mv "USA - San Francisco.ovpn" "../USASanFran.conf"

                  After that, you can proceed to "Setting up the Virtual private network access point," where you'll find detailed instructions on modifying the.ovpn file and setting the VPN to launch when the system boots automatically.

                  Accessing NordVPN's OpenVPN configuration files

                  After finishing the auth.txt file, head to NordVPN and download the necessary.ovpn configuration files. Please note that you will need a NordVPN subscription to use these files. However, before we proceed, let's double-check that we're already in the correct directory by entering the following command into the terminal.

                  cd /etc/openvpn

                  Now, navigate to the ovpn area of the NordVPN webpage to get the OpenVPN configuration files. Locate the server you want to use on this site, right-click on "Download UDP," and select "Copy Address" to copy the link. Simply replace the URL in the following command with the copied URL. We'll be using the au514 server in this example.

                  sudo wget https://downloads.nordcdn.com/configs/files/ovpn_legacy/servers/au514.nordvpn.com.udp1194.ovpn

                  The downloadable file should now be renamed. You can save some time in the tutorial by giving the file a new name before using it. Additionally, you must convert the file extension from.ovpn to.conf. This modification is required for OpenVPN to recognize the file and incorporate it into its startup process when autostart is enabled. See how easy it is to rename a file with the mv command by looking at our working example. To make the au514.nordvpn.com.udp1194.ovpn filename more manageable while still providing sufficient information about which server it is for, we reduced it to just au514.conf.

                  sudo mv au514.nordvpn.com.udp1194.ovpn au514.conf

                  The section "Setting up the Virtual private network access point" can be accessed once the file has been renamed. In this part, you will learn how to connect to an OpenVPN server and redirect traffic through it.

                  Configuring the Virtual Private Network Access Point

                  Since we have a working.ovpn file, we need to tweak it so that our RPi Virtual private network access point can connect to the internet. Start by executing the following command, changing the filename to the one you want to use.

                  sudo nano au514.conf

                  The following line in this file has to be edited, so go ahead and do a search. To quickly locate this passage, press CTRL + W. This modification will cause the Vpn client to load the auth.txt file whenever it is opened automatically.

                  Find

                  Switch to

                  After making changes, use CTRL + X, Y, and enter to save the script.

                  After that is complete, we can verify that OpenVPN is connecting to our VPN service, NordVPN. When we run the command below, it will overwrite the existing one.conf (.ovpn) script with the one we edited in the previous section. We'll use the "au514.conf" configuration file as an illustration.

                  sudo openvpn --config "/etc/openvpn/au514.conf"

                  While this operation establishes the connection, it will generate a large amount of text; the most important is the format we've demonstrated below. If you get similar results, you are successfully connected to your OpenVPN provider's servers.

                  After a successful trial run of the OpenVPN client, we may terminate it and move on to making it launch automatically at system boot and adjusting firewall routing to force all traffic to go through the Virtual private network tunnel. Hit Control + C to cancel the action you're now performing. Now that we have a functional VPN, we can use iptables to redirect the wlan0 traffic through the VPN instead of directly to an Ethernet-like we did in the previous wireless AP tutorial. But before we do so, we need to clear away our existing iptables, which we can accomplish by using the three lines below on the RPi.

                  sudo iptables -F

                  sudo iptables -t nat -F

                  sudo iptables -X

                  Finally, we can install the updated iptables by issuing the command below, which will direct all wlan0 traffic through the tunnels.

                  sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

                  At this point, we may save our iptables and remove the rules we previously set up for our Wireless AP guide. To accomplish this, enter the command below into the RPi terminal.

                  sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

                  Since the firewall is operational, the Vpn client's config file will need to be modified. To start modifying the file, type in the following line.

                  sudo nano /etc/default/openvpn

                  The following line should be uncommented, and "all" should be substituted with a file name you edited in the previous Steps when you return to this file. Please see the example we've provided below.

                  Locate

                  Instead, substitute

                  autostart="au514"

                  After making the necessary edits, press Control + X, followed by Y, and finally, return the key to save and quit the Vpn config file. Rebooting your RPi should now allow you to test out your Setup. At boot-up, it must connect to the VPN, create the tunnel, and route all wireless signals.

                  sudo reboot

                  When using a VPN, the best way to ensure it is functioning correctly is to compare your Internet address to that of a device that is not linked through a Private network. On the other hand, both NordVPN and VyprVPN, two of our examples, clearly indicate whether you are "Protected" or not at the very top of their websites. If you want the same results as those shown above, you'll need to make one tiny adjustment and use the below commands. Most noticeably, we will now use our wlan1 connections to tunnel traffic rather than wlan0.

                  sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

                  sudo iptables -A FORWARD -i tun0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT

                  sudo iptables -A FORWARD -i wlan1 -o tun0 -j ACCEPT

                  Now your raspberry pi should be set up as a wifi extender

                  Pi 4's strengths as a wifi booster

                  Depending on several factors, you can take advantage of a Wireless extender in various settings. These wifi Extender Benefits analyze why you need one and the amount of money you may save using one.

                  • Increased Protection in Open Space

                  When your home has a lot of electronic devices, a wifi Booster or repeater is a robust solution for covering wireless communication coverage. Connecting a wifi extender to your home's network can increase the signal's reach, which is one of the device's primary benefits. It will boost your router's password by acting as a repeater.

                  • The Wireless Extender is Simple to Install

                  Plug-and-play capabilities and automated configuration are standard on modern wifi range extenders. It's user-friendly enough that you won't need to study a technical manual before putting it to work. You can take a product straight from the box, put it into an electrical outlet, and start using it. The Setup and maintenance of a wifi range extender are free of charge.

                  • The existing Router Will Be Reused.

                  Since the Wireless repeater and the original router share the same Id, you can continue to use the original router with the repeater. Range extenders can be used to convert an existing router into a repeater, saving you the trouble of having to dispose of the device. You can reuse the signal in different rooms without running additional cables by setting up a wifi range extender. You can get the most out of your outdated network gear.

                  • Budget-Friendly

                  Adding a wifi repeater to your network will increase its coverage without requiring additional hardware. One of the benefits of wireless extenders is the money they can save you. Moreover, a Wireless extender setup requires no extra wires or labour, making it the simplest to set up. These gadgets are completely pre-configured, so there is no need to spend money on laborious Setup or special cables.

                  • Connectivity for a large number of users

                  A key drawback of having a shared wifi network is the loss of connection speed every time a new user joins your wireless network. Imagine you're attempting to load Wikipedia while someone else is streaming in high volume. It's common to run into this issue when the number of users on the network rises, and the available bandwidth decreases. A wifi range extender is helpful for these people because it allows them to connect to the network from anywhere in the house by using various channels and frequencies.

                  Limitations of Wireless-Fi Extender Technology

                  While a wifi repeater is a fast, innovative, and cheap solution to wifi coverage concerns, it is essential to note that it is not a magic bullet. You may encounter these drawbacks of wifi Extender, which may cause you to reevaluate your position.

                  • Bad Reception

                  If your wifi adapter is emitting a weak signal, a Wireless extender can help. If your router is older or unsecure, you may run into any of these primary issues as a consequence of utilizing a Wireless Booster at home. Repeaters typically reduce network bandwidth for connected PCs by two, so upgrading your modem and wifi extender is not a good idea. A signal is received, processed, and then repeated on many channels by a repeater. Both the PC and the router take part in this procedure. Because of this cause, the signal intensity is weakened.

                  • Low Speeds

                  There may likely be a decrease in Wireless internet speed because of the signal's passage through the repeater due to signal weakness. As the wifi range extender strives to boost the movement within your residence, the quality of your network will inevitably decline.

                  • Issues of Incompatibility

                  However, setting up a repeater from a different manufacturer to work with the router can become a chore. There could be compatibility or operability concerns as a result of this. Generally, it's best to use parts and software made by the router's original manufacturer.

                  In most cases, the repeater will have a unique password and SSID from the router. Launching a new brand name comes with its share of challenges.

                  • Adherence to emerging wifi standards

                  It is wise to verify how often a wifi range extender's software is updated before purchasing. You should think about this if you want to use it for a long time. Wireless range extenders can become unusable if their firmware is out of the current. Don't buy anything if the fixes aren't readily available as patches.

                  Conclusion

                  This tutorial taught us how to build a raspberry pi four wifi extender to increase the wifi range of our home wifi network connection. We also looked at how we can configure a VPN for the same pi four wifi extender to offer security to our home network. Now we can try out more advanced ideas like how to boost the signal strength of the wifi extender without interfering with the internet service provider. Using a Raspberry Pi and a SIM800L in the following tutorial, we'll set up an IVR system that can dial numbers and send text messages automatically.

                  Monitor a Website with Raspberry Pi 4 using Python

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

                  Introduction

                  Welcome to the next tutorial in our raspberry pi programming. In the previous tutorial, we learned how we could run Xbox cloud on our pi 4. We found that we can run any game easily without lag or having raspberry pi shut down, proving that pi 4 is quite a powerful minicomputer. However, this tutorial will demonstrate how to use Python on raspberry to monitor websites. This Python program will execute on Pi 4 and watch over a website, alerting you whenever it changes or goes down. This is accomplished by keeping a straightforward webpage duplicate locally and monitoring for updates. This webpage monitor is straightforward, so it should work well on pi Zero. Throughout this tutorial, we will demonstrate how to develop your custom code to monitor a webpage. With this information, you ought to be able to modify the script to meet your unique requirements.   However, for email updates to function, a few settings must be made in the core code.

                  The lack of an interface makes this project ideal for a headless Pi. Even though this tutorial concentrates on Pi 4, the core code can be used on any device that supports Python 3. That implies that, if you'd want, you could even execute this program on a Windows computer.

                  Equipment

                  • Raspberry Pi

                  • Micro SD Card

                  • Power Supply

                  • Ethernet Cable or Wi-Fi

                  How to get your Raspberry Pi ready for the webpage monitor

                  Ensure you have all the components you need to execute your website monitoring program before you begin. These actions include installing Python 3 and the necessary Python libraries. Updates to the package registry and any current packages come first. To make these upgrades, we must execute the following lines in the console on our Pi 4.

                  sudo apt update

                  sudo apt upgrade -y

                  We must make sure that Py 3 and its application manager, "pip," are both installed on the mini-computer. To guarantee that the two packages are loaded, use the below command.

                  sudo apt install python3 python3-pip

                  Installing the necessary Python libraries is the last step before writing the program to monitor our web pages. Download the packages for queries, beautiful soup4, and lxml with this line.

                  pip3 install requests beautifulsoup4 lxml

                  Coding a website monitor for your Pi 4

                  Having completed the installation of the necessary packages, we can begin drafting our elementary website monitoring code. So that you can understand how everything functions, we'll break this down into its parts. Though the nano editor will work, a more capable integrated development environment (IDE) like Visual Studio Code is recommended. Get started on the Python code to keep an eye on a website with your Raspberry Pi. Websitemonitor.py is the name of the script we'll be working with throughout this guide. Launch nano and enter the following command to begin writing the script.

                  nano websitemonitor.py

                  Writing a Simple Website Monitor in Python

                  Before we get too far into coding a complex website monitoring program for our RPi, let's start with the simplest possible solution. We shall craft a basic script to retrieve a web page, check its contents against a known master copy, and output an appropriate message if any changes have been made. At the beginning of any script, we must import the packages we'll be working with. These scripts' launch requires the "os," "sys," and "requests" packages.

                  • Os: To communicate with the os, you will need to install the package known as os. For our purposes, we'll be using this to store a copy of our most recent website request in a cache. To detect any modifications, we will check this cache.

                  • Sys – For any arguments supplied to the program, we utilize the sys library to retrieve them. We'll allow the user to provide the URL of the website and the name of the cache in this case.

                  • Requests – Python can only send requests thanks to the requests package.

                  This allows us to take a certain website's content and save them.

                  import os

                  import sys

                  import requests

                  Coding the has_website_changed() method

                  Most of our logic will be handled by a function we'll write next. Two parameters must be set for this function: "has the website changed." The first input, the website URL, contains the website's address. We will make we obtain a request from this point forward. The website name, the second parameter, contains the website's name. This is a condensed form of the name used for the cached file. This method will have 3 potential return values: -1 if the webpage is "not ok," 0 if the webpage hasn't changed, and One of the webpages is altered.

                  def has_website_changed(website_url, website_name):

                  Keep in mind that indentation is crucial when using Python. Please make careful to keep the indentation when you complete this function.

                  Using Python Request Headers

                  Now that our function is specified, we can move on to implementing it. To initiate a website request, we must first define the headers sent by the request module. We are doing two things with these headers. For starters, there's the "User-Agent" header. Set it to whatever works best for you. For the most part, we are trying to keep things straightforward here.

                  Second, we instruct the client and the destination server not to store this request in their cache by setting the "Cache-Control" header to "no-cache." There is no guarantee that the requested web server will comply.

                  headers = {

                          'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; PIWEBMON)',

                          'Cache-Control': 'no-cache'

                      }

                  Putting in a Request to the Internet Service Provider

                  The queries package is secure enough to retrieve the passed-in URL with the requested headers. This is a vital part of our RPi's website monitoring software, as it returns the site's current status. This is an example of the get function included in the "requests" package. The "headers" and "website URL" variables are passed in. The result of this query will be saved in the "response" parameter.

                  response = requests.get(website_url, headers=headers)

                  Check That We've Gotten a Good Response

                  Once we've retrieved the website's response, we need to double-check that it was an "OK" response. Simply put, we need to ensure the error code is not below 200 or above 299, inclusive.

                  If the value is outside our allowed range, we will return "-1" to indicate an error on our end.

                  if (response.status_code < 200 or response.status_code > 299):

                          return -1

                  Record the Message and Cache Name in a Temp Directory

                  Let's set up two more variables after verifying the response to ensure we get a proper status code. For now, we'll keep the text of the response we received in a variable called "response text." This variable will allow us to tailor the response wording before saving it. Our RPi website monitor will continue to work with the present form of the answer text for the time being.

                  As a second step, we set up a variable named "cache filename" to hold the location of our cache's data file. This name will be fabricated using the "website name" argument and the suffix "_cache.txt." If our website's name were to be entered as "theengineeringproject," the resulting filename would be "theengineeringproject cache.txt."

                  response_text = response.text

                         cache_filename = website_name + "_cache.txt"

                  Making a Cache for a Brand-New Website

                  It's possible that the current website's URL won't have a cache file when you initially run the program. We use the "path.exists()" function from the "os" package to see if the cache script already exists. If the cache file doesn't already exist, we make one by opening it with the "w" switch. We then append the text of the current response to the file, allowing our Raspberry Pi to check for updates to the website. Given that this is a brand-new request, we will respond with a value of 0 to indicate that the reply has not changed.

                  If not os.path.exists(cache_filename):

                          file_handle = open(cache_filename, "w")

                          file_handle.write(response_text)

                          file_handle.close()

                          return 0

                  Review the Pre-Cached Reply to a Prior Request

                  If the program reaches this stage, the "previous response text" variable will need to be updated with the contents of the cache file. Now we'll utilize "r+" with the open function. The following command informs open that we want to be able to read and write to our cache file. After Python finishes reading a file, the stream position is reset to the beginning; thus, we need to use the "seek()" function to return to the beginning. If this is a fresh reply, it will be simpler to truncate the file.

                  file_handle = open(cache_filename, "r+")

                      previous_response_text = file_handle.read()

                      file_handle.seek(0)

                  Verify the Message Text Identical to the Stored Message

                  We may now check for a match between the answer text and the original one.

                  If the responses are identical in content, we exit the process by closing the file handle and returning 0. Recall that a value of 0 indicates nothing has changed in the responses. This, together with the else statement, completes our RPi's "has website changed" monitoring function.

                  if response_text == previous_response_text:

                          file_handle.close()

                          return 0

                  How to make a New Cache Whenever the Response Has Changed

                  If the responses don't match, our RPi has picked up on a change while keeping tabs on the webpage. If the race were being run right now, it would be in position 0. We then append the updated reply to the file once it has been truncated. The file handle can be closed as soon as the writing is done because it is no longer required. Since the answer has shifted, we send back a 1 to show that it has been updated.

                  else:

                          file_handle.truncate()

                          file_handle.write(response_text)

                          file_handle.close()

                          return 1

                  Formulating the main() method

                  To continue our RPi-based website monitor, we must now create its main method. This method will be invoked anytime the script is executed. In this script section, we'll mostly be concerned with invoking the function we just made, so it should be rather simple. First, we'll identify the primary role. This is where the real magic happens for our RPi-based webpage monitoring.

                  def main():

                  Inspecting the Website for Updates

                  At this point, we can access the "has website changed()" method we've created. This method's initial and next parameters will be passed in via the "sys" package. The web address (Uniform resource locator) will be the first argument. As for the second, it will become the cache file's title. The function's output is saved in the "website status" variable we created.

                  website_status = has_website_changed(sys.argv[1], sys.argv[2])

                  Website Response Printing

                  Our variables now contain the current online status, so we can use that to inform our output. Our basic website monitoring software for the Raspberry Pi is now complete. We can expand upon this feature to make it possible to communicate via email or text message. This is a basic if, Elif clause that prints out various text based on the input.

                  if website_status == -1:

                          print("Non 2XX response while fetching")

                      elif website_status == 0:

                          print("Website is the same")

                      elif website_status == 1:

                          print("Website has changed")

                  Last, we can wrap up our script by including the call that activates the script's main method. Using an if clause, we can be sure that the program was actually called and not just loaded as a Python package.

                  if __name__ == "__main__":

                      main()

                  The Final Structure of the basic program

                  The program can be saved and tested at this stage. What we have provided here is how the completed core code should appear. To save your work in the nano editor, use control + X, followed by Y, and finally, the Return key.

                  import os

                  import sys

                  import requests


                  def has_website_changed(website_url, website_name):

                      headers = {

                          'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; PIWEBMON)',

                          'Cache-Control': 'no-cache'

                      }


                      response = requests.get(website_url, headers=headers)

                      if (response.status_code < 200 or response.status_code > 299):

                          return -1

                      response_text = response.text

                      cache_filename = website_name + "_cache.txt"

                      If not os.path.exists(cache_filename):

                          file_handle = open(cache_filename, "w")

                          file_handle.write(response_text)

                          file_handle.close()

                          return 0

                      file_handle = open(cache_filename, "r+")

                      previous_response_text = file_handle.read()

                      file_handle.seek(0)


                      if response_text == previous_response_text:

                          file_handle.close()


                          return 0

                      else:

                          file_handle.truncate()

                          file_handle.write(response_text)

                          file_handle.close()

                          

                          return 1


                  def main():

                      website_status = has_website_changed(sys.argv[1], sys.argv[2])


                      if website_status == -1:

                          print("Non 2XX response while fetching")

                      elif website_status == 0:

                          print("Website is the same")

                      elif website_status == 1:

                          print("Website has changed")

                  if __name__ == "__main__":

                      main()

                  Let us put the RPi's Web Server Monitoring Basics to the test.

                  Seeing that our web monitoring software is complete, it can be deployed on the Raspberry Pi. The following procedures will help us test and verify that the script is functioning properly. Our web monitoring script requires elevated permissions before proceeding. By executing the following line on the RPi, we may grant this access to the website monitoring program.

                  chmod +x websitemonitor.py

                  Now that the script has the correct permissions, we can run it. When running this script, you will need to know the URL you want to monitor and the name you want to use for its cache. For our example, we will use "https://www.theengineeringprojects.com/” as our URL to monitor and “project” as our cache name.

                  python3 websitemonitor.py https://www.theengineeringprojects.com/ project

                  You may check if the website monitor produced the cache file with the ls command in the console. A text document with the extension "_cache.txt" should be present. Take the "theengineeringprojects cache.txt" file as an illustration. If you execute this script, you may find an issue right away. Metadata can be dynamically set on some websites, meaning that even if the content remains unchanged, each request to the site could result in a slightly different response. If you use our website, you'll see that our script will flag the page as modified whenever we update the core code. In the next part, we'll demonstrate how to use Python's lovely soup to tidy up the outcome and remove anything that could falsely flag the webpage as modified.

                  Utilizing beautifulsoup to enhance the RPi Web Monitor

                  Here we'll use beautiful soup to enhance Raspberry Pi's web server monitoring. The beautifulsoup Python module is a potent tool for modifying HTML documents. We may eliminate clutter like style and script tags, for instance. You'll need to adjust the script we built in the last step for this one. A new import is added to the script's initialization. This will bring in the bs4 library and its BeautifulSoup module.

                  from bs4 import BeautifulSoup

                  Developing a Brand-New cleanup HTML() method method

                  Our new mission must now begin. Any HTML obtained from the queries package will be cleaned up using this method. As a result, our RPi's behavior during web monitoring will become more standardized. Including the following code in the file will define the new method. The HTML material to be processed will be supplied as the sole input to this function.

                  def cleanup_html(HTML):

                  Produce an instance of the BeautifulSoup object.

                  A fresh instance of BeautifulSoup is instantiated now. The first argument is the HTML string to be cleaned up. We specify the HTML parser we need to utilize in the second argument. XML is used since it is quick and has all the required features. A faster and more efficient program is always welcome in a resource-constrained environment like our RPi, in which we are executing a web monitor.

                  soup = BeautifulSoup(HTML, features="lxml")

                  Using BeautifulSoup to clean up the HTML.

                  With BeautifulSoup, we can parse HTML and get rid of unwanted tags. We strip off the "script," "style," and "meta" tags with for loops as well as BeautfulSoup's "select" method. You'll see that the ".extract()" method is called on each loop iteration. When an element matching the given criteria is located, this function deletes it.

                  for s in soup.select('script'):

                          s.extract()

                      for s in soup.select('style'):

                          s.extract()

                      for s in soup.select('meta'):

                          s.extract()

                  The BeautifulSoup Object returned as a string.

                  After BeautifulSoup has processed the HTML retrieved by our website monitoring software, we can return it. It's not enough to return your soup object to its current state. Alternatively, the "str()" function must be used to transform it into a regular string.

                  return str(soup)

                  Streamlining the Obtained HTML Response

                  Our "cleanup html()" function is complete; now, we only need to update some other code to use it. Locate the piece of code below and change it. Instead of storing the reply text without thinking, we first pass it through the new method. The "has website changed()" method is where you'll want to put it.

                  Substitute the following for the sentence.

                  response_text = cleanup_html(response.text)

                  How to save the new extended web monitor

                  Once you've finished editing the script, the program should resemble what we've displayed below. To save your work when using nano, use control + X, followed by Y, and finally, the Return key.

                  import os

                  import sys

                  import requests

                  from bs4 import BeautifulSoup

                  def cleanup_html(HTML):

                      soup = BeautifulSoup(HTML, features="lxml")

                      for s in soup.select('script'):

                          s.extract()

                      for s in soup.select('style'):

                          s.extract()

                      for s in soup.select('meta'):

                          s.extract()

                      return str(soup)

                  def has_website_changed(website_url, website_name):

                      headers = {

                          'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; PIWEBMON)',

                          'Cache-Control': 'no-cache'

                      }

                      response = requests.get(website_url, headers=headers)

                      if (response.status_code < 200 or response.status_code > 299):

                          return -1

                      response_text = cleanup_html(response.text)

                      cache_filename = website_name + "_cache.txt"

                      If not os.path.exists(cache_filename):

                          file_handle = open(cache_filename, "w")

                          file_handle.write(response_text)

                          file_handle.close()

                          return 0

                      file_handle = open(cache_filename, "r+")

                      previous_response_text = file_handle.read()

                      file_handle.seek(0)

                      if response_text == previous_response_text:

                          file_handle.close()

                          return 0

                      else:

                          file_handle.truncate()

                          file_handle.write(response_text)

                          file_handle.close()

                          return 1

                  def main():

                      website_status = has_website_changed(sys.argv[1], sys.argv[2])

                      if website_status == -1:

                          print("Non 2XX response while fetching")

                      elif website_status == 0:

                          print("Website is the same")

                      elif website_status == 1:

                          print("Website has changed")

                  if __name__ == "__main__":

                      main()

                  The script is ready for further testing. More stable outcomes are expected this time around. We can decrease the likelihood of a false detection by eliminating the "script," "style," and "meta" tags. For instance, every query on our website must not be recorded as "modified" if you follow this pattern.

                  Implementing email support to the pi 4 web  monitor

                  Our Raspberry Pi monitoring system is somewhat useless without a way to be alerted when a website has been updated. We'll add to our functionality here by notifying you through email anytime the script notices a shift. Remember that this will necessitate you to have the SMTP information for your email provider at hand. Here, we'll use the SMTP settings for Gmail as an example.

                  Introducing a Fresh Import

                  We must import a separate package to make SMTP connections from within Python. Thankfully, Python already has this module built in. Include the following line in your script's imports. This line will make it possible to establish SMTP connections quickly by importing the necessary "smtplib" package.

                  import smtplib

                  The Process of Defining Constants to Save Email Information

                  At the outset of the Python code, we must define certain constants. Below the existing "import" command, add the lines below. The fact that Python doesn't truly support constants doesn't stop us from naming these parameters with all capital letters, though. You shouldn't modify these values while the program is running.

                  SMTP_USER

                  Identity for your outgoing mail server (Simple mail transfer protocol) connection, as defined by this constant. This is the account you'll use to access Gmail.

                  We refer to the value saved in this constant for the simple mail transfer protocol connection.

                  SMTP_USER='example@gmail.com'

                  SMTP_PASSWORD

                  The SMTP user's password must be set inside this constant. This is the password for your Gmail account. Second-factor authentication (which you should enable) requires a separate app passcode.

                  SMTP_PASSWORD='PASSWORD'

                  SMTP_HOST

                  The address or URL to which the SMTP connection should be established is saved in the "SMTP HOST" constant. Here, we'll use the SMTP server information for Gmail as an example.

                  SMTP_HOST='smtp.gmail.com'

                  SMTP_PORT

                  Using this setting, we tell our RPi web monitor which port to use when it detects a change and needs to notify us through email. Using Gmail's port for implicit SSL, as shown below: (port 465).

                  SMTP_PORT=465

                  SMTP_SSL

                  These days, most email providers offer a secure connection (SSL or TLS). Our software will only be able to utilize HTTPS protocol. Ensure the constant is set to True to activate this support. By setting this to False, SSL will be turned off.

                  SMTP_SSL=True

                  SMTP_FROM_EMAIL

                  At long last, we have the option to designate the sender's email address for this message. It must be an account you have created to use this email. If you're using an Email account, this should be a verified email address. You need to set up that email account and domain in your transaction email provider, such as Mailgun.

                  SMTP_FROM_EMAIL='example@gmail.com'

                  SMTP_TO_EMAIL

                  The final required setting is the destination email address for the script to use to send the email. Enter the email address at which you would like to be notified of updates to the website.

                  SMTP_TO_EMAIL='sendto@gmail.com'

                  Creating the Email Notification method

                  Our "email notification()" method can be written when we have declared all necessary constants. This function will take care of the process of connecting to an SMTP server and sending an email. Let's begin by identifying our new role. There will be two inputs for it. 

                  def email_notification(subject, message):

                  Forming an SMTP Link

                  Initiating an SMTP session is the first step of this method. Since we need to accommodate both SSL and non-encrypted connections, we'll have to make two distinct calls separated by an if clause. An SMTP session is established and saved in the "SMTP server" parameter if the "SMTP SSL" flag is set to True. When SSL is not enabled, we also take this action. We include the SMTP HOST and SMTP PORT environment variables when establishing the link.

                  if (SMTP_SSL):

                          smtp_server = smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT)

                      else:

                          smtp_server = smtplib.SMTP(SMTP_HOST, SMTP_PORT)

                  The SMTP Login Process

                  After establishing contact with the SMTP mail server, we can start composing and sending the email. We'll first fire off an "eh" to the server. We won't delve too deeply into what this information conveys to the server. The next step is to send an authentication message to the server. The credentials saved in the variables "SMTP USER" and "SMTP PASSWORD" will be sent along with this login request.

                  smtp_server.help()

                      smtp_server.login(SMTP_USER, SMTP_PASSWORD)

                  How to Layout an Electronic Message

                  The next thing we need to do is compose the message sent via the SMTP connection. This is crucial since it allows our Raspberry Pi to send you an alert if it detects a change to the website you've instructed it to monitor. This structure is adaptable to your needs. To avoid any confusion, please use the "FROM," "Too," and "Subject" lines as shown here. On different lines, please. In addition, one blank line should precede the main body of your email.

                  email_text = \

                  """From: %s

                  To: %s

                  Subject: %s

                  %s

                  """ % (SMTP_FROM_EMAIL, SMTP_TO_EMAIL, subject, message)

                  Email transmission

                  As the final step of this procedure, we transmit the email over our SMTP session. The previously generated email, along with the email address from "SMTP FROM EMAIL" and the destination email address from "SMTP TO EMAIL," are passed into this function call. After the message has been transmitted, we terminate the SMTP session.

                  smtp_server.sendmail(SMTP_FROM_EMAIL, SMTP_TO_EMAIL, email_text)

                      smtp_server.close()

                  Including Function Calls for email notification()

                  Since the necessary method has been written, it must be called from within the program. Here, we'll modify the "main()" procedure. You need to locate the line below in your Python code.

                  print("Non 2XX response while fetching")

                  Follow that with the line below. The script will automatically send you an email to notify you every time the RPi web monitor encounters an error connecting to the webpage.

                  Moreover, we should have a line that alerts us whenever the webpage updates. Check your script for the following line. Ideally, it would be located below the previously discovered line. Try to find the following:

                  The following line should be added above it. Every time this line is reached, an email will notify you that the web has been updated.

                  The Complete Code

                  After making the necessary modifications, your script's core code should resemble what we have provided as an example. Before moving forward, make sure to save your code. Your website monitoring service should now send you email alerts if functioning properly. It will send a notification email whenever it is launched and detects a change to the website. This website will, however, notify you by email if it becomes unavailable or produces a status code other than 2XX.

                  import os

                  import sys

                  import requests

                  from bs4 import BeautifulSoup

                  import smtplib


                  SMTP_USER='example@gmail.com'

                  SMTP_PASSWORD='password'

                  SMTP_HOST='smtp.gmail.com'

                  SMTP_PORT='465'

                  SMTP_SSL=True


                  SMTP_FROM_EMAIL='example@gmail.com'

                  SMTP_TO_EMAIL='sendto@gmail.com'


                  def email_notification(subject, message):

                      "Send an email notification.


                      Message - The message to send as the body of the email.

                      """

                      if (SMTP_SSL):

                          smtp_server = smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT)

                      else:

                          smtp_server = smtplib.SMTP(SMTP_HOST, SMTP_PORT)


                      smtp_server.ehlo()

                      smtp_server.login(SMTP_USER, SMTP_PASSWORD)


                      email_text = \

                  """From: %s

                  To: %s

                  Subject: %s


                  %s

                  """ % (SMTP_FROM_EMAIL, SMTP_TO_EMAIL, subject, message)


                      smtp_server.sendmail(SMTP_FROM_EMAIL, SMTP_TO_EMAIL, email_text)


                      smtp_server.close()


                  def cleanup_html(html):

                      """Cleanup the HTML content.


                      html - A string containg HTML.

                      """

                      soup = BeautifulSoup(html, features="lxml")


                      for s in soup.select('script'):

                          s.extract()


                      for s in soup.select('style'):

                          s.extract()


                      for s in soup.select('meta'):

                          s.extract()


                      return str(soup)


                  def has_website_changed(website_url, website_name):

                      """Check if a website has changed since the last request.


                      website_url - URL that you want to monitor for changes.

                      website_name - Name used for the cache file.

                      """

                      headers = {

                          'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; PIWEBMON)',

                          'Cache-Control': 'no-cache'

                      }


                      response = requests.get(website_url, headers=headers)


                      if (response.status_code < 200 or response.status_code > 299):

                          return -1


                      response_text = cleanup_html(response.text)

                      

                      cache_filename = website_name + "_cache.txt"


                      if not os.path.exists(cache_filename):

                          file_handle = open(cache_filename, "w")

                          file_handle.write(response_text)

                          file_handle.close()

                          return 0


                      file_handle = open(cache_filename, "r+")

                      previous_response_text = file_handle.read()

                      file_handle.seek(0)


                      if response_text == previous_response_text:

                          file_handle.close()


                          return 0

                      else:

                          file_handle.truncate()

                          file_handle.write(response_text)

                          file_handle.close()

                          

                          return 1


                  def main():

                      """Check if the passed in website has changed."""

                      website_status = has_website_changed(sys.argv[1], sys.argv[2])


                      if website_status == -1:

                          email_notification("An Error has Occurred", "Error While Fetching " + sys.argv[1])

                          print("Non 2XX response while fetching")

                      elif website_status == 0:

                          print("Website is the same")

                      elif website_status == 1:

                          email_notification("A Change has Occurred", sys.argv[1] + " has changed.")

                          print("Website has changed")

                          

                  if __name__ == "__main__":

                      main()

                  Put your RPi web monitoring software on a schedule.

                  If you've taken the time to write a Python script to keep tabs on many websites, you'll want to set it to run regularly. You may implement an infinite loop to make the script run indefinitely; however, a cronjob will suffice. Our Python program must be installed on the RPi before you continue. You can grab the core code from the Git repo if you'd rather skip the intro. Be careful to complete the SMTP connection information. This instruction section assumes the script is located in the "pi" user's home directory (/home/pi/). After making the necessary changes to the crontab, our program will be run automatically every minute.

                  Start modifying the active user's crontab with this command.

                  crontab -e

                  When requested to choose a text editor, we suggest "nano." Please insert the following line at the end of the document. If you wish to track a certain URL, you'll need to make a small change to the command. In addition, a cache name must be specified. The cache name is optional and can be any string that helps you distinguish this request from others. Insert at the end.

                  CTRL + X, Y, and ENTER will save your changes to crontab. A new minutely check of the specified website will now be performed by your RPi. The software will notify you if it identifies a modification to a page's content.

                  Let's take a look at the main gains of monitoring your website.

                  • Encourages problem-free operation of systems

                  To maintain optimal performance and satisfy clients, monitoring the website is essential. Customers are in a buying mood and don't want to wait for webpages to open or for controls that don't work. If you own an online store, you should examine key performance indicators such as daily bounce rates and page load time. However, regular usability testing will ensure consistent functionality and keep visitors returning.

                  • Keeps a site running smoothly and efficiently

                  A growing top line is a sign of a healthy website. However, you will not be able to spot warning signs unless you understand your typical exchange rates and annual peaks. Monitoring your statistics can provide a clear picture of your website's performance.

                  • Detailed user insights are revealed.

                  One of the essential benefits of web tracking is the ability to uncover hidden user and product possibilities. This may be achieved by setting up quarterly or monthly usability tracking based on your staff's population and your website's structure. One of the most effective strategies to enhance your site and raise customer satisfaction is demonstrating empathy for your customers by performing routine monitoring activities like analyzing comments.

                  E-commerce transactions can be optimized using customer feedback, for example, by removing an extra photo or description step between the product selection and the shopping basket. There's a chance that another user will vent their annoyance over not being able to access subscriber-only deals. If you take the time to listen to and empathize with your users' complaints, follow up with them to let them know they must sign in to obtain the offer and assure them that the site will be improved soon.

                  • assures usability and boosts return on investment

                  Users may not be able to access and engage with your website in the event of downtime or page breaks. Prolonged outages can lead to being de-indexed, dropped in search engine rankings, and a dent in your reputation. No one will wait for a down website. Customers are not easily won back, and doing so requires an investment of both time and resources. If your site goes down in Perth but remains accessible in Sydney, you won't realize the difference unless you watch it constantly. In an emergency, tracking can assist you alert consumers and fixing any accessibility problems before they affect users.

                  In addition to preventing disruptions in the future, automatic downtime monitoring can provide real-time alerts by studying past incidents. Whether you need to check if your SSL certificate has expired or if there is an API problem affecting site speed, automation and control can help.

                  • Facilitates easy interaction

                  When servers go down, your website becomes inaccessible, and so does all of your correspondence. Because of the prevalence of remote work and international teams, port failures have become increasingly expensive. Unfortunately, there is no viable or efficient way to communicate by text message on a mobile device.

                  Servers and port monitoring are often included in downtime monitoring software. Systems and tools make it easy to resolve communication issues between teams, offices, and nations. Customers will appreciate the timely alerts, and your employees will appreciate the mental stimulation.

                  Disadvantages of Website Surveillance

                  There are, of course, a few drawbacks to keeping an eye on your website. To decide if tracking is the best option for you and the team, consider these drawbacks. Some sites and portals may have a foundation of cybersecurity or automatic monitors; depending on your firm's specifics, you may just need a few more tools and processes. There is a silver lining to every cloud in the website monitoring storm. This article will provide some advice and solutions to help you deal with the drawbacks.

                  • Costly

                  The cost of a good website monitoring technology might be a significant drain on a company's resources. Though many products provide free tiers of service, these tiers are sometimes not as feature-rich as paid tiers, leaving you vulnerable to security holes or unsupported APIs. Spending on paid monitoring software, if any, might range from $15 per month to $500 per month, depending on the features you require and the size of your firm.

                  • Consumes a lot of time

                  Time is a necessary component of the organization, approach, and resource for successful web monitoring. How long would it take, for instance, to become an expert in website monitoring if you taught your current team how to do it? Because of the potential lack of workforce in other areas as a result of a single employee's pivot, training may not always be an option. Assume for a moment that your group possesses the necessary expertise to perform monitoring in-house. You should consider how much effort it will take and whether outsourcing is an option.

                  • Blocklists

                  Checking in on your website regularly is essential. It's important to check in numerous times a day to ensure no outages. Regrettably, excessive monitoring can raise red flags with your hosting service, leading to your IP address being blocklisted. To some, blocklisting might prevent electronic communications and alert consumers that your site is a security threat, a major downside of website monitoring. However, this problem can be easily fixed by contacting your server and having your IP address allowed.

                  • Monitoring errors

                  Even the most composed teams can quickly become flustered when confronted with novel tools and increased data. Mistakes in tracking can be caused by several factors, including a failure to communicate, inexperience, and hazy objectives. However, when a team is inundated with information, they may become paralyzed and unable to get the answers they need. Since the point of tracking is to swiftly handle problems within all data available instead of getting mired in data analysis, this may be particularly stressful and disheartening.

                  Conclusion

                  This tutorial taught you the fundamentals of setting up a web-based monitoring system on a Raspberry Pi 4. This code will retrieve the most recent version of the given URL each time it is used. Then, the cached response is checked again on the new request to determine if any changes were made. This script will notify you via an outside email server if the URL changes or becomes unavailable. In the following tutorial, we will learn how to build a raspberry pi 4 Wi-Fi extender for our home use.

                  Run Xbox Cloud Gaming on Raspberry Pi 4

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

                  Introduction

                  Greetings, and welcome to the next section of our Raspberry Pi 4 tutorials. In the last section, we discovered how to set up and run our self-host bitwarden on our Raspberry Pi. We learned how to set up admin panels and perform a wide range of actions, such as limiting the creation of new accounts and users for security purposes. However, in this guide, we will discover how to configure a PS3 or PS4 joystick with our raspberry pi and set up and run Xbox cloud gaming on our Pi 4.

                  Components

                  • Raspberry pi 4

                  • SD card

                  • Power supply

                  • Ethernet cable or wifi

                  • Xbox controller

                  • Xbox game pass ultimate subscription

                  • USB keyboard

                  • USB mouse

                  • HDMI cable

                  Through a service called Xbox Cloud Gaming, users may play a wide variety of games without having to download any software onto their devices. Here, we'll use Microsoft's Xbox Internet Gaming service to transmit these programs to your Pi 4. A membership to Xbox Gaming Pass Ultimate is required to use this feature. Xbox Gaming Pass is required for this streaming service, but the subscription unlocks a wealth of video game apps.

                  Incorporating Xbox internet Game streaming on Pi 4 is a breeze with the help of the Chromium internet browser. Remember that there will be some delay in responding to your inputs, but don't let that deter you from playing most games. As a bonus, this guide will show you how to convert your Raspberry Pi running the "light" version of the Xbox One operating system into a dedicated cloud gaming computer for the Xbox One.

                  Regarding game streaming services, Xbox internet Gaming isn't the only option for your Pi 4. Games can also be streamed to your Pi 4 using Google's Stadia program. Alternatively, you can use a streaming service like Steam to play your games on the go. To play games via Xbox Cloud, you'll need to be in a region where it's available.

                  Get your Raspberry Pi ready for setup.

                  You must fulfill a few prerequisites before you can begin using Xbox internet Gaming on your Pi 4. Here, you'll learn how to update your Raspberry Pi and set up the Chrome internet browser we'll need to connect to the cloud game platform. These instructions have been designed with Pi OS Lite compatibility in mind. The "Lite" version of Xbox internet Gaming will require additional effort.

                  To move on, we must ensure that our Raspberry Pi is up-to-date with the latest software. The software has to be updated so that we get the most incredible possible performance with the Xbox internet Gaming platform. You can upgrade your Pi's software to the most recent version using the following two instructions.

                  sudo apt update

                  sudo apt upgrade -y

                  After the update is finished, we can add any other software to our pi four that is required for Xbox internet Gaming. We'll primarily be using the Chrome internet browser, which can be obtained by running the instruction below.

                  sudo apt install chromium-browser xserver-xorg x11-xserver-utils xinit openbox bluealsa unclutter

                  We'll install just the bare minimum of software to get Chromium up and running on pi 4 OS Lite. Having a controller linked to your pi 4 is the next step. Most Xbox Cloud Gaming titles necessitate the usage of a controller. Despite the inclusion of third-party controller functionality, the Xbox joystick remains the superior option. And if you want to know which controllers work with their internet gaming platform, you can find that information in their official docs. Another option is to use a PlayStation joystick with Pi 4, and we will show you how to do just that.

                  How to Configure PlayStation joysticks on a pi 4

                  You may have discovered that using a PlayStation joystick with a Raspberry Pi is not a walk in the park. This tutorial is written in the hopes of making the whole thing easier.

                  Here at the pi 4 Wiki, we have a comprehensive tutorial for connecting and setting up Ps controllers of all generations. We walk you through installing the six-pair program for PS3 controllers and configuring your joystick to work with your pi four and any Bluetooth-enabled device. The procedure of connecting a PlayStation 4 joystick to a Raspberry Pi via Bluetooth is detailed here, and alternate methods are provided in case your joystick is incompatible with the default implementation of Bluetooth. The pi 4 is compatible with various game controllers, including Xbox joysticks.

                  Configure a PlayStation 3 Controller for Use with a pi 4

                  It's not easy to get a Ps3 controller working with a pi 4. If you want to use it wirelessly, we'll walk you through the setup process from start to finish. The wired PS3 joystick should function as simply a plug-and-play accessory. When using a PlayStation 3 controller, all of its functions must work correctly, and Sixad does just that. If you want to use a USB micro cable to connect the joystick to the pi 4, you should get one before you start this part of the pi 4 PlayStation tutorial. The configuration of the PS3 joystick for communicating with Wireless controllers is necessary for this.

                  Setup of the PlayStation 3 Joystick with the pi 4

                  The first step is to install a library, which will allow us to compile the six-pair code. The libusb-dev library enables the software to communicate with USB storage devices.

                  sudo apt install libusb-dev

                  Now that we have the necessary package loaded, we can get the six-pair script and set up a folder to store it.

                  mkdir ~/sixpair

                  cd ~/sixpair

                  wget http://www.pabr.org/sixlinux/sixpair.c

                  Now that we have the six pair code on our pi 4, we can build it with the help of the command below. Use this command to initiate a compilation using the GCC compiler.

                  GCC -o sixpair sixpair.c -lusb

                  Now that Sixpair has been compiled on our pi 4, we can connect our PS3 joystick to the RPi through its USB micro port. After connecting the joystick, use the following command to start six pair. So that our Wireless device can communicate with the joystick, Six pair will modify its settings.

                  sudo ~/sixpair/sixpair

                  If the six-pair program has successfully re-paired your PS3 joystick with your RPi's Wireless dongle, you will see the output in the terminal interface that looks like the example below.

                  After these modifications, you can disconnect the Playstation 3 joystick from the Pi 4; we won't need it plugged in through USB again unless you upgrade your Wireless adapter. You can either use the bluetoothctl program to communicate to the Playstation 3 joystick or compile and install sixad to manage the connection. We think you should give Wireless a shot because it works well with other wireless devices. Read on to learn more about utilizing Bluetooth to link your PlayStation 3 joystick. If you'd rather learn how to connect the joystick with SIXAD, you can do so below.

                  Getting your Playstation 3 joystick set up with bluetoothctl

                  Now that the Playstation 3 joystick has been prepped for use with the Pi 4, we can proceed to pair the two devices. The first step is launching the Bluetooth setup tool on pi four by entering the command below.

                  sudo bluetoothctl

                  Our Bluetooth setup tool is now active, and we can turn on the agent and tell it to use the default agent. To do so, simply enter the two instructions below.

                  agent on

                  default-agent

                  Following the successful execution of the preceding command, the program will begin scanning for new wireless devices, allowing us to locate them.

                  scan on

                  Any nearby wireless device will immediately become visible in the command prompt. Put these out of your mind for the time being and focus only on the Playstation 3 controller. The controller may now communicate with the pi four by holding the Ps button. The terminal's command line will begin to fill up shortly.

                  The MAC address will show in a format similar to the following; be sure to write it down. It's the string of words delineated by colons.

                  A MAC address has just become available, so write it down. Now that you have the MAC address, you may put it to use in the subsequent command. By issuing the command below, we hope to establish communication with the gadget and retrieve its unique identifier. You may need to retry this command several times before it works if you've tracked down a MAC address, substitute "YOUR MAC ADDRESS" with it.

                  connect YOUR_MAC_ADDRESS

                  If your Ps3 joystick stops attempting to connect, please check the status and hit the Playstation key again. If the following text shows in the cli, the connection was established successfully. We can go on to the next phase now that we have the UUIDs.

                  We need the MAC address to add the device to our Bluetooth-approved approved list. This enables the controller to connect with the Raspberry Pi without human intervention. We can accomplish this by inputting this command into our Pi 4. Be sure to change "YOUR MAC ADDRESS" to the address you uncovered.

                  trust YOUR_MAC_ADDRESS

                  After adding your Playstation 3 controller to the authorized list, the terminal should read as follows.

                  We may now exit the Bluetooth settings tool on the Pi 4 since the Playstation 3 joystick has been successfully paired with the Pi 4. Type the following commands or press CTRL + D to exit the program.

                  Quit

                  The RPi can be restarted at this point. This is done to verify that our system performs as expected during testing. To force the Raspberry to restart, type the command below.

                  sudo reboot

                  After rebooting the Pi 4, you can verify that your joystick appropriately communicates with the device by pressing the Playstation button. The controller's lights will momentarily blink when it connects, but subsequently, assuming everything went smoothly, only one morning will stay on.

                  Getting Your Playstation 3 Controller to Work with SIXAD

                  We need to install some prerequisite software on our RPi before we can begin compiling and configuring SIXAD. libusb-dev and libbluetooth-dev are required for compiling the sixad program and are essential libraries. Libusb-dev is a collection of source code that enables us to communicate with USB devices connected to a computer. To communicate with the Wireless stack in an OS, Libbluetooth-dev supplies the necessary code. In sixad's setup, this is what monitors for the presence of a Playstation 3 controller when it is plugged into the Pi 4.

                  sudo apt install git libbluetooth-dev check install libusb-dev

                  sudo apt install joystick pkg-config

                  Since we have everything we need, we can download the SIXAD repo from Retropie. We're using Retropie's fork because it includes some bug fixes and has been validated on the Pi 4. You can download the GIT repo onto our Pi 4 using the two commands below.

                  cd ~

                  git clone https://github.com/RetroPie/sixad.git

                  Now that we have the repo downloaded to our Pi 4, we can begin compiling. The following two instructions are all that are needed to compile SIXAD. The first line of code changes directories, and the second line of code builds the program by executing the makefile.

                  cd ~/sixad

                  make

                  Compiling the sixad code was the first step, but there are still a few things to accomplish before we can put it to use. The first step is creating a directory in which sixad stores all its user profiles. Create a new folder by running the command below.

                  sudo mkdir -p /var/lib/sixad/profiles

                  Let's finish by launching the checkinstall package we set up in the previous section. This program just verifies the current installation and, if necessary, executes the "make install" commands.

                  sudo checkinstall

                  During installation, you may be prompted to provide information or confirm selections; however, you can safely skip them and hit ENTER to proceed. Following completion of the installation, the following lines should show at your terminal.

                  The command below will launch sixad on your Raspberry Pi after completing the installation process.


                  sudo sixad --start

                  You should be prompted to push the Playstation key on your joystick to ensure proper operation. Connect the joystick to the Pi immediately.

                  Since we have sixad functioning, we need to set it the default loader at startup so we can always use our Playstation 3 joystick. The command below will insert sixad into the RPi's boot procedure.

                  sudo update-RC.d sixad defaults

                  How to Configure a PS4 Controller for Use With a Pi 4

                  The Ps4 controller can be used with the Pi 4 in various ways. There are a few of these that are easier to handle than others.

                  Wireless USB Adapter from Sony

                  To connect your PlayStation 4 joystick to your Pi 4, the Sony Bluetooth Adapter is your best bet. Especially considering that, in theory, the dongle should work immediately upon removal from its packaging and connect with any of the approved Playstation 4 controllers.

                  Bluetooth

                  To use Bluetooth, you'll need a Pi 4 or a USB wireless adapter in addition to the certified Sony Wireless adaptor. Although this solution should work for most Playstation 4 controllers, some users have reported success with a userspace gamepad driver named ds4drv. If you have already installed the SIXAD utility, you will need to remove it before you can use your Playstation 4 joystick with the Pi 4.

                  Universal Serial Bus Cable

                  To use your Playstation 4 joystick, simply plug it into a USB port on your computer using the same USB connection you used to connect to your Playstation 4. The Playstation 4 joystick should automatically connect via USB and work without additional setup.

                  Setting up BluetoothCTL for your Playstation 4 Controller

                  The next instructions are only necessary if you have followed the tutorial on pairing a Playstation 3 controller with a Pi 4 via Bluetooth. In that case, you can skip this part of the process to uninstall SIXAD.

                  The PS4 controllers cannot pair or function appropriately with SIXAD installed, so they must be deleted. Simply running the command below on Pi 4 will remove the compiled and configured sixad program we discussed in the PS3 part.

                  sudo dpkg -r sixad

                  Before setting up the rest of the system, let's double-check that our Pi 4 has the most recent updates by issuing the instructions below.

                  We will now start connecting our Playstation 4 controller to the Pi 4. The Bluetooth CLI utility will be used throughout this tutorial. Start up your RPi by entering the command below.

                  sudo bluetoothctl

                  After starting the bluetoothctl utility, we may activate the client and return it to its default settings by entering the commands below.

                  agent on

                  default-agent

                  We may now begin scanning for devices after activating the agent. Scanning must be started so that our controller appears when we initiate synchronization.

                  scan on

                  Now is the moment to simultaneously hit the "Share" key and the Playstation button, as depicted in the following diagram. Continue holding them until the joystick's light begins blinking.

                  If you see the output in the cli similar to what is shown below, jot down the MAC address. If you take the hex value after the ':' symbol, you have the MAC address.

                  If your joystick is still blinking, enter this command as soon as possible. When entering the MAC address, ensure to replace "YOUR MAC ADDRESS" with the actual value. It establishes communication with your Playstation 4 controller when you enter this instruction. Press the "Share" and "PS" keys to make the joystick stop blinking.

                  connect YOUR_MAC_ADDRESS

                  The following will display in the terminal window if the connection is successful.

                  So that the PlayStation 4 controller may instantly link to the Pi 4, we must now include our MAC address in the authorized list.

                  trust YOUR_MAC_ADDRESS

                  Now that the Wireless dongle on the Raspberry Pi recognizes the Playstation 4 joystick, we can exit the program by typing "quit." The next step is to verify the joystick's functionality.

                  Even though the joystick feature may already be present in your Raspbian distribution, let's install it. This set has the software we need to ensure our joystick is functioning correctly. You may get the program installed on your RPi by executing the following Unix command.

                  sudo apt install joystick

                  Once the joystick library is installed on your Pi 4, you can check js0 and retrieve its values by using the command below.

                  sudo jstest /dev/input/js0

                  Changing values whenever you move and push buttons on the joystick indicates that your Playstation 4 joystick is ready to use. However, you may need to resort to the userspace drivers if your joystick stubbornly refuses to function. Finally, after getting the joystick set up, we can move on to installing the cloud on the pi four os Desktop.

                  Online Xbox Play with Raspberry Pi Desktop OS

                  Gaming on the go with Xbox internet Gaming is a breeze with the Pi 4 OS Desktop and Microsoft's cloud service. Instead of devoting your computer solely to Xbox internet Gaming, you can use the desktop OS of pi 4. Chromium and iCloud can be accessed with the click of an icon and by entering the relevant URL, as shown below.

                  To access the internet with your RPi, launch the Chrome browser on the desktop. To access this, select the globe icon in your screen's upper right corner.

                  Open your internet browser and head to the Xbox internet Gaming website. To access this in Chrome, enter the following URL into the URL bar.

                  https://xbox.com/play

                  You'll need to sign in with your Xbox credentials if you haven't already done so from your Pi 4. You can access the login page by clicking the "Sign in" button.

                  You may see a "your browser is not supported" message after signing in. No need to panic; the XCloud server is compatible with the Chromium internet browser we are using on our Pi 4, so there's no need to switch browsers. To close this panel, click the "X" in its upper right corner.

                  Simply clicking on an Xbox game will begin streaming it to your Pi 4. Any gamepad, keyboard, or joystick can be used to navigate this interface.

                  There is a notice on the XCloud platform that says your streaming experience might not be ideal. Once you've selected a game for streaming to your Pi 4, you can keep playing by selecting the "CONTINUE ANYWAY" option.

                  You have now installed and configured the Xbox Internet Gaming platform to run on your Pi 4. Now that you know how to handle the joystick, you can have a blast playing the video game.

                  Playing Games over the cloud on an Xbox using the Pi 4 OS Lite

                  There are a few extra hoops to jump through to get the Xbox Internet Gaming platform working on a Pi 4 OS Lite device. After completing these procedures, your Raspberry Pi will automatically log you in and begin running Chromium.

                  Configuring Pi 4 for Automatic Login

                  If you wish to access Xbox Internet Gaming as soon as you turn on your Pi 4, you'll need to take the following settings. Skipping these will result in a login prompt for the "pi" user before you can use the internet browser.

                  We utilize the "Pi 4 Config tool" to set up our RPi so that it automatically enters the console at bootup, skipping the usual login process. The following command can be used to activate this utility on your gadget.

                  sudo raspi-config

                  Use the ARROW keys to move around the available options. To choose the highlighted item, use the Enter button. Starting with the raspi-config utility, select "System Options" from the drop-down menu. Select it by pressing the Enter button since it is the first choice.

                  You'll find "Boot / Auto Login" under "System Options" in the panel. Selecting this menu item may instruct the OS to log us into the console automatically.

                  The "Console Autologin" option comes next and must be chosen. If you select this, the Pi 4 will bypass the login screen and go straight to the console, where you can utilize the "pi" account.

                  Having made this selection, the RPi Config Wizard can be exited with the ESC key. When prompted, choose "Yes>," and then click the Enter button to restart the computer.

                  Setting up Chromium such that it launches alongside X-Server

                  Once the RPi is set up to enter the console at startup, the "autostart" file can be edited to initiate the Chrome internet browser. In addition, we need to edit the ".bashrc" file by adding a single line to ensure that the window utility Chromium needs to run launched automatically after the operating system has loaded.

                  So, let's begin by editing the "autostart" script in the "/etc/xdg/Openbox" folder. We'll use the nano editor to make the necessary changes to this script.

                  sudo nano /etc/xdg/openbox/autostart

                  Please copy and paste the lines below at the very end of this script.

                  xset s off

                  xset s noblank

                  xset -dpms

                  unclutter &

                  sed -i 's/"exited_cleanly":false/"exited_cleanly":true/' ~/.config/chromium/'Local State'

                  sed -i 's/"exited_cleanly":false/"exited_cleanly":true/; s/"exit_type":"[^"]\+"/"exit_type":"Normal"/' ~/.config/chromium/Default/Preferences

                  chromium-browser --disable-infobars --enable-features=OverlayScrollbar --kiosk 'https://xbox.com/play'

                  Our screensaver disable commands are located on the first three lines. We employ unclutter to conceal it merely as an alternative to entirely deactivating the mouse. This is helpful because we'll frequently use the mouse for things like logging in. Finally, we start Chrome on the RPi in kiosk mode, redirecting the browser to the Xbox Internet Gaming site.

                  After you've added these commands, save and exit the file. The final step is setting the Pi user's bash account so that the terminal automatically launches the window manager. 

                  nano ~/.bash_profile

                  This line has to be added at the very end of this document. This line will check whether it is the first time starting the terminal and if so, it will set the "$DISPLAY" property. When these prerequisites are met, the "startx" statement will be executed to launch the window manager.

                  [[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && startx

                  When you're finished adding that line, save and exit the file. If we want to use Chromium immediately, rather than after an RPi reboots, we can launch the window manager directly. When you launch the window manager now, Chrome will also launch because you modified the "autoboot" script earlier.

                  Startx

                  Be sure you're typing this command into the terminal of your Pi 4 itself. If you try to use it with SSH, you will be disappointed. If you choose, you can force a restart of your RPi by executing the command below.

                  sudo reboot

                  Utilizing Pi 4 OS Lite for Xbox Live Cloud Gaming

                  Once the RPi and Chrome have been set up, Xbox Live Games can be accessed. Your Pi's internet browser should automatically launch to the Xbox Game Pass portal.

                  To use Xbox Internet Gaming for the first time, you'll need to sign in using your Xbox credentials. To access the login page, please click the image below. In any case, the "Sign In" button on this page will get you started with the login procedure if you didn't notice it before.

                  After logging in, you may notice a message indicating that your browser isn't supported. Since this is a Chromium-based internet browser, the "X" in the corner can be used to close the current window.

                  We can now play games on our Pi 4 by streaming them through Microsoft's Live service with Xbox Game Pass. Make sure the controller is plugged into the Pi before choosing a game. Xbox Cloud platform also allows you to use your controller for menu navigation.

                  Here's a notification to let you know that the internet browser you're using isn't supported, which will appear whenever you try to play a video game that requires it. Selecting "CONTINUE ANYWAY" will allow you to disregard this notice safely.

                  We can play "Phoenix Point" through the Xbox Internet Gaming service, broadcast directly to our Pi 4 in the image below. The stream may not appear where you expect it to when it first begins. However, once play begins, things should correct themselves.


                  Conclusion

                  Now you should be able to play Xbox games through the internet on your Pi 4. Because it is included with Xbox Game Pass, Xbox internet Gaming allows you access to various games. To a large extent, this video game streaming platform runs smoothly on the Raspberry Pi 4. There may be spikes in latency now and then, but if you play video games that don't necessitate pinpoint controls, you can probably overlook them. The following tutorial will teach how to utilize Raspberry Pi 4 as a radio streaming and broadcasting device.

                  Self-Host Bitwarden In Raspberry Pi 4

                  Following this, we will configure bitwarden and host it on our Raspberry Pi 4. The last tutorial discussed utilizing a Raspberry Pi to install and run zeroTire on pi 4. By the end of the project, you will have learned how to set up a Raspberry Pi 4 with the necessary software for password management, including bitwarden, docker containers, and portainer, and how to configure their respective user interfaces.

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

                  Why Would You Do This?

                  An effective password manager is a must-have. For the past decade-plus, I've relied on a password manager. The catch is that not all security-focused apps are created equal. Initially, I relied on password managers in my browser, but I soon switched to KeePass. It was an intelligent move ten years ago. The export features of my browsers allowed me to import all of my passwords into a single KeePass database, where I could then construct a system to keep track of them. However, technology has advanced, and now there are safer alternatives to these password managers. Once I discovered I could self-host Bitwarden, I felt it was my best option. I had been using LastPass with Mobile, but as they introduced sync limits into their free tiers, I decided to uninstall it. YubiKey compatibility is one of the features that Bitwarden lacks compared to LastPass, but which I was able to implement thanks to self-hosting. KeePass's lack of support for statistics on hacked, weak, and recycled passwords is disappointing. Most people agree that Bitwarden is the most excellent free password manager.

                  Components

                  • Raspberry pi 4

                  • Power supply

                  • Ethernet or wifi

                  Preparing your Raspberry Pi for Bitwarden

                  To host our Bitwarden server on our domain, we must first take care of a few technical details. Setting up Docker is a necessary first step.

                  If we like, we can also decide to use Portainer for Docker container management. Either we can run it from the command-line interface or incorporate it into Portainer. A Bitwarden container can be managed with Portainer's user-friendly online interface.

                  We can then upgrade our operating system once Docker has been installed and a decision has been made regarding using Portainer. After applying the latest updates, our Raspberry Pi should be in peak running condition and ready to host Bitwarden.

                  Installation of Docker on a Raspberry Pi 4

                  It's no exaggeration to say that Docker is a powerful piece of software because it enables OS-level virtualization to distribute software applications within containers. When running inside a container, the software is restricted from accessing any resources that weren't explicitly allocated by the Docker runtime. Since everything is contained within the containers the runner installs, Docker makes it easy to distribute your software to devices. What's more, Docker accomplishes all of this with minimal extra effort. The software's low overhead makes it possible to function on a Raspberry Pi, which has little RAM and processor power.

                  The Docker team has made it easy to set up their container program by creating a handy installation script. Connecting via SSH to your RPi is an option for completing the tasks below.

                  The following command will fetch and run Docker's official installation script.

                  curl -sSL https://get.docker.com | sh

                  The code will be inserted into the command prompt if you use this command. Usually, you shouldn't, but you can trust Docker, so we'll make an exception here. You can view the script at get.docker.com if you are hesitant to run it before inspecting it. Time should be allowed for this code to finish as it will autodetect and install all requirements to run the Docker container on the RPi.

                  Portainer setup on a Raspberry Pi 4

                  The container management tool Portainer is small, accessible, and open-source. You may use this program to efficiently build, manipulate, and remove Docker containers on your Raspberry Pi. The software is simple to operate and requires no configuration outside of a Docker container, making it a breeze to set up.

                  Due to its lightweight design, Portainer doesn't significantly slow down your computer's performance. It's the best option for controlling your containers without messing with the command-line interface.

                  Once Docker has been installed and configured, Portainer can be installed on the Raspberry Pi. The newest version of Portainer can be obtained by using the command below, as it is hosted as a container on the public Docker hub.

                  sudo docker pull portainer/portainer-ce:latest

                  The docker file will be downloaded to your device after running this command. We tell it to get the ARM versions of the container by adding ":Linux-arm" to the conclusion of the pull request.

                  To begin using Portainer, wait for Docker to complete downloading the file to your RPi. We need to supply some more parameters when telling Docker to launch this container. Launch Portainer on your Pi by typing the command below into the console.

                  sudo docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

                  The most important things we accomplish here involve defining which ports Portainer should have access to. For us, it means using port 9000. Assigning the name "portainer" to this docker container facilitates easy recognition in the event of an emergency. If this Docker goes offline for whatever reason, the Docker management is instructed to start it up again.

                  Accessing Portainer with its Web-Based UI

                  You must establish a connection to the program's graphical interface before we can proceed with any tasks. You'll need access to an internet browser and the IP address of your RPi to complete this. The local IP address of your Raspberry Pi may be easily retrieved if you have forgotten it. The IP address allotted to our Pi locally can be shown by entering the hostname command.

                  hostname -I

                  For the quickest and easiest access to Portainer, simply type the following into your browser. You see that the port ":9000" is explicitly specified at the end of the address. The location at which Portainer can be accessed is this port.

                  http://[PIIPADDRESS]:9000

                  Always change "[PIIPADDRESS]" to your RPi's private IP address. This IP address was part of the previous steps' necessary actions.

                  How to set up Portainer on Pi 4?

                  When you first access the online interface for Portainer, you'll be prompted to make an administrator account. Specifying a username is required to establish this administrator account. Next, create a password for the new version. Passwords for Portainer must be a minimum of 12  letters in length. After entering the desired username and password, you can create the user by clicking the "Create user" button.

                  Now we can tell Portainer what kind of container ecosystem to maintain. The Docker option is the best fit for our needs. After making this selection, hit the Connect button.

                  The Portainer installation on your RPi should now be complete. Now you may use it to control the containers on any computer or mobile device.

                  Raspberry Pi 4 Bitwarden Setup

                  Now that our RPi is ready, we can proceed with installing the Bitwarden application. The availability of Bitwarden RS as a container in Docker makes its setup a breeze.

                  To set up Bitwarden with Portainer

                  The first part of this section will explain how to set up Bitwarden on Pi 4 using the Portainer online interface. We've already established that Portainer is an excellent option for managing Bitwarden on your RPi without using Secure Shell.

                  Bitwarden Container Preparation

                  First, we'll need to have Portainer set up so we can deploy the Bitwarden container. A few simple steps are required, but the total time is relatively short.

                  To get started, launch the Portainer web UI. The IP address of your Pi 4, followed by port 9000, will give you access to this.

                  Make sure that "[PIIPADDRESS]" is changed to the IP address of your Raspberry Pi.

                  You must switch to the local Container endpoint while loading the interface. To access the container management interface, please go here.

                  It is necessary to construct a volume for the Bitwarden containers before they can be created. Look for a link labeled "Volumes" in the menu slides out from the side.

                  There should be a collection of volumes you've made available here. An "Add volume" link must be placed here first. To access the volume settings, press the button.

                  A title should be selected for this new volume. In this tutorial, we will continue using Bitwarden exclusively. Simply give the book you're creating in RPi Bitwarden a title, and then hit the "Create the volume" option.

                  Following successfully creating the volume, we must now navigate to the "Containers" section of the interface. To toggle to this view, select "Containers" from the sidebar.

                  The containers that can be used with your RPi are listed below. The "Add container" button is up here somewhere.

                  Developing the Pi 4 Bitwarden RS Container

                  We have completed the preliminary setup and are ready to install the Bitwarden on our RPi.

                  As a first step, identify the container's label. Our own container's name is Bitwarden. The next step is to tell Docker which image to retrieve. This is the RPi's Bitwarden container in our instance. Don't forget to type "vaultwarden/server:latest" into the "Image" field.

                  The container's network configuration comes next. Find the heading labeled "Network ports setup."

                  Select the "publish a new network port" button below this heading twice. The boxes to set the Bitwarden ports to expose should now be visible.

                  Firstly, ensure the host is set to "127.0.0.1:8080" in the first box. Make sure that port 80 is entered into the container settings as well. From this port, you can access Bitwarden's web-based administration console.

                  To proceed to Step 2, please change the host to "127.0.0.1:3012". The correct port number for "container" is 3012. (3.). This port is used by Bitwarden for communicating over web sockets. As a side note, both host ports have been tied to the local computer. Because we can use them without any extra hardware, these are made public via a reverse proxy hosted by NGINX.

                  Keep going down until you reach the advanced containers settings heading. If you want to adjust the volume, click the "Volumes" tab. To add the RPi's volume to the container, we must next select the "map extra volume" option. Ensure that "/data" is entered into the "container" field.

                  At this point, we'll want to apply the custom volume setting we made before. Bitwarden-local is a good name for this.

                  Our next step is to keep Bitwarden running on the Raspberry Pi. Changing the startup policy will accomplish this. Simply select the "Restart policy" tab here. There should be an "Always" option for restarting. That way, even if the container goes offline for any reason, Docker will attempt to keep it running.

                  We may now deploy the Bitwarden containers after we have done setting it. The "Deploy the container" button may be found under this site's "actions" heading.

                  In the containers list, you'll find Bitwarden once Portainer has downloaded the file to your Pi 4. Below is a snapshot of our containers list after Bitwarden was successfully installed.

                  Docker command line interface installation of Bitwarden

                  You can also use the command line interface if you avoid installing and using Portainer with Bitwarden on the RPi. Following these instructions, you can successfully download and install Bitwarden on your device.

                  We will use Docker to retrieve the most recent version of Bitwarden RS. The newest server version will be downloaded and made available after these procedures.

                  docker pull vaultwarden/server:latest

                  Docker will automatically begin downloading Bitwarden RS to the Pi 4. The next step will be to launch the image. To accomplish this, please type in the command below and hit enter.

                  sudo docker run -d --name bitwarden \

                      --restart=always \

                      -v /bw-data/:/data/ \

                      -p 127.0.0.1:8080:80 \

                      -p 127.0.0.1:3012:3012 \

                      vaultwarden/server:latest

                  With this command, our Bitwarden RS servers will begin running from the downloaded file. The ports to which we require Docker to connect the Bitwarden image are then specified. Here, we're listening for connections on port "8080" to our web server. As a next step, we open up "port 3012," which is the port Bitwarden's URL sockets use for communication. The RPi's localhost IP address will be the only one able to access these ports (127.0.0.1). In the following part, we'll set up a proxy server to enable HTTPS for Bitwarden, allowing it to be accessed from outside the local network.

                  Installing Bitwarden with an NGINX Proxy

                  We have Bitwarden functioning, but it is not usable unless we configure HTTPS. The Bitwarden WebClient uses secure HTTPS connections for certain JavaScript operations. Setting up an NGINX proxy is required to enable HTTPS functionality. NGINX will handle processing requests to our Bitwarden server hosted on an RPi.

                  Pi NGINX Preparation

                  Setting up NGINX is a prerequisite to deploying Bitwarden. To establish a secure HTTPS connection, it is necessary to install the web server program and create an SSL certificate.

                  NGINX installation is a prerequisite for continuing with this section. So then, let's go ahead and do it.

                  Raspberry Pi NGINX installation.

                  There are a few reasons why Nginx is a good choice than Apache for Pi 4. NGINX is preferable to other web servers for the Raspberry Pi because it makes more efficient use of the Pi's limited resources, such as its memory and processing power. While NGINX has more space to maneuver than Apache, you still shouldn't count on it to handle heavy loads or major PHP tasks.

                  Since Apache2 may already be installed on your machine, we will use the command below to remove it. Since we want to use NGINX as our web server, we have decided to disable it from autostarting and accessing port 80. If you know that Apache2 hasn't been set up on your Pi 4, you can ignore this step.

                  sudo apt remove apache2

                  Now that we have the most recent versions of all the packages and have gotten rid of Apache 2, we can continue with the procedure. Finally, use your RPi to execute the command below and set up NGINX.

                  sudo apt install Nginx

                  Now that NGINX has been installed, we may launch it. To activate your RPi's web server, enter the command that follows into the terminal.

                  Sudo systemctl start Nginx.

                  Now that the NGINX server is running, we may obtain a local IP address. This is done so that we can use a different web browser to check the functionality of our web server. Use the hostname statement to learn your RPi's local Internet Protocol address.

                  hostname -I

                  Now that we know the local Internet address for our Pi 4, we can visit that location in any internet browser. Once you have the local Internet Protocol Address by using hostname -I, simply navigate there. The address http://192.168.0.143 works for me.

                  http://YOUR PI's IP ADDRESS

                  If you type in the URL above, your browser should take you to the desired location. In the rare case that this displays an Apache page, you should not worry; NGINX does not always replace the Apache index.html file.

                  After NGINX is set up, we'll make an SSL cert for it. You can make a license on your RPi in two distinct ways.

                  You can use "Let's Encrypt to generate a trusted SSL certificate" if you have a domain name registered with them. A signed certificate cannot be issued with just an Internet address as the DNS name. If you follow this way, remember to write down the path to where your certificate is kept.

                  Secure Sockets Layer Certificates for Raspberry Pi with Let's Encrypt

                  Using this Certbot client and your existing web server or a temporary server, you can acquire an SSL cert from Let's Encrypt. To purchase an SSL Cert for your RPi, you must have a DNS name directed to your Internet address. Ensure your DNS settings are configured to avoid going through Cloudflare's proxy if you use them as your DNS provider. As the proxy disguises your actual internet protocol address, the Let's Encrypt program will be unable to validate your RPi's IP address and provide an SSL cert.

                  Now, using one of the commands below, we may install the LetsEncrypt application onto our Pi 4. "Cabot" is the program's name in question. Set up the certbot package for Apache if you're using that web server, or use the standalone certbot program.

                  sudo apt install python3-certbot-apache

                  sudo apt install certbot

                  Now that Certbot is set up, we can go to Let's Encrypt and request an SSL cert for our Pi 4. The situation can be approached from two different angles. You can ignore this step if you do not use Apache. If you're using Apache, you may quickly and easily install a certificate into Apache's settings by executing the following command. To begin, you must ensure that ports 80 and 443 are routed. Cloudflare, which disguises your Internet address, must be temporarily bypassed if it is your DNS service provider.

                  sudo certbot --apache

                  We can take two approaches to obtain a license cert from Let's Encrypt if Apache is not used. With certbot, we have the option of running a separate python server to seize the host machine. You can also use another web server, such as NGINX, and we will still be able to retrieve the certificate from it. Once you get the license, though, you will need to set it up manually.

                  If you want to use the web server without having to install anything more, all you have to do is ensure port 80 is open and forwarded. You must modify example.com to your domain name.

                  sudo certbot certonly --standalone -d example.com -d www.example.com

                  More expertise is needed to use webroot than the installed web server. Check that the directory /var/www/example exists and can be accessed from the internet by changing its pointing to the correct location.

                  sudo certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com

                  Following these instructions, you will be asked to supply information, including your e-mail address. The information you provide will help Let's Encrypt maintain track of the licenses it issues and get in touch with you if any problems arise. After you enter the necessary data, it will immediately retrieve the permit from Let's Encrypt. If you are having problems, check that ports 80 & 443 are not banned and that your DNS name is correctly pointed to your IP address. Finally, if Cloudflare is your DNS service provider, double-check that the DNS settings currently exclude the proxy servers. This is where certbot client licenses will be saved after being downloaded. 

                  The secret key file for the license (privkey.pem) and the entire certificate chain (fullchain.pem) can be found in these directories. Keep in mind that these documents are what authenticates your Https connection and keep it safe; therefore, you shouldn't share them with anyone.

                  Building a solid Diffie-Hellman group is our final preparation step. This is to assist in strengthening SSL connections on your devices.

                  sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

                  NGINX Proxy Configuration

                  To have NGINX act as a proxy for Bitwarden, a virtual host must first be created. Thankfully, setting NGINX as a proxy requires no effort.

                  First, we need to get rid of NGINX's factory settings file. If you intend to use Bitwarden with a domain name, there is no need to do so.

                  sudo rm /etc/nginx/sites-enabled/default

                  A newer NGINX config file must be made. Launch the nano editor and type the instruction below to get started editing this new configuration file.

                  sudo nano /etc/nginx/sites-enabled/bitwarden.conf

                  Copy and paste the below lines of text into this document. The first rule we're creating will force all HTTP (port 80) traffic to use HTTPS instead (port 443).

                  server {

                      listen 80;

                      listen [::]:80;

                      server_name _; #Change this to your domain name

                      return 301 https://$host$request_uri;

                  }

                  The web server block will manage the proxy and Hypertext transfer protocol connection we'll add next. If you created the certificate with Let's Encrypt, you'd also need to change the locations of the "SSL certificate" & "SSL certificate key" environment variables.

                  server {

                    listen 443 ssl http2;

                    server_name _; #Change this to your domain name

                    

                    ssl_certificate      /etc/ssl/certs/nginx-bitwarden.crt;   #Swap these out with Lets Encrypt Path if using signed cert

                    ssl_certificate_key  /etc/ssl/private/nginx-bitwarden.key; #Swap these out with Lets Encrypt Path if using signed cert


                    ssl_dhparam /etc/ssl/certs/dhparam.pem;


                    # Allow large attachments

                    client_max_body_size 128M;


                    location / {

                      proxy_pass http://0.0.0.0:8080;

                      proxy_set_header Host $host;

                      proxy_set_header X-Real-IP $remote_addr;

                      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                      proxy_set_header X-Forwarded-Proto $scheme;

                    }

                    

                    location /notifications/hub {

                      proxy_pass http://0.0.0.0:3012;

                      proxy_set_header Upgrade $http_upgrade;

                      proxy_set_header Connection "upgrade";

                    }

                    

                    location /notifications/hub/negotiate {

                      proxy_pass http://0.0.0.0:8080;

                    }

                  }

                  According to your needs, tweaks to your RPi Bitwarden server are sometimes necessary. If you have a custom domain name, you should substitute it for the server name.

                  At completion, your document should resemble the one displayed below.

                  You may now save this document. The NGINX service just has to be restarted at this point. Our modifications will not take effect until we continue the operation. Type in the following instructions if you want to reboot NGINX on your RPi.

                  sudo systemctl restart Nginx

                  The Bitwarden Web Client Access Procedure

                  The Bitwarden web application on our RPi is now accessible and usable, thanks to the installation of a proxy server.

                  Visit this link in your preferred web browser to access the Bitwarden interface. Always change "YOURPIIPADDRESS" to reflect your RPi's actual Internet address. A domain name, if you have one, must be used instead.

                  You will get a warning if you try using a certificate you signed yourself.

                  Creating a Bitwarden account is a prerequisite to using the service. There must be a "Create Account" link on the login screen. If you can locate this link, please click it.

                  Starting immediately, you can enter data for your brand-new account. To get prompted, type in your Bitwarden account's e-mail address. You'll need to use this e-mail address to sign in. Next, provide Bitwarden with a label to utilize throughout its user interfaces. Next, you'll want to protect this account with a strong password. This needs to be a robust and difficult-to-guess password. After reading and accepting Bitwarden's terms of service and privacy policy, you can finish creating your account. When you're through customizing your account, click the "Submit" button.

                  Having signed up, you can now access your Bitwarden vault. Enter the e-mail address you used to create the account first. Now, please log in using the password you just created. The "Log In" button is active, allowing you to enter the site.

                  Once you've installed Raspberry Pi Bitwarden, you may begin using it as a secure repository for your data.

                  Allowing access to the Bitwarden admin Panel

                  Your account has been created, and the administrator token can be created now. You'll need the admin token to go into the Bitwarden control panel. We'll have to adjust the settings on our Docker containers to accommodate this. You will have access to a list of all users who have registered, as well as the option to delete them from the administrative dashboard. Even if you've turned off the feature, you can still create invites for new users. Bitwarden's settings can also be adjusted through this user interface. You may wish to decide if you want others to be capable of signing up.

                  Create a new Admin Token

                  The first order of business is to produce a new Bitwarden administrator token. Given this token's importance, we will use OpenSSL to construct a long string of robust randomly generated digits. You may create this secure code using the following program on your Pi 4.

                  openssl rand -base64 48

                  Keep this token secure as it provides unrestricted access to the Bitwarden RS server if it falls into the wrong hands.

                  Connecting to the admin Panel

                  This current admin token will need inputted into the Bitwarden Docker container running on our RPi. The Portainer online interface or a customized command line can be used to accomplish this.

                  Configuring the Admin Token in Portainer

                  The Portainer UI must be launched, and then the container list revisited to change the administrator token. Find the Bitwarden container in the list of containers. Click on the link once you've located it to read more about it.

                  There must be a "Duplicate/Edit" button at the top of the page you're about to visit. The container's properties can be modified by clicking this button.

                  To access the "Advanced container options," please continue scrolling down. Click the "ENV" button to switch to the Environment tab under this header. For us to add the administrator token, please select the "add environment variable" button. After you click the button, you should see two new text fields appear at the page's footer. Just enter "ADMIN TOKEN" into the "name" field. A valid admin token must be entered in the "value" field. You can now click "Deploy the container" after creating the administrator token.

                  Please read the following message before attempting to update the Bitwarden container on your Raspberry Pi using Portainer. The container with the same name will be replaced, as shown by this message. For this, select the "Replace" option.

                  Configuring the Admin Token via the Terminal

                  Using a command prompt to update a container is a little more involved than doing it via the GUI, as you will need to delete the old container by hand. The Bitwarden container on our Pi 4 will need to be taken offline for us to delete it. Using this command, you can terminate a container that is already executing.

                  sudo docker stop bitwarden

                  Next, the old container must be discarded. If a container with an identical name and port number already exists, Docker will not allow us to create a duplicate. Execute the following command to get rid of the current Bitwarden container.

                  sudo docker rm bitwarden

                  The final step is to restart the docker process. Instead of using the default token, we'll use the administrator token we just created.

                  sudo docker run -d --name bitwarden \

                      -e ADMIN_TOKEN=EXAMPLEPIMYLIFEUPADMINTOKEN \

                      --restart=always \

                      -v /bw-data/:/data/ \

                      -p 127.0.0.1:8080:80 \

                      -p 127.0.0.1:3012:3012 \

                      vaultwarden/server:latest

                  To use these new commands, you must first produce a token and replace all occurrences of "EXAMPLETHEENGINEERINGPROJECTS" with that key.

                  The Bitwarden Control Panel Login

                  Access the Bitwarden administration website once you've successfully implemented your freshly generated administrator token on Pi's Bitwarden setup. You should type this address into your internet browser's address bar. Remember to change "YOURPIIPADDRESS" to the address of your Pi 4.

                  https://YOURPIIPADDRESS/admin

                  The Bitwarden control panel can be accessed at this location.

                  The created administrator token is required to be entered here. You can now log in by selecting the "Enter" button after you have provided the token.

                  To manage your Bitwarden account, you can now visit the control panel. These sections allow you to control who has access to Bitwarden and how it operates.

                  Prevent the creation of new users

                  After logging in for the first time and gaining access to the control panel, you may remove the option for new users to register. As a result, only anyone you grant permission can add new users to the Bitwarden safe.

                  Bitwarden's new account creation can be disabled in the admin interface of your Raspberry Pi. Once you have logged into the control panel as an administrator, you can continue.

                  New user registrations can be disabled using a setting in the system's global preferences. Click the corresponding button to access the locations buried in the "General settings" panel.

                  You should see an option labeled "Allow new signups" within the "General settings" menu. To turn off this feature, uncheck the box close to it.

                  A confirmation of the new settings will appear at the end of the page. There should be a blue "Save" button near the bottom of the page. To keep the current changes, please click here.

                  Conclusion

                  As of this point, your Raspberry Pi ought to be running Bitwarden. Clients for Bitwarden, a free and open-source password manager, are available for virtually any platform. Using a modified version of the standard client that uses fewer system resources, you may set up your Bitwarden web service on your Raspberry Pi. The following article will teach you how to use Pi 4 to play Xbox games in the cloud.

                  How to Build a Raspberry Pi FM Transmitter

                  Throughout our lives, we've relied on Radio and tv stations to keep us engaged. While we're on the subject of contradictions, it's also fair to say that these Stations can become tedious at times due to the RJ rambling on about nothing or annoying advertisements, and this may have left you wondering why you can't own a Radio station to broadcast your data over short distances.

                  Almost any electronics technician uses coils and other hardware to make an FM transmitter, although the tuning process is time-consuming and difficult. Setting up your FM station and going live in your neighborhood shouldn't take more than 30 minutes using an RPi. If you use the right antenna, you must be able to transmit to your school or community within 50 meters. Wow, that's interesting! So, let's get started right now.

                  Caution: This project is an education project and should not be abused in any way that might harm or inconvenience anyone. Interfering with neighboring FM frequencies is illegal, so please exercise caution when using this feature. In the event of any mishaps, we take no responsibility for them.

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

                  Components

                  • Raspberry Pi

                  • Internet connection

                  • Microphone

                  • An enthusiastic RJ

                  Pre-requisites

                  Your RPi should already be running an os and be able to establish a network connection. If you haven't done so already, go through the instructions on how to use a raspberry pi.

                  A virtual server such as VNC, or a putty terminal window, is assumed to be accessible to you at all times. For the sake of this tutorial, we will run the program on RPi using the putty terminal session.

                  Frequency Modulation: What is it?

                  A method or procedure known as FM involves changing the carrier signal frequencies to match the frequencies of the modulated signal to encode information on a specific signal. Since data must be conveyed after being transformed into an electrical signal, a modulation signal is simply that.

                  A carrier's signal is transformed by an original signal in the modulation technique, which uses a methodology similar to amplitude modulation. On the other hand, FM maintains or maintains a steady signal loudness.

                  Why is FM necessary?

                  Fm is primarily used to decrease noise as well as the size of antennae, respectively. We know that a bigger antenna is required to send reduced frequency signals, whereas a smaller one is necessary to broadcast high-frequency signals.

                  Therefore, the sound signals are transformed into high-frequency radio waves and broadcast using the FM technique. Once more, the demodulation circuit on the receiver's side converts the high-frequency radio transmission frequency into the original understandable audio signal.

                  There is little interference since different signals are transmitted over a specific channel using separate wavelengths. So many folks can converse simultaneously and unhindered in a large metropolis.

                  FM transmission using coils

                  The construction of a long-range FM transmitter has long been on my bucket list of cool things. I've been so intrigued by some of the transmitter's uses, particularly since I was a kid, and spent much of my time fantasizing about how awesome it would be to have a few of the technology and technologies used in espionage movies. So lately, while reviewing one of my residence automation projects by using RPi and the motion package library, I felt it would be cool to add audio to the deliverable and stream live, so in addition to the multimedia feedback provided by the RPi, I could also get sound feedback out from area under monitoring. Even while this FM transmitter would not let me hear distantly (a range exceeding 10 kilometers), it will at least enable me to maintain an "ear" on events while I am about the property; then, after building it, I would have accomplished a few of the objectives that the younger me had set out to attain. It took me a few days ago, but I eventually got the motivation to make one, and I'll show you how to do it in today's post.

                  To avoid violation of policies of some countries, this experiment is being conducted solely for educational and scientific purposes. Keep the FM transmission at a low range and make sure it is built in compliance with applicable laws of one’s nation and therefore does not induce a disruption to others. This is essential. For any mishaps, I take no responsibility.

                  How do FM transmitters work

                  Using the concepts of the modulated signal, an FM transmitter can transmit the audio it receives from its input. Most FM transmitters are constructed in the manner depicted in the diagram below.

                  An amplification is frequently included in the transmitters because the transmission power of audio input is relatively low. This is done by utilizing an oscillator component to produce the carrier signal, which is then combined with an audio stream to generate a modulated signal that can be transmitted. When it comes to communicating, the low-impedance modulation signal is fed via a power amplifier to get to the antenna.

                  FM broadcast circuit

                  The electrical component should be connected as illustrated in the following FM transmitter diagram.

                  In this photo, you can see the prototype version of the FM radio transmitter.

                  The first transistors amplify the mic's output signals to a level suitable for transmission because the mic's output waveform is typically modest. In addition to amplification, the transmitter must also modulate. After that, the boosted audio signal is combined with the desired transmission carrier frequency to create a final signal. Because there is no visible output to identify the precise frequency where the transmitters are working, you may need to modify the FM transceiver radio well within the frequency range stated above to get the transmission frequency. This carrier signal can be differed using a 20pF capacitor attached to the inductor. The traditional spectral range of this specific design would be between 88MegaHeartz and 108MegaHertz. Once the carrier signal has modulated the audio signal, it is sent to the antenna, where it is received.

                  The resistors and capacitors used aren't set in stone, so you can experiment with them to get the best performance out of the transmitters.

                  Several other uses for this design aren't mentioned above, such as baby monitors or school address systems. Before constructing any of those practical items, please remember to check your local laws.

                  How Pi 4 works as a transmitter 

                  How can RPi, a board designed to serve as a development platform for microprocessors, do all of this? What if I don't need extra hardware to use the board as an FM station?

                  To prevent interference problems, each CPU will have a synchronized digital device. A signal known as a Spread-spectrum system clock, or SSCS is responsible for this Electromagnetic interference suppression. This frequency ranges from 1 MegaHeartz to 250 MegaHeartz, which fortunately fits well within the FM spectrum. We can make the Pi become an FM broadcaster by developing some code that uses the spread-spectrum clock frequency to modulate the frequencies. The Rpi Pi's GPIO pin 4 is where the frequency modulation will be sent. To use this pin as an antenna, we need a piece of standard wire attached to it no longer than 20 cm in length.

                  Getting the pi 4 readies for programming

                  Otherwise, read on for instructions on accessing your pi through the Command window if you haven't already done so. Boot Raspberry Pi with an HDMI connection to a display and an input device once you've installed a new operating system.

                  Link your Raspberry to the network by searching for a network option on the Raspberry desktop. Then go to the raspberry menu, click raspberry settings, and activate the SSH connection afterward. On your Windows or MAC computer, reconnect your computer to the same network as your Raspberry Pi so that both devices may communicate with each other on the local area network. You're ready to begin now that you've had Putty installed and running. Enter the Raspberry Pi's Internet protocol address and press enter. If you don't know your PI's Internet address, go to the admin side of your router and see if it's 192.168.43.XXX or something similar. An open command prompt will appear and ask for your login and passcode if all is done correctly. The default login and passcode are pi and Raspberry, respectively. Press Enter to see the next screen after entering it.

                  Convert Pi 4 into an FM station

                  GitHub provides the code needed to turn the Raspberry into a radio station. This page can be cloned directly into Raspberry; the application can be compiled and launched if you understand how to do so. Just follow the instructions below, and you'll be transmitting your audio files in no time.

                  Step 1:

                  Set up a new directory for our software files and put them there. Create a new guide by typing 'mkdir RPI FM' inside the command prompt, and then enter the folder using the word 'cd.'

                  mkdir PI_FM

                  cd PI_FM

                  Step 2: 

                  We must now copy the application from GitHub and place it in the folder we just made. Since we've previously moved inside the folder, we can run the following command below to complete the task.

                  sudo git clone https://github.com/markondej/fm_transmitter

                  Step 3:

                  We'll need a C compiler and other tools to run the C program we just acquired. GCC and G++ are the tools for this code, and the software for compiling them is termed make. To obtain compilers, enter the code shown below. Once the file is downloaded, your display will appear like the one below.

                  sudo apt-get install GCC g++ make

                  Step 4:

                  Compiling the code is now a cinch. You can do this by going into the folder using the change directory 'cd' FM transmitter and then compiling the script with root user 'sudo make .'The screen below should appear once your code has been successfully compiled.

                  cd fm_transmitter

                  sudo make

                  Step 5:

                  Launching the system is the last step. The intensity for which we would like to transmit, and the identity of the audio recording we would like to play must be specified when the program is launched. Star wars.wav is the default sound file that will be retrieved together with the code. We'll play the Movie Theme song at a 100megahertz frequency for testing purposes. The launch line's syntactic structure is:

                  sudo ./fm_transmitter [-f frequency] [-r] filename

                  The channel will be 100 MegaHeartz long because we need to play the movie file at that frequency.

                  sudo ./fm_transmitter -f 100  -r star_wars.wav

                  Test the Pi 4 FM transmitter

                  After you have started the application and you see the playback message as seen above, we may link an antenna to a Gpio 4 of Raspberry, I use a standard connecting wire, and it works perfectly for me.

                  Take a Radio, then set it to 100MegaHeartz channel, and you'll be able to listen to the movie music being aired. After making sure it works, you may switch out the movie theme with any other music or audio recording you choose and broadcast it with the same instructions as in step 5.

                  Transmitting live sound

                  While playing pre-recorded audio clips is entertaining, using this Pi 4 FM broadcast live audio would be much more enticing. With the help of the same tool, this is also possible. Just plug a mic into the Raspberry Pi's USB connection and modify the startup command-line interface. For additional information on this, please visit the GitHub homepage. Use the comment section of the forums if you run into any issues getting this to function.

                  Applications of FM

                  When it comes to frequency modulation uses, radio transmission dominates the list. Due to its higher signal-to-noise ratios, it provides a significant advantage in a radio broadcast. That is, there is little radio wave interference as a result. This is the fundamental justification for why so most radio stations choose to transmit music via FM.

                  Furthermore, many of its applications can be found in telematics, geophysical prospecting, EEG, various radio technologies, music creation, and devices used for broadcasting video. Fm offers a significant benefit over all other modulations in a radio broadcast. It will resist radio wave disruptions far better than an equally powerful modulation amplitude (AM) signal because it has a higher signal-to-noise ratio. The majority of music is aired through FM radio for this important reason.

                  • Radio transmission frequently uses pulse modulation technology. Each radio broadcast station has its frequency range, and all broadcaster station signals are sent over the same transmission system. We can adjust the Radio's tuning to link it to a specific radio channel.

                  • Our pc connections also employ pulse modulation technology.

                  • The pulse modulation method is employed in magnetic storage tape recording systems.

                  • Radio Detecting And Range (RADAR) systems employ the pulse modulation approach.

                  • Multimedia content communications, including voice/video broadcasts, also use pulse modulation technology. Most of the time, the sound is delivered over FM, and occasionally, the film is as well.

                  • The modulated signal generates an electrical impulse for usage in electronic instruments.

                  • The monitoring system also makes use of FM technology.

                  • Audio is synthesized by using the FM technology in pc sound adapters.

                  • Military communication systems like Walkie-Talkies employ pulse modulation technology.

                  • Additionally, Bluetooth and Zigbee communications technology utilize the FM method.

                  • The Broadcasting method is also employed in ambulance systems.

                  • The satellite radio technology uses FM technology.

                  • Due to its low electronic noise, this FM method is employed in two-way radio transmission.

                  Benefits of FM

                  • Low noise distortion

                  • A smaller antenna is needed for pulse modulation equipment.

                  • The pulse modulation platform's can be built to consume little power. This is a significant benefit of the modulation technique.

                  • The pulse modulation process is more efficient because the signal's amplitude is always consistent.

                  Drawbacks of FM

                  • The frequencies modulation circuit has many intricate parts.

                  • A carrier wave is required for the frequency modulation process.

                  • Amplification modulation is appropriate for long transmission lines, while FM is not.

                  Conclusion

                  In this article, we have learned how to create a radio station using a raspberry pi 4 with a few very simple steps. We have broadcasted a Star Wars movie theme through this system, and now you can try many other forms of data to broadcast, including video and live sound using a mic to get more familiar with the system. The next tutorial will teach us how to build a temperature log.

                  Stop Motion Movie System using Raspberry Pi 4

                  Thank you for joining us for yet another session of this series on Raspberry Pi programming. In the previous tutorial, we built a motion sensor-based security system with an alarm. Additionally, we discovered how to use Twilio to notify the administrator whenever an alarm is triggered. However, in this tutorial, we'll learn how to build a stop motion film system using raspberry pi 4.

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

                  What you will make

                  With a Raspberry Pi, Py, and a pi-camera module to capture images, you can create a stop-motion animated video. In addition, we'll learn about the various kinds of stop motion systems and their advantages and disadvantages.

                  The possibilities are endless when it comes to using LEGO to create animations!

                  What will you learn?

                  Using your RPi to build a stop motion machine, you'll discover:

                  • How to install and utilize the picamera module on the RPi

                  • This article explains how to take photos with the Picamera library.

                  • RPi GPIO Pushbutton Connection

                  • Operate the picamera by pressing the GPIO pushbutton

                  • How to use avconv to create a video clip from the command prompt

                  Prerequisites

                  Hardware

                  • Raspberry Pi 4

                  • Breadboard

                  • Jumper wires

                  • Button

                  Software

                  It is recommended that FFmpeg comes preconfigured on the most recent release of Raspbian. If you don't have it, launch the terminal then type:

                  sudo apt-get update

                  sudo apt-get upgrade

                  sudo apt install FFmpeg

                  What is stop-motion?

                  Inanimate things are given life through the use of a sequence of still images in the stop-motion cinematography technique. Items inside the frame are shifted slightly between every picture to create the illusion of movement when stitched together.

                  You don't need expensive gadgets or Graphics to get started in stop motion. That, in my opinion, is the most intriguing aspect of it.

                  If you've ever wanted to learn how to make a stop-motion video, you've come to the right place. 

                  Types of stop-motion

                  1. Object-Motion

                  Product Animation can also be referred to as the frame-by-frame movement of things. You're free to use any items around you to tell stories in this environment.

                  1. Claymation

                  Changing clay items in each frame is a key part of the claymation process. We've seen a lot of clever and artistic figures on the big screen thanks to wires and clay.

                  1. Pixilation Stop Motion

                  Making folks move! It is rarely utilized. For an artist to relocate just a little each frame, and the number of images you would need, you'll need a lot of patience and possibly a lot of money, if you're hiring them to do so.

                  The degree of freedom and precision with which they can move is also an important consideration. However, if done correctly, this kind can seem cool, but it can also make you feel a little dizzy at times.

                  1. Cutout Animation

                  One can do so much with cuts in cutout motion because of this. two-dimensional scraps of paper may appear lifeless, yet you may color & slice them to show a depth of detail.

                  It's a lot of fun to play about with a cartoon style, but it also gives you a lot more control over the final product because you can add your graphics and details. However, what about the obvious drawback? I find the task of slicing and dicing hundreds of pieces daunting.

                  1. Puppet Animation

                  Having puppets can be a fun and creative way to tell stories, but they can also be a pain in the neck if you're dealing with a lot of cords. However, this may be a challenge for professional stop motion filmmakers who are not the greatest choice to work with at first. These puppets are of a more traditional design.

                  When animators use the term "puppet" to describe their wire-based clay character, they are referring to claymation as a whole. Puppets based on the marionette style are becoming less popular.

                  1. Silhouette Stop Motion

                  Position the items or performers behind a white sheet and light their shadows on the sheet with a backlight. Simple, low-cost methods exist for creating eye-catching animations of silhouettes.

                  How long does it take to make a stop-motion video?

                  The duration takes to create a stop-motion video is entirely dependent on the scale and nature of your project. Testing out 15- and 30-second movies should only take an hour or two. Because of the complexity of the scenes and the usage of claymation, stop-motion projects can take days to complete.

                  Connect the camera to the raspberry pi.

                  You must first attach the camera to the Pi before it can begin rebooting.

                  Next to Ethernet, find the camera port. Take a look at the top.

                  The blue side of the strip should face the Ethernet port when it is inserted into the connector. Push that tab downward while keeping the ribbon in place.

                  Try out the camera

                  Use the app menu to bring up a command prompt. The following command should be typed into the terminal:

                  libcamera-hello

                  If all goes well, you'll see a sneak peek of what's to come. What matters is that it's not upside-down; you can fix it afterward. To close the preview, hit Ctrl + C.

                  For storing an image on your computer, run the command below:

                  libcamera-jpeg -o test.jpg

                  To examine what files are in your root folder, type ls in the command line and you'll see test.jpg among the results.

                  Files and folders will be displayed in the taskbar's file manager icon. Preview the image by double-clicking test.jpg.

                  There is no default way to make Python Picamera work with Raspbian newest version.

                  To make use of the camera module, one must activate the camera's legacy mode.

                  The command below must be entered into a command window:

                  sudo raspi-config

                  When you get to Interface Options, hit 'Enter' on your keyboard to save your changes.

                  Ensure that the 'Legacy Camera option is selected then tap the 'Return' key.

                  Select Yes using the pointer keys and hit the 'Return' key.

                  Repeat the process of pressing 'Return' to verify.

                  Click on Finish with your mouse cursor buttons.

                  To restart, simply press the 'Return' key.

                  Py IDLE can be accessed from the menu bar.

                  While in the menu, click Files and then New Window to launch a Python code editor.

                  Paste the code below paying attention to the capitalization with care into the newly opened window.

                  from picamera import PiCamera

                  from time import sleep

                  camera = PiCamera()

                  camera.start_preview()

                  sleep(3)

                  camera.capture('/home/pi/Desktop/image.jpg')

                  camera.stop_preview()

                  Using the File menu, choose Save Animated film.

                  Use the F5 key to start your program.

                  You should be able to locate image.jpg on your desktop. It's as simple as clicking it twice to bring up a larger version of the image.

                  It's possible to fix an upside-down photo by either repositioning your picamera with a camera stand or by telling Python to turn the picture. Adding the following lines will accomplish this.

                  camera.rotation = 180

                  Once the camera is set to PiCamera(), the following is the result:

                  from picamera import PiCamera

                  from time import sleep

                  camera = PiCamera()

                  camera.rotation = 180

                  camera.start_preview()

                  sleep(3)

                  camera.capture('/home/pi/Desktop/image.jpg')

                  camera.stop_preview()

                  A fresh photo with the proper orientation will be created when the file is re-run. Do not remove these lines of code from your program when making the subsequent modifications.

                  Connect a physical button to a raspberry pi

                  Hook the Raspberry Pi to the pushbutton as illustrated in the following diagram with a breadboard and jumper wires:

                  Pushbutton may be imported at the beginning of the program, attached to pin17, and the sleep line can be changed to use the pushbutton as a trigger in the following way:

                  from picamera import PiCamera

                  from time import sleep

                  from gpiozero import Button

                  button = Button(17)

                  camera = PiCamera()

                  camera.start_preview()

                  button.wait_for_press()

                  camera.capture('/home/pi/image.jpg')

                  camera.stop_preview()

                  It's time to get to work!

                  Soon as the new preview has begun, press the pushbutton on the Pi to take a picture.

                  If you go back to the folder, you will find your image.jpg there now. Double-click to see the image once more.

                  Take a picture with Raspberry Pi 4

                  For a self-portrait, you'll need to include a delay so that you can get into position before the camera board takes a picture of you. Modifying your code is one way to accomplish this.

                  Before taking a picture, put in a line of code that tells the program to take a little snooze.

                  camera.start_preview()

                  button.wait_for_press()

                  sleep(3)

                  camera.capture('/home/pi/Desktop/image.jpg')

                  camera.stop_preview()

                  It's time to get to work.

                  Try taking a selfie by pressing the button. Keep the camera steady at all times! It's best if it's already mounted somewhere.

                  Inspect the photo in the folder once more if necessary. You can snap a second selfie by running the application again.

                  Things to consider for making a stop motion animation

                  1. You must have a steady pi-camera!

                  This is made easier with the aid of a well-designed setup.  To avoid blurry photos due to camera shaking, you will most likely want to use a tripod or place your camera on a flat surface.

                  1. Keep your hands away from the pi-camera

                  If you don't press the push button every time, your stop-motion movie will appear the best. To get the camera to snap a picture, use a wireless trigger.

                  1. Shoot manually

                  Maintain your shutter speed, ISO, aperture, and white balance same for every photo you shoot. There are no "auto" settings here. You have the option of selecting and locking the app's configurations first. As long as your preferences remain consistent throughout all of your photos, you're good to go. The configurations will adapt automatically as you keep moving the items, which may cause flickering from image to image if you leave them on auto.

                  1. Make sure you have proper lighting.

                  It's ideal to shoot indoors because it's easier to regulate and shields us from the ever-changing light. Remember to keep an eye out for windows if you're getting more involved. Try using a basic lighting setup, where you can easily see your items and the light isn't moving too much. In some cases, some flickering can be visible when you're outside of the frame. Other times the flickering works well with animation, but only if it does so in a way that doesn't disrupt the flow of the project.

                  1. Frame Rate

                  You do not get extremely technical with this in the beginning, but you'll need to understand how many frames you'll have to shoot to achieve the series you desire. One sec of the film is typically made up of 12 images or frames. If your video is longer than a few secs, you risk seeming like a stop motion animation.

                  1. Audio

                  When you're filming your muted stop motion movie, you can come up with creative ways to incorporate your sound later. 

                  Stop-motion video

                  The next step is to experiment with creating a stop motion video using a collection of still photos that you've captured with the picamera. Note that stills must be saved in their folder. Type "mkdir animation" in the command line.

                  When the button is pushed, add a loop to your program so that photographs are taken continuously.

                  camera.start_preview()

                  frame = 1

                  while True:

                      try:

                          button.wait_for_press()

                          camera.capture('/home/pi/animation/frame%03d.jpg' % frame)

                          frame += 1

                      except KeyboardInterrupt:

                          camera.stop_preview()

                          break

                  Since True can last indefinitely, you must be able to gently end it. If you use Ctrl + C to force it to end, the picamera preview will collapse and the loop will be terminated because it is using try-except.

                  Files stored as "frame" with a three-digit number preceded by a leading zero (009,005.) are known as "frame" files because of the % 03d format. This makes it simple to arrange them in the proper sequence for the video.

                  To capture each following frame, simply push the button a second time once you've finished rearranging the animation's main element.

                  To kill the program, use Ctrl + C when all the images have been saved.

                  Your image collection can be viewed in the folder by opening the animation directory.

                  Create the video

                  To initiate the process of creating the movie, go to the terminal.

                  Start the movie rendering process by running the following command:

                  FFmpeg -r 10 -i animation/frame%03d.jpg -qscale 2 animation.mp4

                  Because FFmpeg and Py recognize the percent 03d formatting, the photographs are sent to the movie in the correct sequence.

                  Use vlc to see your movie.

                  vlc animation.mp4

                  The renderer command can be edited to change the refresh rates. Try adjusting -r 10 to a different value.

                  Modify the title of the rendered videos to prevent them from being overwritten. Modify animation.h264 to a different file to accomplish this.

                  What's the point of making stop motion?

                  Corporations benefit greatly from high-quality stop motion films, despite the effort and time it takes to produce them. One of these benefits is that consumers enjoy sharing these movies with friends, and their inspiring content can be associated with a company.  Adding this to a company's marketing strategy can help make its product extra popular and remembered.

                  When it comes to spreading awareness and educating the public, stop motion films are widely posted on social media. It's important to come up with an original idea for your stop motion movie before you start looking for experienced animators.

                  Stop Motion Movie's Advantages

                  In the early days of filmmaking, stop motion was mostly employed to give animated characters the appearance of mobility. The cameras would be constantly started and stopped, and the multiple images would all be put together to tell a gripping story.

                  It's not uncommon to see films employ this time-honored method as a tribute to the origins of animations. There's more, though. 

                  1. Innovation

                  In the recent resurgence of stop motion animations, strange and amazing props and procedures have been used to create these videos. Filmmakers have gone from generating stop motion with a large sheet of drawings, to constructing them with plasticine figures that need to be manually manipulated millimeters at a time, and to more esoteric props such as foodstuffs, domestic objects, and creatures.

                  Using this technique, you can animate any object, even one that isn't capable of moving by itself. A stop-motion movie may be made with anything, thus the options are practically limitless.

                  1. Animated Tutorials

                  A wide range of material genres, from educational films to comedic commercials, is now being explored with stop motion animation.

                  When it comes to creating marketing and instructional videos, stop motion animations is a popular choice due to their adaptability. An individual video can be created. 

                  Although the film is about five minutes long, viewers are likely to stick with it because of its originality.  The sophisticated tactics employed captivate the audience. Once you start viewing this stop motion video, it's impossible to put it down till the finish.

                  1. Improve the perception of your brand

                  It's easy to remember simple but innovative animations like these. These movies can assist a company's image and later recall be more positive. Stop motion video can provoke thought and awe in viewers, prompting them to spread the creative message to their social networks and professional contacts.

                  It is becoming increasingly common for organizations of all kinds to include stop-motion animations in their advertisements. 

                  1. In education 

                  Stop-motion films can have a positive impact on both education and business. Employees, customers, and students all benefit from using them to learn difficult concepts and methods more enjoyably. Stop motion filmmaking can liven up any subject matter, and pupils are more likely to retain what they've learned when it's done this way.

                  Some subjects can be studied more effectively in this way as well. Using stop motion films, for instance, learners can see the entire course of an experiment involving a slow-occurring reaction in a short amount of time.

                  Learners are given a stop motion assignment to work on as a group project in the classroom. Fast stop motion animation production requires a lot of teamwork, which improves interpersonal skills. Some learners would work on the models, while others might work on the backdrops and voiceovers, while yet others might concentrate on filming the scenes and directing the actors.

                  1. Engage Customers and Employees

                  The usage of stop motion movies can be utilized to explain product uses rapidly, even though the application of the device and the output may take a while. You can speed up the timeline as much as you want in stop motion animations!

                  For safety and health demonstrations or original sales demonstrations, stop motion instructional films may also be utilized to effectively express complex concepts. Because of the videos' originality, viewers are more likely to pay attention and retain the content.

                  1. Music Video

                  Some incredibly creative music videos have lately been created using stop motion animations, which has recently seen a resurgence in popularity.  Even the human body could be a character in this film.

                  Stop-motion animations have the potential to be extremely motivating. Sometimes, it's possible to achieve it by presenting things in a novel way, such as by stacking vegetables to appear like moving creatures. The sky's the limit when it comes to what you can dream up.

                  1. Reaction-Inducing Video

                  When it comes to creating a stop motion movie, it doesn't have to be complicated. If you don't have any of these things in your possession, you'll need to get them before you can begin filming. However, if you want to create a professional-level stop motion film, you'll need to enlist the help of an animation company.

                  As a marketing tool, animated videos may be highly effective when they are created by a professional team. 

                  1. Create an Intriguing idea

                  The story of a motion-capture movie is crucial in attracting the attention of audiences, so it should be carefully planned out before production begins. It should be appropriate for the video's intended audience, brand image, and message. If you need assistance with this, consider working with an animation studio.

                  Disadvantages

                  But there are several drawbacks to the overall process of stop motion filmmaking, which are difficult to overcome. The time it takes to create even a min of footage is the most remarkable. The time it takes to get this film might range from a few days to many weeks, depending on the approach used.

                  Additionally, the amount of time and work that is required to make a stop-motion movie might be enormous. This may necessitate the involvement of a large team. Although this is dependent on the sort of video, stop motion animating is now a fairly broad area of filmmaking, which can require many different talents and approaches.

                  Conclusion

                  Using the Raspberry Pi 4, you were able to create a stop-motion movie system. Various stop motion technologies were also covered, along with their advantages and disadvantages. After completing the system's basic functions and integrating additional components of your choice, you're ready to go on to the next phase of programming. Using raspberry pi 4 in the next article, we will build an LED cube.

                  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