ALLAN MILLER SILVA LIMA
Published © Apache-2.0

Lixeira

Projeto da disciplina de redes 2

BeginnerProtip1 hour11
Lixeira

Things used in this project

Hardware components

ESP32S
Espressif ESP32S
Microcontrolador principal do projeto.
×1
Ultrasonic Sensor - HC-SR04 (Generic)
Ultrasonic Sensor - HC-SR04 (Generic)
Sensores de ultrassom para medir o nível de preenchimento e detectar proximidade.
×1
Mini Weight Unit HX711 Module Sensor
M5Stack Mini Weight Unit HX711 Module Sensor
Sensor para medir o peso total do lixo acumulado.
×1
Big Red Dome Button
SparkFun Big Red Dome Button
Botão para o usuário indicar que a lixeira está cheia.
×1
LED (generic)
LED (generic)
Indicadores visuais para informar o estado da lixeira.
×1
Rotary potentiometer (generic)
Rotary potentiometer (generic)
para controlar o nivel de altura do sensor ultrassonico
×1
Resistor 330 ohm
Resistor 330 ohm
para controlar a corrente nos leds
×1

Story

Read more

Code

Lixeira inteligente

C/C++
#include <Arduino.h>
#include <WiFi.h>
#include <FirebaseESP32.h>

// Provide the RTDB payload printing info and other helper functions.
#include <addons/RTDBHelper.h>

/* 1. Define the WiFi credentials */
#define WIFI_SSID "UPE-Estudantes(UnL)"
#define WIFI_PASSWORD "OrgulhodeserUPE"

/* 2. If work with RTDB, define the RTDB URL and database secret */
#define DATABASE_URL "https://lixeira-69163-default-rtdb.firebaseio.com/"
#define DATABASE_SECRET "OBoaTMCgP4AQr2XGL1nnq6a9AgsGzhyvW95C7F29"

/* 3. Define the Firebase Data object */
FirebaseData fbdo;

/* 4, Define the FirebaseAuth data for authentication data */
FirebaseAuth auth;

/* Define the FirebaseConfig data for config data */
FirebaseConfig config;

unsigned long dataMillis = 0;
int count = 0;

int PINO_LED_VERDE = 21;
int PINO_LED_AMARELO = 5;
int PINO_LED_VERMELHO = 19;

void setup() {
    Serial.begin(115200);
    pinMode(BUILTIN_LED, OUTPUT);

    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    Serial.print("Connecting to Wi-Fi");
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(300);
    }
    Serial.println();
    Serial.print("Connected with IP: ");
    Serial.println(WiFi.localIP());
    Serial.println();

    Serial.printf("Firebase Client v%s\n\n", FIREBASE_CLIENT_VERSION);

    /* Assign the certificate file (optional) */
    // config.cert.file = "/cert.cer";
    // config.cert.file_storage = StorageType::FLASH;

    /* Assign the database URL and database secret(required) */
    config.database_url = DATABASE_URL;
    config.signer.tokens.legacy_token = DATABASE_SECRET;

    // Comment or pass false value when WiFi reconnection will control by your code or third party library e.g. WiFiManager
    Firebase.reconnectNetwork(true);

    // Since v4.4.x, BearSSL engine was used, the SSL buffer need to be set.
    // Large data transmission may require larger RX buffer, otherwise connection issue or data read time out can be occurred.
    fbdo.setBSSLBufferSize(4096, 1024); // Define both Rx and Tx buffer sizes

    /* Initialize the library with the Firebase authen and config */
    Firebase.begin(&config, &auth);

    // Or use legacy authenticate method
    // Firebase.begin(DATABASE_URL, DATABASE_SECRET);

    // Inicializa os pinos dos LEDs
    pinMode(PINO_LED_VERDE, OUTPUT);
    pinMode(PINO_LED_AMARELO, OUTPUT);
    pinMode(PINO_LED_VERMELHO, OUTPUT);
}

