Table of Contents

Paiu Teofil : Weather Station

Introducere

Nume: Paiu Teofil
Grupa: 333CB
Indrumator: Daniel Dosaru

Descriere

Proiectul consta in crearea unui sistem de monitorizare a temperaturi si umidități dintr-o încăpere si stocarea acestor informați într-o baza de date pentru a putea fi analizate in timp.

Pe lângă funcția de stocare acesta beneficiază de un ecran pentru afișajul actual, cat si o pagina web cu informațiile stocate in ultima ora de funcționare.

Motivatie

Idea a plecat de la nevoia de cunoaștere a spațiului in care locuim si acomodarea acestuia. Pe viitor dateleextrase pot fi folosite pentru controla diferite aparaturi pentru a crea un mediu comod.

Cred ca proiectul poate fi util si este o baza pentru pornirea diferitelor aplicați si automatizări ce țin de cunoașterea temperaturi si umidității din mediul înconjurător.

Descriere generală

In cele ce urmeaza o sa detaliez schema bloc a proiectului

Celulele albastre reprezinta cele doua µC folosite ci anume Atmega328P (Arduino Uno R3) si ESP-8266 32bit (NodeMCU).

Celulele verzi reprezinta intrările care vor fi citite de µC in special semnalele butoanelor (prin întreruperi), senzorul de temperatura DTH11 (printr-un protocol definit in datasheet-ul sau) si o photorezistenta intr-un ansablu divizor de tensiune cu ajutorului functionalitati DAC.

Celula galbena reprezinta ieșirea µC reprezentata de un ecran LCD 16×02 pe care se vor afișa citirile actuale ale senzorului de temperatura.

Hardware Design

In cele ce urmeaza o sa detaliez partea hardware a proiectului prezentand componentele cablajul si varianta finala a acestei etape.

Pentru realizarea designului hardware am folosit un tool numit Fritzing care mi-a oferit posibilitatea de a importa module proprii.

Lista Componente

1 x Arduino Uno R3 cu Atmega328P
1 x NodeMCU cu ESP-8266 32bit
1 x DTH11 senzor
1 x photorezistenta
3 x Butoane
5 x Rezistenta 1kΩ
1 x Rezistenta 2kΩ
3 x Rezistenta 10kΩ
4 x Capacitorare ceramice 47nF
1 x LCD 1602 I2C
1 x Adaptor baterie 9V
30 x male-male jumping wires
4 x male-female jumping wires

Conectivitate

P2 : Se conecteaza buton pentru schimbare valori unitati de masura a temperaturi.
P3 : Se conecteaza buton pentru activarea schimbari ceasului si selectia orei si minutelor.
P4 : Se conecteaza buton pentru incrementarea valori orei/minutelor.
P5 : Se conecteaza la portul TX al NODEMCU-ului.
P6 : Se conecteaza la portul RX al NODEMCU-ului.
P7 : Se conecteaza la pinul data al senzorului DTH22.
P10: Se conecteaza prin modul PWM la pinul jumper A al modulului I2C backpack.
A5 : Se conecteaza la pinul SCL a modulului I2C backpack
A3 : Se conecteaza la photorezistenta si se citeste valoarea analogica cu ajutorul DAC.
A4 : Se conecteaza la pinul SDA a modulului I2C backpack
VCC: Se conecteaza la toate dispozitivele care au nevoie
GND: Se conecteaza la toate dispozitivele care au nevoie este comun in tot circuitul

Diagrama Circuit

Am ales sa folosesc niște filtre RC pentru a reduce efectul de debouncing al butoanelor. Pentru valorile alese am folosit un calculator online (de aici) pentru a avea un timp de aproximativ 30 de milisecunde pana la activare.

Circuitul mai dispune de voltage divider (cu un factor de divizare 2/3) pentru a realiza comunicația intre Arduino (5V) si NodeMCU (3.3v) in mod sigur.

Conform datasheet-ului de la DHT11 acesta recomanda un condensator intre VCC si GND pentru a filtra alimentarea si o rezistentă pullup de 1kΩ pe data pin.Pentru butoane am ales rezistente de 10kΩ pentru a tine intrarea sus.

Schema circuit

