Arduino + Blynk = Controlador

Ricardo Miranda

Well-Known Member
8 May 2016
320
317
63
42
São Paulo
#1
Ola, eu vou mostrar nesse tópico o meu controlador que eu montei para monitorar a temperatura do aquário.

A minha ideia era criar esse tópico quando as novas pecas que eu comprei no alliexpress chegasse, mais a pedido do grupo do Whats... :)

hoje eu uso para monitorar e controlar a minha temperatura. mais é possível acionar varias funções basta para isso programar...

Software:
No computador eu uso a IDE do Arduino com as bibliotecas do ESP8266 e Blynk.
No Celular o APP Blynk

eu não vou entrar em detalhes, na internet tem muitos tutorias falando com instalar as bibliotecas do blynk e preparar o IDE do arduino para usar o ESP8266

a minha tela do Blynk ficou assim:

WhatsApp Image 2020-04-14 at 11.37.05.jpeg

HARDWARE:

Sensor de temperatura 18b20:
images.jpg

Modulo de rele 4 Saidas :
images (1).jpg


Placa esp8266 nodmcu:

images (2).jpg
LCD 16x2 com modulo i2c:

images (3).jpg


Meu codigo em desvolvimento com 4 saídas de controle
1 para aquecedor
2 para ventilador
3 reposicao
4 timer

Code:
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
// Inicializa o display no endereco 0x27
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3, POSITIVE);
RTC_DS1307 RTC;

int valAnalog ; // variavel para armazenar o valor analogico lido
float temp;
int x = 0;
boolean nstatus = false;

int ano, mes, dia, hora, minuto, segundo ;


int saida1 = 2;
int saida2 = 3;
int saida3 = 4;
int saida4 = 5;

int n1 = A1;
int bt1 = A2;
int bt2 = A3;


void setup() {
  // put your setup code here, to run once:
   Serial.begin(9600); // programa a serial para comunicação em 9600 bps
   analogReference(INTERNAL); // 1,1
   lcd.begin (16,2);
   RTC.begin();
   Wire.begin();
   lcd.setBacklight(HIGH);

   pinMode(saida1, OUTPUT);
   pinMode(saida2, OUTPUT);
   pinMode(saida3, OUTPUT);
   pinMode(saida4, OUTPUT);
   pinMode(n1, INPUT_PULLUP);
   pinMode(bt1, INPUT_PULLUP);
   pinMode(bt2, INPUT_PULLUP);
 
   digitalWrite(saida1, HIGH);  // desligado reles
   digitalWrite(saida2, HIGH);
   digitalWrite(saida3, HIGH);
   digitalWrite(saida4, HIGH);
   lcd.setCursor(0,1);
   lcd.print("S:0000");
 
}

void loop() {
  // put your main code here, to run repeatedly:
   DateTime now = RTC.now();
   temperatura();
   digitalClock();
   termostato();
   nivel();
   tempo();
   acertahora();
 

}


void temperatura() {

   for(int x = 0; x < 500; x++){ // o loop faz 200 leituras para diminuir os erros
  valAnalog = analogRead(0); // Le o pino de entrada analogica 0
  temp = temp + valAnalog;
  }

  temp = temp * ( 1.1 /  1024 * 100 ) / 500;
  lcd.setCursor(6,0);
  lcd.print("T:");
  lcd.print(temp,1);
 
   
}

char digitalClock() {  
    DateTime now = RTC.now();
    lcd.setCursor(0,0);
    if (now.hour() < 10) lcd.print('0');
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    if (now.minute() < 10) lcd.print('0');
    lcd.print(now.minute(), DEC);
 
}

void termostato(){

    if (temp < 24.5 ) {
      digitalWrite(saida1, LOW); // LIGA rele
      lcd.setCursor(2,1);
      lcd.print("1");
      }
    if (temp > 25.0) {
      digitalWrite(saida1, HIGH); // Desliga rele
      lcd.setCursor(2,1);
      lcd.print("0");
     
    }

     if (temp > 27) {
      digitalWrite(saida2, LOW); // LIGA rele
      lcd.setCursor(3,1);
      lcd.print("1");
      }
    if (temp < 26.5) {
      digitalWrite(saida2, HIGH); // DESLIGA rele
      lcd.setCursor(3,1);
      lcd.print("0");
      }

}

