Sunteți pe pagina 1din 9

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

SISTEME MECATRONICE
LABORATOARELE: 1,2
Data: 17.03.2022

Temele impuse:
Laborator 3: Achiziția datelor pe portul analogic
Placa de dezvoltare cu ESP32 – WEMOS LOLIN 32
1. Considerații generale
2. Caracteristici placă
3. Descriere schemă hardware
4. Utilizare port analogic

Laborator 4: Aplicații
5. Scriere programe pentru placa de dezvoltare
 Citește port analogic
 Mediază valorile citite
6. Aplicații cu led-uri
 Aprinde/stinge led-uri la valori citite de pe potențiometru
7. Interfațare cu un sistem Wi-Fi
 Afișează pe o pagină web valorile citite de la potențiometru
8. Interpretare date achiziționate

A. Controlul LED-lor cu ajutorul unui Access Point pentru WebServer

Conectarea a 2 LED-uri la pinii 26 și 27 ai microcontroller-ului. Prinderea și stingerea acestora


poate fii controlată prin intermediul unor butoane ON, OFF, aflate pe o pagină HTML. Se
conectează laptopul sau telefonul la rețeaua wifi generată de placuța de dezvoltare cu numele
ESP32-Access-Point, cu parola 123456789. Ulterior se intră pe adresa 192.168.4.1 pentru a afișa
următoarea interfață care controlează întregul sistem.
Fig.1 – Interfață 192.168.4.1, cu
pinii aferenți

Fig.2 – Controlarea LED-urilor prin interfața 192.168.4.1


Codul în Arduino aferent aplicației de sus:

/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
*********/

// Load Wi-Fi library


#include <WiFi.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);

// Variable to store the HTTP request


String header;

// Auxiliar variables to store the current output state


String output26State = "off";
String output27State = "off";

// Assign output variables to GPIO pins


const int output26 = 26;
const int output27 = 27;

void setup() {
Serial.begin(115200);
// Initialize the output variables as outputs
pinMode(output26, OUTPUT);
pinMode(output27, OUTPUT);
// Set outputs to LOW
digitalWrite(output26, LOW);
digitalWrite(output27, LOW);

// 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

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();

// turns the GPIOs on and off


if (header.indexOf("GET /26/on") >= 0) {
Serial.println("GPIO 26 on");
output26State = "on";
digitalWrite(output26, HIGH);
} else if (header.indexOf("GET /26/off") >= 0) {
Serial.println("GPIO 26 off");
output26State = "off";
digitalWrite(output26, LOW);
} else if (header.indexOf("GET /27/on") >= 0) {
Serial.println("GPIO 27 on");
output27State = "on";
digitalWrite(output27, HIGH);
} else if (header.indexOf("GET /27/off") >= 0) {
Serial.println("GPIO 27 off");
output27State = "off";
digitalWrite(output27, LOW);
}

// 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:,\">");
// CSS to style the on/off buttons
// Feel free to change the background-color and font-size attributes to fit your preferences
client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;");
client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
client.println(".button2 {background-color: #555555;}</style></head>");

// Web Page Heading


client.println("<body><h1>ESP32 Web Server</h1>");

// Display current state, and ON/OFF buttons for GPIO 26


client.println("<p>GPIO 26 - State " + output26State + "</p>");
// If the output26State is off, it displays the ON button
if (output26State=="off") {
client.println("<p><a href=\"/26/on\"><button class=\"button\">ON</button></a></p>");
} else {
client.println("<p><a href=\"/26/off\"><button class=\"button button2\">OFF</button></a></p>");
}

// Display current state, and ON/OFF buttons for GPIO 27


client.println("<p>GPIO 27 - State " + output27State + "</p>");
// If the output27State is off, it displays the ON button
if (output27State=="off") {
client.println("<p><a href=\"/27/on\"><button class=\"button\">ON</button></a></p>");
} else {
client.println("<p><a href=\"/27/off\"><button class=\"button button2\">OFF</button></a></p>");
}
client.println("</body></html>");

// 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("");
}
}

B. Medierea valorilor aflate într-un anumit interval, cu ajutorul librăriei Statistic.h

Fig.3 – Mediere valorilor, maximul și minimul șirului de valori

Codul în Arduino, conform medierii valorilor:


//
// FILE: Average.ino
// AUTHOR: Rob Tillaart
// PURPOSE: Sample sketch for statistic library Arduino

