Skip to main content

air quality monitoring system for Kathmandu city

SMART POLLUTION AND GARBAGE CONTROL AND MONITORNIG SYSTEM




this project is a smart air pollution and garbage monitoring system for a city. in this project we make a network of smart garbage bins  all over the city and with this we make a network of smart bins placed all over the city and each bin will send the data to central servers via public wifi connections if available and if not will use gsm modeules to send the data to the server and will give following information:-
1.status of all dustbins of city . we will be able to monitor all the garbage bins of city .
2. we can also monitor the air quality of all parts of the city as there will be air quality sensors placed outside the bins which will sense the environment around them.
so we will be better able to monitor the bins and air quality in that area and making us more able to effctively use the resources of municipality. 

as we know the flow of people varies on different parts and areas of city so garbage filling rate is not same. but municipality garbage vans have a interval in which they collect garbage. which is not efficient as in some areas the garbage will overflow and in some areas it will never fill. this results in inefficient management.

but this can be managed by our project as we can monitor the garbage and direct the resources where they are needed .


another application of this project is that we can keep track of air pollution of every part of the the city so the authorities can take actions if they want to in order to manage or reduce the pollution.air  pollution now a days in kathmandu is one of the biggest problems for civilian's 
 but this project might be able to help civilian's as it can keep track of air quality of every part or area of the city by using this data general public can find the least least polluted path to their and stay away from the pollution.

this project is not complet  yet  And is still ongoing. here is the arduino and wifi module code used in this project.

Arduino code to take data from senors which will than be transmitted to wifi module or gsm module to be transmitted to central server.

arduino code 

#include <SoftwareSerial.h>
#include <Servo.h>
SoftwareSerial s(5,6);
#include <SimpleDHT.h>
#include <math.h>
Servo myservo;int j;
int k;
int l;
int m;
int n;
const int trigPin = A4;
const int echoPin = A5;

long duration;
int distance;
const int trigPin1 = A0;
const int echoPin1 = A1;
long duration1;
int distance1;
int pinDHT11 = 3;
int light =A3;
int gaspin = A2;
int gdata = 0;
float lux = 0.00,av=0.0048828125,lv;
String str;

SimpleDHT11 dht11(pinDHT11);

void setup() {
s.begin(9600);
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
pinMode(trigPin1, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin1, INPUT); // Sets the echoPin as an Input
pinMode(light,INPUT);
myservo.attach(9);
}

void loop() {
  digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
distance= duration*0.034/2;

digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration1 = pulseIn(echoPin1, HIGH);
// Calculating the distance
distance1= duration1*0.034/2;

if(distance > 30)
{myservo.write(90);
delay(300);}
else if(distance <30)
{myservo.write( 10);
delay(300);}

if(distance1<20)
{m=1;}
else if(distance1>20)
{m =0;}

gdata = analogRead(gaspin);
if(gdata > 100)
{n = 2;}
else if(gdata >30 && gdata < 100)
{n= 3;}
else if(gdata > 15 && gdata <30)
{n =4;}
else if (gdata <15)
{n =5;}
  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    return;
  }
  lv = analogRead(light);
  lux = (250.000/(av*lv))-50.000;
 l  = (int)lux+100;
  k  =(int)humidity;
  j = (int)temperature;
  //j  =17;
  //k  =40;
  if(s.available()>0)
{
 s.write(j);
 delay(100);
 s.write(k);
 delay(100);
 s.write(l);
 delay(100);
 s.write(m);
 delay(100);
 s.write(n);
 delay(100);
}

}

wifi module code

#include <WiFiClient.h>
#include <ESP8266WebServer.h>