void nivel() {

  int sensorVal = digitalRead(n1);
  lcd.setCursor(13,0);
  lcd.print("N:");
  lcd.print(sensorVal);
  lcd.setCursor(4,1);
  lcd.print(x);

  if(sensorVal == LOW && nstatus == true) nstatus = false;

  if (sensorVal == HIGH && nstatus == false ) {
     digitalWrite(saida3, LOW); // LIGA RELE
     delay(1000);
      do {
         int sensorVal = digitalRead(n1);
         delay(1000);
         if (x > 8 ) {
         nstatus = true;
         break;
         }
         x = x + 1;  
             
    }while (sensorVal = LOW) ;
     
  }else {        
        digitalWrite(saida3, HIGH); // DESLIGA RELE
        if (nstatus == false ) {
          x = 0 ;
        }
        else {
          lcd.setCursor(4,1);
          lcd.print("E");
        }
  }  }

void tempo() {

    DateTime now = RTC.now();
    hora = now.hour(), DEC;
    minuto = now.minute(), DEC;
    if (hora >= 1 && hora <= 16  ) {
    lcd.setCursor(5,1);
    lcd.print("1");
    digitalWrite(saida4, LOW);
  }else {
    lcd.setCursor(5,1);
    lcd.print("0");
    digitalWrite(saida4, HIGH);
  }

}

void acertahora(){
   DateTime now = RTC.now();
   hora = now.hour(), DEC;
   minuto = now.minute(), DEC;
    int botao2Val = digitalRead(bt2);
    int botao1Val = digitalRead(bt1);

  if (botao1Val == LOW) {
   hora = hora + 1 ;
   delay(500);
   if (hora >= 24) hora = 0;
   }

if (botao2Val == LOW) {
   minuto = minuto + 1 ;
   delay(200);
   if (minuto >= 59) minuto = 0;
   }
 
   RTC.adjust(DateTime(ano, mes, dia, hora, minuto, segundo));

}
 

Ricardo Miranda

Well-Known Member
8 May 2016
320
317
63
42
São Paulo
#2
Faltou o codigo que uso atualmente para controlar a temperatura.

Code:
// data 31/01/2020
// data 07/02/2020 modificado para placa  ESP_01
//
//

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include<DallasTemperature.h>
#define ONE_WIRE_BUS 0 // GPIO_0  DS18B20 on arduino pin2 corresponds to D4 on physical board

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);

int Ventilador = 1; // GPIO_1  D1- porta que esta ligado o Ventilador
int Aquecedor = 3 ; // GPIO_3  D2- porta que esta ligado o Aquecedor
float temp;
WidgetLED led1(V1);
WidgetLED led2(V2);

/* TIMER */
#include <SimpleTimer.h>
SimpleTimer timer;

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "eu seu token do blynk";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "sua rede WIFI";
char pass[] = "Senha Wifi";


void setup()
{
  // Debug console
 // Serial.begin(9600);

//  Serial.println();
//  Serial.print("Connecting to ");
//  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);

  delay(1000);
  //Serial.println("IP address: ");
  //Serial.println(WiFi.localIP());
    
  //Blynk.begin(auth, ssid, pass);
  Blynk.config(auth);
 
  DS18B20.begin();

 timer.setInterval(1000L, getSendData);
 
  pinMode(Aquecedor, OUTPUT);
  pinMode(Ventilador, OUTPUT);
  digitalWrite(Ventilador,LOW);
  digitalWrite(Aquecedor,LOW);
   }

void loop()
{

delay(1000);
 timer.run();
 Blynk.run();
 
 if ( temp > 27.00 &&  temp < 40.00 ) {
    digitalWrite(Ventilador,HIGH);
    led2.on();
 }
  if ( temp < 26.50 || temp > 40.00 ){
    digitalWrite(Ventilador,LOW);
    led2.off();
    
  }
 
  if ( temp < 24.50 && temp > 5.00 ) {
    digitalWrite(Aquecedor,HIGH);
    led1.on();
  }
    if ( temp > 25.00 ) {
      digitalWrite(Aquecedor,LOW);
      led1.off();
      
    }
  
}
/***************************************************
 * Send Sensor data to Blynk
 **************************************************/
void getSendData()
{
 DS18B20.requestTemperatures();
 temp = DS18B20.getTempCByIndex(0);
 //Serial.println(temp);
 Blynk.virtualWrite(10, temp); //virtual pin V10

}
 

Membros que estão vendo este Thread (Membros: 0, Convidados: 1)

Top Bottom