Sunteți pe pagina 1din 11

PROTOCOALE ȘI INTERFEȚE DE COMUNICAȚIE ÎN

SISTEME MECATRONICE
LABORATOARELE: 7,8
Data: 05.05.2022

Laborator 7:
Placa de dezvoltare cu ESP32
Interfața I2C și Onewire
1. Considerații generale
2. Descriere circuit DS18B20
3. Descriere circuit BMP 180
4. Caracteristici interfețe
5. Descriere comunicație între ESP și interfețele
a. I2C
b. Onewire
Laborator 8:
1. Scriere programe pentru interfațarea senzorilor cu placa de dezvoltare ESP32
2. Aplicații cu senzorul DS18B20, BMP180
3. Interfațarea cu un sistem Wi-Fi
4. Interpretare date achiziționate

Interfața I2C sau IIC (Inter-Integrated Circuit) este un tip de magistrală pentru transmisie de date
serială master-slave, utilizată intensiv între circuite integrate digitale (microcontrolere, memorii,
convertoare) și a fost inițial dezvoltată de către firma olandeză Philips (în prezent NXP) în anul 1982.
Ulterior specificația a suferit mai multe modificări descrise în diferite versiuni:

• vers. 1.0 (1992): permite două tipuri de transmisie: Normal mode (rata de transfer:
100 kbps) respectiv Fast mode (rata de transfer: 400 kbps) precum și adresarea pe 10
biți (max 1024 dispozitive)
• vers. 2.0 (1998): s-a adăugat o nouă rată superioară de transfer (High speed mode) de
3,4 Mbps
• vers. 2.1 (ianuarie 2000) îmbunătățiri aduse versiunii anterioare
• vers. 3.0 (2007) s-a inclus o nouă rată de transfer numita Fast mode plus de 1 Mbps
• vers. 4.0 (2012) rata de transfer Ultra-Fast mode de 5 Mbps
Magistrala (busul) I²C este compusă din doua linii:
• SCL - Serial Clock Line (ro: linie de ceas seriala)
• SDA - Serial Data Line (ro: linie de date seriala)
Senzor DS18B20:
Acesta este senzorul de temperatura bazat pe cipul DS18B20, care consta dintr-o sonda rezistenta la apa si
un fir lung de 1m. Modelul DS18B20 furnizează citiri de temperatura de la 9 la 12 biti (configurabile) pe
o interfața cu 1 fir, astfel încât sa se conecteze un singur fir de la un microprocesor central.
Având o capacitate puternica de combatere a interferentelor si o precizie ridicata, este acoperita cu un
furtun de cauciuc impermeabil in exterior si capabil sa masoare temperatura in intervalul -55 Ԩ ~ + 125
Ԩ.

Senzor BMP 180:


Modulul cu senzor BMP180 este ideal pentru a măsura temperatura, presiunea și altitudinea, având un
consum extrem de redus și dimensiuni foarte mici. Toate informațiile se transmit cu ajutorul a doar 2
conexiuni (SDA și SCL) + conexiunea de masă. Calitățile modulului îl fac util pentru proiecte ce au
nevoie de mobilitate mare.

1-Wire este un sistem de magistrală de comunicații pentru dispozitiv proiectat de Dallas Semiconductor
Corp. care oferă date, semnalizare și putere de viteză mică (16,3 kbit/s[1]) pe un singur conductor.
1-Wire este similar în concept cu I²C, dar cu rate de date mai mici și o rază de acțiune mai mare. Este de
obicei folosit pentru a comunica cu dispozitive mici și ieftine, cum ar fi termometrele digitale și
instrumentele meteorologice. O rețea de dispozitive 1-Wire cu un dispozitiv master asociat se numește
MicroLAN. Protocolul este folosit și în cheile electronice mici cunoscute sub numele de cheie Dallas sau
iButton.
Protocolul de comunicare I2C folosește două fire pentru a partaja informații. Unul este folosit pentru
semnalul de ceas (SCL), iar celălalt este folosit pentru a trimite și primi date (SDA).
Când utilizați ESP32 cu Arduino IDE, pinii I2C impliciți sunt GPIO 22 (SCL) și GPIO 21 (SDA), dar vă
puteți configura codul pentru a utiliza orice alți pini.
Citire valori de la senzorul de temperatura DS18B20

#include <OneWire.h>
#include <DallasTemperature.h>

// GPIO where the DS18B20 is connected to


const int oneWireBus = 4;

// Setup a oneWire instance to communicate with any OneWire devices


OneWire oneWire(oneWireBus);

// Pass our oneWire reference to Dallas Temperature sensor


DallasTemperature sensors(&oneWire);

void setup() {
// Start the Serial Monitor
Serial.begin(115200);
// Start the DS18B20 sensor
sensors.begin();
}
void loop() {
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
float temperatureF = sensors.getTempFByIndex(0);
Serial.print(temperatureC);
Serial.println("ºC");
Serial.print(temperatureF);
Serial.println("ºF");
delay(5000);
}

Citire valori de la senzorul de presiune BMP180


#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;

void setup() {
Serial.begin(9600);
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
}
}

void loop() {
Serial.print("Temperature = ");
Serial.print(bmp.readTemperature());
Serial.println(" *C");

Serial.print("Pressure = ");
Serial.print(bmp.readPressure());
Serial.println(" Pa");

// Calculate altitude assuming 'standard' barometric


// pressure of 1013.25 millibar = 101325 Pascal
Serial.print("Altitude = ");
Serial.print(bmp.readAltitude());
Serial.println(" meters");

Serial.print("Pressure at sealevel (calculated) = ");


Serial.print(bmp.readSealevelPressure());
Serial.println(" Pa");
Serial.print("Real altitude = ");
Serial.print(bmp.readAltitude(101500));
Serial.println(" meters");

Serial.println();
delay(500);
}