#include <SoftwareSerial.h>
SoftwareSerial s(D6,D5);
float data;
#define ssid      "kali"       // WiFi SSID
#define password  "0TSspwyV"  // WiFi password
#define DHTTYPE   DHT22       // DHT type (DHT11, DHT22)
#define DHTPIN    D4          // Broche du DHT / DHT Pin
const uint8_t GPIOPIN[4] = {D5,D6,D7,D8};  // Led
float   t = 0 ;
float   h = 0 ;
float   p = 0;
float   t1 = 0 ;
float   h1 = 0 ;
float   p1 = 0;
float   t2 = 0 ;
float   h2 = 0 ;
float   p2 = 0;
float   t3 = 0 ;
float   h3 = 0 ;
float   p3 = 0;
String  etatGpio[4] = {"","","",""};
String filling1 = "-----------";
String full1 = "-------";
String filling2 = "-----------";
String full2 = "-------";
String filling3 = "-----------";
String full3 = "-------";
String filling4 = "-----------";
String full4 = "-------";
String gstatus = "-----";
String gstatus1 = "-----";
String gstatus2 = "-----";
String gstatus3 = "-----";
// Création des objets / create Objects

ESP8266WebServer server ( 80 );

String getPage(){
  String page = "<html lang='fr'><head><meta http-equiv='refresh' content='60' name='viewport' content='width=device-width, initial-scale=1'/>";
  page += "<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'><script src='https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js'></script><script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js'></script>";
  page += "<title>Smart pollution monitoring and control</title></head><body>";
  page += "<div class='container-fluid'>";
  page +=   "<div class='row'>";
  page +=     "<div class='col-md-12'>";
  page +=       "<center><h1>Smart Pollution Monitering And Garbage Control System</h1></center>";
  page +=       "<h3>Air pollution monitoring</h3>";
  page +=       "</ul>";
  page +=       "<table class='table'>";  // Tableau des relevés
  page +=         "<thead><tr><th>Parameters</th><th>Ratnapark</th><th>Asan</th><th>Bhotahiti</th><th>Jamal</th></tr></thead>"; //Entête
  page +=         "<tbody>";  // Contenu du tableau
  page +=           "<tr><td>Temperature</td><td>"; // Première ligne : température
  page +=             t;
  page +=             "&deg;C</td><td>";
  page +=             t1;
  page +=             "&deg;C</td><td>";
  page +=             t2;
  page +=             "&deg;C</td><td>";
  page +=             t3;
  page +=             "&deg;C</td><td>";
  page +=             "</td></tr>";
  page +=           "<tr class='active'><td>Humidity;</td><td>"; // 2nd ligne : Humidité
  page +=             h;
  page +=             "%</td><td>";
  page +=             h1;
  page +=             "%</td><td>";
  page +=             h2;
  page +=             "%</td><td>";
  page +=             h3;
  page +=             "%</td><td>";
  page +=             "</td></tr>";
  page +=           "<tr><td>light</td><td>"; // 3ème ligne : PA (BMP180)
  page +=             p;
  page +=             "cd</td><td>";
  page +=             p1;
  page +=             "cd</td><td>";
  page +=             p2;
  page +=             "cd</td><td>";
  page +=             p3;
  page +=             "cd</td><td>";
  page +=             "</td></tr>";
  page +=           "<tr><td>CO2 content</td><td>"; // 3ème ligne : PA (BMP180)
  page +=             gstatus;
  page +=             "</td><td>";
  page +=             gstatus1;
  page +=             "</td><td>";
  page +=             gstatus2;
  page +=             "</td><td>";
  page +=             gstatus3;
  page +=             "</td><td>";
  page +=             "</td></tr>";
  page +=       "</tbody></table>";
  page +=       "<h3>GARBAGE_MONITORING</h3>";
  page +=       "<div class='row'>";
  page +=         "<div class='col-md-4'><h4 class ='text-left'>Ratnapark";
  page +=           "<span class='badge'>";
  page +=           etatGpio[0];
  page +=         "</span></h4></div>";
  page +=         "<div class='col-md-4'><form action='/' method='POST'><button type='button submit' name='Ratnapark' value='1' class='btn btn-success btn-lg'>"+filling1+"</button></form></div>";
  page +=         "<div class='col-md-4'><form action='/' method='POST'><button type='button submit' name='Ratnapark' value='0' class='btn btn-danger btn-lg'>"+full1+"</button></form></div>";
  page +=         "<div class='col-md-4'><h4 class ='text-left'>Bhotahiti";
  page +=           "<span class='badge'>";
  page +=           etatGpio[1];
  page +=         "</span></h4></div>";
  page +=         "<div class='col-md-4'><form action='/' method='POST'><button type='button submit' name='Asan' value='1' class='btn btn-success btn-lg'>"+filling2+"</button></form></div>";
  page +=         "<div class='col-md-4'><form action='/' method='POST'><button type='button submit' name='Asan' value='0' class='btn btn-danger btn-lg'>"+full2+"</button></form></div>";
  page +=         "<div class='col-md-4'><h4 class ='text-left'>Asan";
  page +=           "<span class='badge'>";
  page +=           etatGpio[2];
  page +=         "</span></h4></div>";
  page +=         "<div class='col-md-4'><form action='/' method='POST'><button type='button submit' name='Bhotahiti' value='1' class='btn btn-success btn-lg'>"+filling3+"</button></form></div>";
  page +=         "<div class='col-md-4'><form action='/' method='POST'><button type='button submit' name='Bhotahiti' value='0' class='btn btn-danger btn-lg'>"+full3+"</button></form></div>";
  page +=         "<div class='col-md-4'><h4 class ='text-left'>Jamal";
  page +=           "<span class='badge'>";
  page +=           etatGpio[3];
  page +=         "</span></h4></div>";
  page +=         "<div class='col-md-4'><form action='/' method='POST'><button type='button submit' name='Jamal' value='1' class='btn btn-success btn-lg'>"+filling4+"</button></form></div>";
  page +=         "<div class='col-md-4'><form action='/' method='POST'><button type='button submit' name='Jamal' value='0' class='btn btn-danger btn-lg'>"+full4+"</button></form></div>";
  page +=       "</div>";
  page +=     "<br><p><a href='http://www.projetsdiy.fr'>www.projetsdiy.fr</p>";
  page += "</div></div></div>";
  page += "</body></html>";
  return page;
}
void handleRoot(){
server.send ( 200, "text/html", getPage() );
  
}