void loop() {
    if (millis() - dataMillis > 5000) {
        dataMillis = millis();
        int umidade = random() % 100; // Simulação do nível de umidade

        // Defina os limites para cada estado de umidade
        int limite_verde = 70;
        int limite_amarelo = 40;

        // Atualiza o nível de umidade no banco de dados Firebase
        Firebase.setInt(fbdo, "/sala5/umidade", umidade);

        // Verifica o nível de umidade e controla os LEDs
        if (umidade >= limite_verde) {
            // Umidade alta - acende o LED verde
            digitalWrite(PINO_LED_VERDE, HIGH);
            digitalWrite(PINO_LED_AMARELO, LOW);
            digitalWrite(PINO_LED_VERMELHO, LOW);
        } else if (umidade >= limite_amarelo) {
            // Umidade moderada - acende o LED amarelo
            digitalWrite(PINO_LED_VERDE, LOW);
            digitalWrite(PINO_LED_AMARELO, HIGH);
            digitalWrite(PINO_LED_VERMELHO, LOW);
        } else {
            // Umidade baixa - acende o LED vermelho
            digitalWrite(PINO_LED_VERDE, LOW);
            digitalWrite(PINO_LED_AMARELO, LOW);
            digitalWrite(PINO_LED_VERMELHO, HIGH);
        }

        // Lê o estado da luz do Firebase e acende o LED interno de acordo
        bool luz;
        Firebase.getBool(fbdo, "/sala5/luz", &luz);
        digitalWrite(BUILTIN_LED, luz);
    }
}

lixeira

C/C++
#include <Arduino.h>
#include <WiFi.h>
#include <FirebaseESP32.h>

// Definir as credenciais do Wi-Fi
#define WIFI_SSID "UPE-Estudantes(UnL)"
#define WIFI_PASSWORD "OrgulhodeserUPE"

// Definir as credenciais do Firebase
#define DATABASE_URL "https://lixeirainteligente-d0a1f-default-rtdb.firebaseio.com/" // <databaseName>.firebaseio.com or <databaseName>.<region>.firebasedatabase.app
#define DATABASE_SECRET "gkXg8YMeqfiW2Cmgg8c2mshFK5C563pbLp2ZQ5q9"

// Definir pinos e variáveis globais
#define LED_PIN_RED 5
#define LED_PIN_YELLOW 18
#define LED_PIN_GREEN 19
#define TRIG_PIN 2
#define ECHO_PIN 4
#define BUTTON_PIN 12
#define POT_PIN 35

FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
unsigned long dataMillis = 0;
bool alertActive = false;
unsigned long alertStartMillis = 0;

void setup() {
    // Iniciar a comunicação serial
    Serial.begin(115200);

    // Configurar os pinos dos LEDs como saída
    pinMode(LED_PIN_RED, OUTPUT);
    pinMode(LED_PIN_YELLOW, OUTPUT);
    pinMode(LED_PIN_GREEN, OUTPUT);

    // Configurar os pinos do sensor ultrassônico
    pinMode(TRIG_PIN, OUTPUT);
    pinMode(ECHO_PIN, INPUT);

    // Configurar o pino do botão como entrada com pull-up interno
    pinMode(BUTTON_PIN, INPUT_PULLUP);

    // Configurar o pino do potenciômetro como entrada
    pinMode(POT_PIN, INPUT);

    // Conectar ao Wi-Fi
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    Serial.print("Connecting to Wi-Fi");
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(300);
    }
    Serial.println();
    Serial.print("Connected with IP: ");
    Serial.println(WiFi.localIP());
    Serial.println();

    // Configurar o Firebase
    config.database_url = DATABASE_URL;
    config.signer.tokens.legacy_token = DATABASE_SECRET;

    Firebase.reconnectNetwork(true);
    fbdo.setBSSLBufferSize(4096, 4096); // Atualizado para usar dois argumentos
    Firebase.begin(&config, &auth);
}

long getDistance() {
    // Enviar pulso de 10us ao pino TRIG
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);

    // Ler o tempo do pulso ECHO em microsegundos
    long duration = pulseIn(ECHO_PIN, HIGH);

    // Calcular a distância em centímetros
    long distance = duration * 0.034 / 2;

    return distance;
}

