Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso 2020/2021
1. Introducción.................................................................................................................. 3
2. Esquemas ...................................................................................................................... 5
3. Código ........................................................................................................................... 8
3.5.1 RPi_MQTT_Temperature............................................................................... 27
3.5.4 RPi_all.sh........................................................................................................ 30
Tabla de figuras
Figura 1. Sistema Arduino................................................................................................. 5
Figura 2. Sistema ESP32-CAM........................................................................................... 5
Figura 3. Sistema ESP32. ................................................................................................... 6
Figura 4. Sistema ESP32TTL LoRa OLED. ........................................................................... 6
Figura 5. Sistema Raspberry Pi. ........................................................................................ 7
2
1. Introducción
Para cerrar la asignatura, hemos realizado el proyecto final, que comprende desde
los conocimientos asimilados con Arduino, hasta Firebase, integrándolos en un sistema
de IoT.
3
temperatura, teniendo un led verde si la temperatura es adecuada, y un led
rojo si no lo es.
4
2. Esquemas
5
Figura 3. Sistema ESP32.
6
Figura 5. Sistema Raspberry Pi.
7
3. Código
3.1 Arduino
/* ArduinoBlocks.com */
#include <Wire.h>
#include "ABlocks_LiquidCrystal_I2C.h"
double full;
double now;
double prev;
double delay2;
LiquidCrystal_I2C lcd(0x27,16,2);
digitalWrite(_t, LOW);
delayMicroseconds(5);
digitalWrite(_t, HIGH);
delayMicroseconds(10);
digitalWrite(_t, LOW);
return (dur/57);
void setup()
8
lcd.begin();lcd.noCursor();lcd.backlight();
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, INPUT);
pinMode(2, OUTPUT);
pinMode(3, INPUT);
full = 100;
now = 0;
delay2 = 200;
prev = 0;
analogWrite(9,0);analogWrite(10,153);analogWrite(11,0);
void loop()
if ((prev != now)) {
Serial.println(now);
prev = now;
lcd.setCursor(0, 0);
lcd.print(String("Aforo:"));
9
lcd.setCursor(7, 0);
lcd.print((long)(now));
lcd.setCursor(0, 1);
lcd.print(String("Aforo max:"));
lcd.setCursor(11, 1);
lcd.print((long)(full));
lcd.clear();
analogWrite(9,255);analogWrite(10,255);analogWrite(11,255);
delay(delay2);
analogWrite(9,0);analogWrite(10,153);analogWrite(11,0);
lcd.clear();
lcd.clear();
lcd.setCursor(0, 1);
lcd.print(String("Aforo completo"));
analogWrite(9,255);analogWrite(10,255);analogWrite(11,255);
delay(delay2);
analogWrite(9,255);analogWrite(10,0);analogWrite(11,0);
lcd.clear();
10
}
lcd.clear();
analogWrite(9,255);analogWrite(10,255);analogWrite(11,255);
delay(delay2);
analogWrite(9,51);analogWrite(10,204);analogWrite(11,0);
lcd.clear();
analogWrite(9,255);analogWrite(10,255);analogWrite(11,255);
delay(delay2);
analogWrite(9,51);analogWrite(10,204);analogWrite(11,0);
now = 0;
3.2 ESP32-CAM
#include "esp_camera.h"
#include <WiFi.h>
#include "esp_timer.h"
#include "img_converters.h"
11
#include "Arduino.h"
#include "fb_gfx.h"
#include "esp_http_server.h"
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
12
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
camera_fb_t * fb = NULL;
size_t _jpg_buf_len = 0;
char * part_buf[64];
if(res != ESP_OK){
return res;
while(true){
fb = esp_camera_fb_get();
if (!fb) {
res = ESP_FAIL;
} else {
13
if(fb->width > 400){
if(fb->format != PIXFORMAT_JPEG){
esp_camera_fb_return(fb);
fb = NULL;
if(!jpeg_converted){
res = ESP_FAIL;
} else {
_jpg_buf_len = fb->len;
_jpg_buf = fb->buf;
if(res == ESP_OK){
if(res == ESP_OK){
if(res == ESP_OK){
14
res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY,
strlen(_STREAM_BOUNDARY));
if(fb){
esp_camera_fb_return(fb);
fb = NULL;
_jpg_buf = NULL;
} else if(_jpg_buf){
free(_jpg_buf);
_jpg_buf = NULL;
if(res != ESP_OK){
break;
//Serial.printf("MJPG: %uB\n",(uint32_t)(_jpg_buf_len));
return res;
void startCameraServer(){
config.server_port = 80;
httpd_uri_t index_uri = {
.uri = "/",
15
.method = HTTP_GET,
.handler = stream_handler,
.user_ctx = NULL
};
httpd_register_uri_handler(stream_httpd, &index_uri);
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(false);
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
16
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
if(psramFound()){
config.frame_size = FRAMESIZE_UXGA;
config.jpeg_quality = 10;
config.fb_count = 2;
} else {
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 12;
config.fb_count = 1;
if (err != ESP_OK) {
17
return;
// Wi-Fi connection
WiFi.begin(ssid, password);
delay(500);
Serial.print(".");
Serial.println("");
Serial.println("WiFi connected");
Serial.print(WiFi.localIP());
startCameraServer();
void loop() {
delay(1);
3.3 ESP32-MQTT-TEMP
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <TFT_eSPI.h>
18
#include <SPI.h>
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
tft.init();
tft.setRotation(1);
mlx.begin();
19
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
delay(500);
Serial.print(".");
Serial.println("");
Serial.println("WiFi connected");
Serial.println(WiFi.localIP());
Serial.print(topic);
String messageTemp;
20
Serial.print((char)message[i]);
messageTemp += (char)message[i];
Serial.println();
void reconnect() {
while (!client.connected()) {
// Attempt to connect
if (client.connect("ESP32Client")) {
Serial.println("connected");
// Subscribe
client.subscribe("esp32/output");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
delay(5000);
21
void loop() {
// Temperature in Celsius
if (!client.connected()) {
reconnect();
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_WHITE, TFT_BLACK);
if(temperature<38){
tft.setTextColor(TFT_GREEN, TFT_BLACK);
else{
tft.setTextColor(TFT_RED, TFT_BLACK);
tft.drawString("Temperature:",1,1,4);
delay(2000);
22
client.loop();
lastMsg = now;
char tempString[8];
dtostrf(temperature, 1, 2, tempString);
Serial.print("Temperature: ");
Serial.println(tempString);
client.publish("esp32/temperature", tempString);
3.4 ESP32-WebService
try:
except:
import socket
import network
import esp
esp.osdebug(None)
import gc
gc.collect()
ssid = 'TP-LINK_IRENE'
23
password = '030120161973'
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
pass
print('Connection successful')
print(station.ifconfig())
# ESP32 GPIO 26
adc0=ADC(Pin(36))
adc1=ADC(Pin(39))
state = 0
def web_page():
if relay.value() == 0:
relay_state = ''
else:
relay_state = 'checked'
if state == 0:
dispenser_state="EMPTY"
if state == 1:
dispenser_state=">50%"
24
if state == 2:
dispenser_state = "50%-100%"
.switch{position:relative;display:inline-block;width:120px;height:68px}.switch
input{display:none}
.slider{position:absolute;top:0;left:0;right:0;bottom:0;background-color:#ccc;border-
radius:34px}
.slider:before{position:absolute;content:"";height:52px;width:52px;left:8px;bottom:8p
x;background-color:#fff;-webkit-transition:.4s;transition:.4s;border-radius:68px}
input:checked+.slider{background-color:#2196F3}
input:checked+.slider:before{-webkit-transform:translateX(52px);-ms-
transform:translateX(52px);transform:translateX(52px)}
<h1>Hydrogel Dispenser</h1>
</span></label></body></html>""" % (relay_state)
return html
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.1.179', 80))
25
s.listen(5)
while True:
try:
gc.collect()
conn.settimeout(3.0)
request = conn.recv(1024)
conn.settimeout(None)
request = str(request)
relay_on = request.find('/?relay=on')
relay_off = request.find('/?relay=off')
if relay_on == 6:
print('RELAY ON')
relay.value(1)
if relay_off == 6:
print('RELAY OFF')
relay.value(0)
level50 = adc0.read()
level0 = adc1.read()
26
state = 0
state = 1
state = 2
print(state)
response = web_page()
conn.send('Content-Type: text/html\n')
conn.send('Connection: close\n\n')
conn.sendall(response)
conn.close()
except OSError as e:
conn.close()
print('Connection closed')
3.5 Raspberry Pi
3.5.1 RPi_MQTT_Temperature
import paho.mqtt.client as mqtt
import json
import serial
27
firebase = firebase.FirebaseApplication('https://proyectofinaliot-f694d-default-
rtdb.firebaseio.com', None)
TOPIC = 'esp32/temperature'
client.subscribe(TOPIC)
temp = msg.payload.decode('utf-8')
else:
client = mqtt.Client()
try:
client.loop_forever()
except KeyboardInterrupt:
28
pass
finally:
pass
3.5.2 RPi_SERIAL_Capacity
import serial
firebase = firebase.FirebaseApplication('https://proyectofinaliot-f694d-default-
rtdb.firebaseio.com', None)
while True:
cap = ser.readline()
3.5.3 RPi_Response
import RPi.GPIO as GPIO
firebase = firebase.FirebaseApplication('https://proyectofinaliot-f694d-default-
rtdb.firebaseio.com', None)
GPIO.setmode(GPIO.BCM)
29
GPIO.setwarnings(False)
try:
while True:
floatTemp = float(temp)
print(float(temp))
else:
except KeyboardInterrupt:
GPIO.cleanup()
3.5.4 RPi_all.sh
python3 RPi_SERIAL_Capacity.py $
python3 RPi_MQTT_Temperature.py $
python3 RPi_Response.py $
30