#include "Statistic.h"

//statistic::Statistic<float, uint32_t, true> myStats;


Statistic myStats; // pre 1.0.0 declaration

uint32_t start;
uint32_t stop;

void setup(void)
{
Serial.begin(115200);
Serial.println(__FILE__);
Serial.print("Demo Statistics lib ");
Serial.println(STATISTIC_LIB_VERSION);
myStats.clear(); //explicitly start clean
start = millis();
}

void loop(void)
{
long rn = random(0, 9999);
myStats.add(rn / 100.0 + 1);
if (myStats.count() == 10000)
{
stop = millis();
Serial.print(" Count: ");
Serial.println(myStats.count());
Serial.print(" Min: ");
Serial.println(myStats.minimum(), 4);
Serial.print(" Max: ");
Serial.println(myStats.maximum(), 4);
Serial.print(" Average: ");
Serial.println(myStats.average(), 4);
Serial.print(" variance: ");
Serial.println(myStats.variance(), 4);
Serial.print(" pop stdev: ");
Serial.println(myStats.pop_stdev(), 4);
Serial.print(" unbias stdev: ");
Serial.println(myStats.unbiased_stdev(), 4);
Serial.print(" time(ms): ");
Serial.println(stop - start);
Serial.println("=====================================");
myStats.clear();
delay(1000);
start = millis();
}
}

// -- END OF FILE --

C. Citirea datelor de la portul analogic cu ajutorul unui potențiometru


Potențiometrul conectăm la pinul 34, ADC6.

Codul afferent ipotezei de sus, este:

// Potentiometer is connected to GPIO 34 (Analog ADC1_CH6)


const int potPin = 34;

// variable for storing the potentiometer value


int potValue = 0;

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

void loop() {
// Reading potentiometer value
potValue = analogRead(potPin);
Serial.println(potValue);
delay(500);
}

D. Medierea valorilor citite de la potențiometru


Se efectuează un număr de 10 măsurători, ale căror valori vor fi mediate ulterior.

Fig.4 – Medierea valorilor afișate pe serial monitor

Codul în Arduino, pentru medierea valorilor generate de potențiometru:

/*
Analog median and average
by Tom Igoe

This program reads an analog input and gives the average of 9 readings,
and sorts the list of readings and delivers the median number.

Created 17 October 2005


Updated 7 August 2007
https://www.tigoe.com/pcomp/code/arduinowiring/42/
*/
int numReadings = 10; // number of samples to take
int median = 0; // median of the sorted samples
int readingNumber; // counter for the sample array

// variables for subroutines:


byte i = 0;
byte j = 0;
byte position = 0;
int analogValues[10];

//function prototypes:
void bubbleSort();
int averageArray();

void setup() {
Serial.begin(9600);
}

void loop() {
// delay(1000);
for (readingNumber = 0; readingNumber < numReadings; readingNumber++) {
//get the reading:
analogValues[readingNumber] = analogRead(34);
// increment the counter:
readingNumber++;
}
// sort the array using a bubble sort:
bubbleSort();

// get the middle element:


median = analogValues[numReadings / 2];

// print the results:


// print the array, nicely ASCII-formatted:
Serial.print("Array: [");
for (j = 0; j < numReadings; j++) {
Serial.print(analogValues[j], DEC);
Serial.print (", ");
}
Serial.print("]\r\n");
// average the array:
Serial.print(" Average = ");
Serial.print(averageArray(), DEC);
// Serial.print(averageArray(), DEC);
Serial.print("\tMedian = ");
Serial.print(median, DEC);

Serial.print("\r\n");
delay(1000);
}

// average the values in the array:


int averageArray() {
int total = 0;
int average = 0;
for (i = 0; i< numReadings; i++) {
total = total + analogValues[i];

}
// average = total/(numReadings + 1);
average = total/(numReadings);
//*****************
// if (average == median) {
// Serial.print(" Average = ");
// Serial.print(averageArray(), DEC);
// }
//************
return average;
}

void bubbleSort() {
int out, in, swapper;
for(out=0 ; out < numReadings; out++) { // outer loop
for(in=out; in<(numReadings-1); in++) { // inner loop
if( analogValues[in] > analogValues[in+1] ) { // out of order?
// swap them:
swapper = analogValues[in];
analogValues [in] = analogValues[in+1];
analogValues[in+1] = swapper;
}
}
}
}

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