void loop() {
    // Verificar se o botão foi pressionado
    if (digitalRead(BUTTON_PIN) == HIGH && !alertActive) {
        alertActive = true;
        alertStartMillis = millis();
        Serial.println("Botão pressionado. Alerta de coleta ativado.");

        // Acender o LED vermelho e enviar estado ao Firebase
        digitalWrite(LED_PIN_RED, HIGH);
        digitalWrite(LED_PIN_YELLOW, LOW);
        digitalWrite(LED_PIN_GREEN, LOW);
        if (Firebase.setString(fbdo, "/luz", "Vermelho aceso (alerta de coleta)")) {
            Serial.println("Estado de alerta enviado para o Firebase com sucesso");
        } else {
            Serial.printf("Falha ao enviar estado de alerta: %s\n", fbdo.errorReason().c_str());
        }
    }

    // Verificar se o alerta está ativo e o tempo de 10 segundos passou
    if (alertActive) {
        if (millis() - alertStartMillis < 10000) {
            return; // Manter o alerta ativo
        } else {
            alertActive = false;
            Serial.println("Alerta de coleta desativado.");
        }
    }

    // Verificar se já se passaram 2 segundos
    if (millis() - dataMillis > 2000) {
        dataMillis = millis();

        // Ler o valor do potenciômetro e mapear para a faixa de distância
        int potValue = analogRead(POT_PIN);
        long maxDistance = map(potValue, 0, 4095, 20, 100); // Mapeando de 20 cm a 100 cm

        // Obter a distância medida pelo sensor ultrassônico
        long distance = getDistance();
        Serial.print("Distância: ");
        Serial.print(distance);
        Serial.print(" cm, MaxDistância: ");
        Serial.print(maxDistance);
        Serial.println(" cm");

        if (Firebase.setString(fbdo, "/distancia", distance)) {
            Serial.println("Distancia enviado para o Firebase com sucesso");
        } else {
            Serial.printf("Falha ao enviar distancia: %s\n", fbdo.errorReason().c_str());
        }

        if (Firebase.setString(fbdo, "/distanciaMax", maxDistance)) {
            Serial.println("distanciaMax enviado para o Firebase com sucesso");
        } else {
            Serial.printf("Falha ao enviar distanciaMax: %s\n", fbdo.errorReason().c_str());
        }

        // Determinar qual LED acender com base na distância
        if (distance <= maxDistance * 0.3) {
            digitalWrite(LED_PIN_RED, HIGH);
            digitalWrite(LED_PIN_YELLOW, LOW);
            digitalWrite(LED_PIN_GREEN, LOW);
            Serial.println("LED Vermelho aceso");
            if (Firebase.setString(fbdo, "/luz", "Vermelho aceso")) {
                Serial.println("Estado enviado para o Firebase com sucesso");
            } else {
                Serial.printf("Falha ao enviar estado: %s\n", fbdo.errorReason().c_str());
            }
            
        } else if (distance <= maxDistance * 0.7) {
            digitalWrite(LED_PIN_RED, LOW);
            digitalWrite(LED_PIN_YELLOW, HIGH);
            digitalWrite(LED_PIN_GREEN, LOW);
            Serial.println("LED Amarelo aceso");
            if (Firebase.setString(fbdo, "/luz", "Amarelo aceso")) {
                Serial.println("Estado enviado para o Firebase com sucesso");
            } else {
                Serial.printf("Falha ao enviar estado: %s\n", fbdo.errorReason().c_str());
            }
        } else {
            digitalWrite(LED_PIN_RED, LOW);
            digitalWrite(LED_PIN_YELLOW, LOW);
            digitalWrite(LED_PIN_GREEN, HIGH);
            Serial.println("LED Verde aceso");
            if (Firebase.setString(fbdo, "/luz", "Verde aceso")) {
                Serial.println("Estado enviado para o Firebase com sucesso");
            } else {
                Serial.printf("Falha ao enviar estado: %s\n", fbdo.errorReason().c_str());
            }
        }


    }
}

Credits

ALLAN MILLER SILVA LIMA
1 project • 0 followers
Thanks to Julio Cesar, João Pedro , and Matheus Melo .

Comments