Afișare pe pagina web valori senzor BMP180.


// Load Wi-Fi library
#include <WiFi.h>
#include <Adafruit_BMP085.h>
#include "esp_adc_cal.h"

int temp_val;
int pres_val;

// Replace with your network credentials


const char* ssid = "ESP32-Access-Point";
const char* password = "123456789";

// Set web server port number to 80


WiFiServer server(80);

// Variable to store the HTTP request


String header;

Adafruit_BMP085 bmp;
void setup() {
Serial.begin(115200);
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
}
delay(1000);

// Connect to Wi-Fi network with SSID and password


Serial.print("Setting AP (Access Point)…");
// Remove the password parameter, if you want the AP (Access Point) to be
open
WiFi.softAP(ssid, password);

IPAddress IP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(IP);

server.begin();
}

void loop(){
WiFiClient client = server.available(); // Listen for incoming clients

delay(500);
temp_val = bmp.readTemperature();
pres_val = bmp.readPressure();

Serial.print("Temperature = ");
Serial.print(bmp.readTemperature());
Serial.println(" *C");

Serial.print("Pressure = ");
Serial.print(bmp.readPressure());
Serial.println(" Pa");

// Calculate altitude assuming 'standard' barometric


// pressure of 1013.25 millibar = 101325 Pascal
Serial.print("Altitude = ");
Serial.print(bmp.readAltitude());
Serial.println(" meters");

Serial.print("Pressure at sealevel (calculated) = ");


Serial.print(bmp.readSealevelPressure());
Serial.println(" Pa");

// you can get a more precise measurement of altitude


// if you know the current sea level pressure which will
// vary with weather and such. If it is 1015 millibars
// that is equal to 101500 Pascals.
Serial.print("Real altitude = ");
Serial.print(bmp.readAltitude(101500));
Serial.println(" meters");

Serial.println();
delay(500);
delay(100);

if (client) { // If a new client connects,


Serial.println("New Client."); // print a message out in the
serial port
String currentLine = ""; // make a String to hold incoming
data from the client
while (client.connected()) { // loop while the client's
connected
if (client.available()) { // if there's bytes to read from
the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
header += c;
if (c == '\n') { // if the byte is a newline
character
// if the current line is blank, you got two newline characters in a
row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1
200 OK)
// and a content-type so the client knows what's coming, then a
blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println("Refresh: 0.1"); // refresh the page automatically
every 5 sec
client.println();

// Display the HTML web page


client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\"
content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");

client.println("<body><h1>Senzor </h1>");
delay(1000);

client.print("Temperatura = ");
client.print(temp_val);
client.print(" grade Celsius ");
client.println("si ");
client.println("Presiune = ");
client.print(pres_val);
client.print(" Pa ");

// The HTTP response ends with another blank line


client.println();
// Break out of the while loop
break;
} else { // if you got a newline, then clear currentLine
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage
return character,
currentLine += c; // add it to the end of the currentLine
}
}
}
// Clear the header variable
header = "";
// Close the connection
client.stop();
Serial.println("Client disconnected.");
Serial.println("");
}

Afișare pe pagina web valori senzor DS18B20.


// Load Wi-Fi library
#include <WiFi.h>
#include "esp_adc_cal.h"
#include <OneWire.h>
#include <DallasTemperature.h>

// Replace with your network credentials


const char* ssid = "ESP32-Access-Point";
const char* password = "123456789";
// Set web server port number to 80
WiFiServer server(80);
// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;

// Setup a oneWire instance to communicate with any OneWire devices


OneWire oneWire(oneWireBus);

// Pass our oneWire reference to Dallas Temperature sensor


DallasTemperature sensors(&oneWire);

// Variable to store the HTTP request


String header;

void setup() {
Serial.begin(115200);
delay(1000);

// Connect to Wi-Fi network with SSID and password


Serial.print("Setting AP (Access Point)…");
// Remove the password parameter, if you want the AP (Access Point) to be
open
WiFi.softAP(ssid, password);

IPAddress IP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(IP);

server.begin();
sensors.begin ();
}

void loop(){
WiFiClient client = server.available(); // Listen for incoming clients

// Print The Readings


sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
float temperatureF = sensors.getTempFByIndex(0);
Serial.print(temperatureC);
Serial.println("ºC");
Serial.print(temperatureF);
Serial.println("ºF");

delay(100);

if (client) { // If a new client connects,


Serial.println("New Client."); // print a message out in the
serial port
String currentLine = ""; // make a String to hold incoming
data from the client
while (client.connected()) { // loop while the client's
connected
if (client.available()) { // if there's bytes to read from
the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
header += c;
if (c == '\n') { // if the byte is a newline
character
// if the current line is blank, you got two newline characters in a
row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1
200 OK)
// and a content-type so the client knows what's coming, then a
blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println("Refresh: 0.1"); // refresh the page automatically
every 5 sec
client.println();

// Display the HTML web page


client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\"
content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");

client.print("Temperatura = ");
client.print(temperatureC);
client.print(" grade Celsius ");

// The HTTP response ends with another blank line


client.println();
// Break out of the while loop
break;
} else { // if you got a newline, then clear currentLine
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage
return character,
currentLine += c; // add it to the end of the currentLine
}
}
}
// Clear the header variable
header = "";
// Close the connection
client.stop();
Serial.println("Client disconnected.");
Serial.println("");
}

S-ar putea să vă placă și