void handleD5() {
  String D5Value;
  updateGPIO(0,server.arg("D5"));
}

void handleD6() {
  String D6Value;
  updateGPIO(1,server.arg("D6"));
}

void handleD7() {
  String D7Value;
  updateGPIO(2,server.arg("D7"));
}

void handleD8() {
  String D8Value;
  updateGPIO(3,server.arg("D8"));
}

void updateGPIO(int gpio, String DxValue) {
  Serial.println("");
  Serial.println("Update GPIO "); Serial.print(GPIOPIN[gpio]); Serial.print(" -> "); Serial.println(DxValue);
 
  if ( DxValue == "1" ) {
    digitalWrite(GPIOPIN[gpio], HIGH);
    etatGpio[gpio] = "On";
    server.send ( 200, "text/html", getPage() );
  } else if ( DxValue == "0" ) {
    digitalWrite(GPIOPIN[gpio], LOW);
    etatGpio[gpio] = "Off";
    server.send ( 200, "text/html", getPage() );
  } else {
    Serial.println("Err Led Value");
  } 
}

void setup() {
  for ( int x = 0 ; x < 5 ; x++ ) {
    pinMode(GPIOPIN[x],OUTPUT);
  } 
  Serial.begin ( 9600 );
  s.begin(9600);
  // Initialisation du BMP180 / Init BMP180
 
 
  WiFi.begin ( ssid, password );
  // Attente de la connexion au réseau WiFi / Wait for connection
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 ); Serial.print ( "." );
  }
  // Connexion WiFi établie / WiFi connexion is OK
  Serial.println ( "" );
  Serial.print ( "Connected to " ); Serial.println ( ssid );
  Serial.print ( "IP address: " ); Serial.println ( WiFi.localIP() );

  // On branche la fonction qui gère la premiere page / link to the function that manage launch page
  server.on ( "/", handleRoot );

  server.begin();
  Serial.println ( "HTTP server started" );
 
}

void loop() {
  // put your main code here, to run repeatedly:
  server.handleClient();
  if (s.available()>0)
  {
    data=s.read();
    Serial.println(data);
  }
  if(data<25 && data >10)
  {t = data;}
  else if (data>25 && data<100)
  {h = data;}
  else if(data > 100 && data <200)
  {p = data-100;}
  else if(data > 200)
  {p = data + 200;}
  else if(data == 0)
  {filling1 = "FILLING";
   full1 = "-------";}
     else if(data == 1)
  {filling1 = "-----------";
   full1 = "FULL";}
 
   if(data == 2)
   {gstatus = "H.Dence";}
   else if (data ==3)
   {gstatus = "_.Dence";}
   else if(data == 4 )
   {gstatus  = "Normal";}
   else if (data == 5)
   {gstatus = "__Low";}
  delay(100);
}
 