In acelasi software ca mai sus am realizat si un cablaj al intregului proiect asa cum a fost prezentat mai sus.

Implementare

Am ales sa folosesc un o placa de cablaj de test pe care am lipit componente si 2 headeri de pini a cate 5 intrari fiecare pentru a conecta arduinoul si placa NODE MCU. Rezultatul final al acestei etape a fost cel din poza de mai jos.

Software Design

In aceasta parte a pagini o sa prezint firmware-ul aplicatiei si detalierea lui la nivel de structura si functionalitate. Acesta a fost dezvoltat in ARDUINO IDE cu ajutorul unor biblioteci exterioare.

Structura

Pe partea software exista doua firmware-uri diferite unul pentru Arduino Uno R3 si unul pentru NodeMCU ESP8266 32bit:

Descriere cod

Arduino Nano R3:

board.h
#ifndef BOARD_H
#define BOARD_H
 
#include <Arduino.h>
 
// module folosite in comunicarea cu ecranul LDC
#include <LiquidCrystal_I2C.h>
#include <Wire.h> 
 
// modul folosit in comunicarea cu arduino-ul
#include <SimpleDHT.h>
 
// toata logica senzorilor si modulelor de pe arduino
class Board {
public:
  Board(uint8_t lcdAddr, uint8_t lcdCols, uint8_t lcdRows, uint8_t backlightPin, uint8_t dhtPin,
uint8_t photoPin, uint8_t btn3Pin, uint8_t txPin);
 
  // getteri la variabilele private temp si humidity
  byte readTemperature();
  byte readHumidity();
 
  // functie initializeaza intreruperile, porturile  si comunicatile
  void begin();
 
  // functie ce citeste valorile senzorilor si updateaza ecranul
  void update();
 
private:
  // obiectele ecranului si a senzorului DTH11
  LiquidCrystal_I2C lcd;
  SimpleDHT11 dht11;
 
  // variabile pentru ora si minute 
  uint8_t hour, minute;
  unsigned long prev_millies;
 
  // variabilele pentru stocarea cititrilor
  byte temp, humidity;
 
  // diferiti pini ce se folosesc pentru a seta intreruperi sau a citi sau scrie valori
  uint8_t photoPin, backlightPin, dht_pin, btnIncrement, btnTime, btnTemp, txPin;
 
  // functie ce updateaza ecranul
  void updateScreen();
 
  // functii ce se ocupa de starea unei intreruperi
  void handleTime();
  void incrementX();
  void handleTemp();
};
 
// functile pe care le dau intreruperilor
void changeTemp();
void changeTime();
 
extern uint8_t setTime;
extern bool celsius;
 
#endif

NodeMCU ESP8266 32bit:

main.cpp
// include biblioteca server
#include <ESP8266WebServer.h>
 
// trebuie sa fie 2.4Gz
const char* ssid = "ssid_router";
const char* password = "password";
 
// pe portul 80 al placutei
ESP8266WebServer server(80);
 
// modelul unui punct 
struct SensorData {
    float temperature;
    float humidity;
    unsigned long timestamp;
};
 
// pagina http statica
String page = R"(
<html lang='en'>
<head>
    ...
</head>
<body>
    ...
</body>
</html>
)";
 
// dimensiunea si array-ul in care se stocheaza datele
const int dataSize = 100;
SensorData data[dataSize];
 
// endpoint catre pagina
void htmlIndex();
 
// cerere get pentru data
void handleData();
 
// conexiune wifi 
void connectToWiFi();
 
// seteaza routelele serverului si pornestel
void setupServer();

Biblioteci utilizare

Rezultate Obţinute

In urma realizari proiectul se pot vizualiza rezultatele optinute la urmatorul video:

De asemenea o fotografie cu acesta:


si interfata web:

Download

Toate fisierele care au fost realizate in acest proiect se regasesc in arhiva de mai jos care cuprinde:

- un fisier README care explica pasi de importare a bibliotecile externe si de compilare si rulare.
- un director LIBS care contine bibliotecile externe.
- un director src care contine codul proiectului (partea software).
- un fisier PM_final.fzz care contine schema proiectului (partea hardware).
- un fisier PM.drawio care contine diagrama de context.

Arhiva se afla aici → Arhiva.zip

Bibliografie/Resurse