Popular posts from this blog

CHANGING THE ARDUINO(ATMEGA328) PWM FREQUENCY

CHANGING ARDUINO PWM FREQUENCY In some projects like boost and buck converters we may need to change the default frequency of Arduino PWM pins according to our need in order to control the charging time of inductor. in Arduino UNO pins D5 and D6 have PWM frequency of 62500 HZ , pins D3, D11, D9 and D10 has the default PWM frequency of 31250 HZ . To change the PWM frequency  following code can be written in setup function to set PWM frequency Divide the base frequency of pins by the factor you want to decrease the frequency for each pin  some examples are shown below The divisors available on pins 5, 6, 9 and 10 are: 1, 8, 64, 256, and 1024. The divisors available on pins 3 and 11 are: 1, 8, 32, 64, 128, 256, and 1024. for D3 and D11 TCCR2B = TCCR2B & B11111000 | B00000001; // for PWM frequency of 31372.55 Hz TCCR2B = TCCR2B & B11111000 | B00000010; // for PWM frequency of 3921.16 Hz TCCR2B = TCCR2B & B11111000 | B000000...

NRF24 based remote with Arduino Nano

MAKING A DRONE REMOTE  to make the drone remote you will need following components:-  nrf24 rf module(two) joystick module(two) arduino nano (two) capacitors (one) now connect the components in following way :- connection of nrf24 for both transmitter and receiver are same. there are some additional connections to be made in transmitter to read data from joystick so and connnect the joystick pins in following way  Right joystick y axis pin = A0;  Right joystick x axis pin  = A7; Right joystick switch pin = A6; left joystick y axis pin = A1;  left joystick x axis pin  = A5;   left joystick switch pin = A2; now after connecting the above circuit upload the following codes given for transmitter and receiver and you will get the data as shown below in receiver side. now transmitter code is as follows #include <SPI.h>  #include "RF24.h" const int Ry = A0; const int Rx = A...

Closed loop Control of DC to DC boost converter

DC-DC boost converter boosts the DC input voltage to higher DC voltages  according to the duty cycle of  PWM  applied to the mosfet used to charge the inductor.While the mosfet state is on the inductor gets charged, than when the mosfet turns off the voltage stored in inductor and input voltage gets added and appears in the output. But if only these components are used output Voltage will be pulsating and have a frequency similar to that of mosfet switching. So we need to put a capacitor in output in order to oscillating output to smoother output. Still the stored voltage in capacitor will backflow through the mosfet when it is on, So we need to place a diode in between mosfet and capacitor in order to prevent backflow of stored charge in capacitor.After these circuit requirements are completed the boost converter will be boost low voltage DC input to higher DC voltages.The circuit should look like as shown below:- Boost Converter Circuit Output Voltage calcu...

DC-DC buck converter

DC-DC buck converter converts DC voltage from higher voltages to lower voltages according to the duty cycle of PWM applied to the MOSFET gate. When MOSFET  is fired the inductor and capacitor gets charged so when MOSFET turns off the inductor and capacitor works as current and voltage source and continue to supply steady voltage and current till the MOSFET is fired again. For the inductor and capacitor to continuously supply the power to load without any ripples the inductance and capacitance of inductor must be high enough so that the change in their voltage and current is not  significant.  Buck converter circuit output voltage  the output voltage of the converter depends on the duty cycle of the PWM applied to the MOSFET gate.    output voltage  =  Duty cycle * Vin    Duty cycle        =  Ton/(Ton+Toff) with the change in load and change in input voltage the output voltage may vary, i...

A4 size CNC pen plotter

Following components were used in this project: Nema 17 stepper motors -2 Threaded rods - 2  Steel rods - 4 linear bearings - 6 Servo Motor -1 Arduino uno - 1 Arduino Stepper motor driver shield Aluminum brackets and plywood Following software was used for this project GRBL Arduino library  Universal gcode sender Inkscape for image to gcode conversion Following video and pictures show the working and some outcomes of the project Results:

Using PWM with ESP32 boards

  Unlike Arduino boards like UNO, MEGA and many others, ESP32 board does not support analogWrite() command while programming with Arduino IDE. This is because in the Arduino IDE board library for ESP32 does not contain predefined analogWrite( ) function. This is because ESP32 offers many more features with its Digital to Analogue converters, which cannot be fully utilized by analogWrite() function. ESP 32 board can output PWM signals with any frequency the programmer wants upto 40MHZ. but in other arduino boards like arduino uno only selective frequencies are available. ESP 32 also offers DAC resolution upto 16 bits. In this board the relation between ADC resolution and PWM frequency is inverse. The maximum PWM frequency with the currently used ledc duty resolution of 10 bits in PWM module is 78.125 KHz . The duty resolution can be lowered down to 1 bit in which case the maximum frequency is 40  MHz , but only the duty of 50% is available. Available DAC pins in ESP32 can be ...

ESP8266n based home automation project

   IOT HOME AUTOMATION USING NODE MCU                                                                     In this post you will see how to make a system that lets you control your appliances using a node mcu board . Node mcu board is a development board consisting of a esp8266 wifi module along with programming circuits. you  will need following parts for this project :- 1.NODE MCU board 2.relay module or some relays and transistors 3.matrix board 4.screw connectors or headers 5.5v power supply 6.USB cable now follow the instructions below 1.connect your node mcu to computer and open arduino IDE 2.Now go to preferances and add this url in arduino board manager url       http://arduino.esp8266.com/stable/package_esp8266com_index.json 3.now go to tools/boards...

Demand Side Management in a solar microgrid

SCADA in hybrid energy system management and control for isolated DC micro-grid . Our system addresses the problem of connecting different Energy sourced together effectively, monitoring and controlling of the Hybrid energy system formed by different renewable energy sources. Article in the link can be followed for more information. https://www.sciencedirect.com/science/article/pii/S2352484720314554 For our project we developed a small version of DC micro grid taking power from different power sources (Like solar and wind) and combining these sources together   with the help of voltage stabilizing buck-boost converters. After we boot the voltages from different sources to our distribution voltage. We distribute the power for different loads like Households, Hospitals, Schools through dedicated feeders. Now with the help of SCADA  and Sensors we can monitor various system parameters like Generation voltage of different sources, Bus voltage, powe...

Parallel operation of boost converters in priority-based power sharing mode

Priority based power sharing in parallel connected boost converters is one of the simplest power sharing scheme to run the boost converters in parallel operation. in this simulation it is considered that the boost converters are physically not far from each other, and the controllers of the converters can communicate with other. One of the converters will run on higher priority which means that that converter will supply as much power as it can to the bus, and another will only supply additional power required to maintain bus stability i.e: maintain the bus voltage. Following figure shows the hardware setup of the experiment. Figure: Boost converter parallel operation experimental setup this configuration of the converter is applicable in the conditions where we need to draw as much power from a source as possible and draw only additional power required to maintain bus voltage from the secondary source. An example application case would be when there is a solar and battery-based hom...

Project gallery

Some of the photos of my projects that managed to survive long enough on my gallery. fig : RLDA data acquisition project (2023 February) fig : DAQ preparation for RLDA (2023 February) fig : DAQ controller board (2023 February) fig : DAQ system testing on bump rig (2022 November) fig: 8 channel strain gauge DAQ system with 10 uV precision  and 1000 HZ sampling frequency (2022 November) fig : 8 channel strain gauge DAQ board Ki-CAD PCB (2022 October) fig: PCB wire tresses (2022 October) fig : Four channel 24 bit ADC board interfaced  with teensy4.1 for high speed data acquisition fig : four channel instrumentational amplifier (2023 January) fig : Ki-CAD PCB design four channel instrumentation amplifier (2023 October) fig : Instrumented bike chassis (2022 October) fig : Half bridge strain gauge application on steel rod (2022 October) fig : STM 32 pneumatic rig control board (2022 September) fig : Strain gauge data verification setup (2022 September) fig : Instrumentation amplifie...