VAŽNO! Ovdje pročitajte kako se registrirati na forum. Bez registracije, nećete biti u mogućnosti pisati na forumu.

Arduino Mega2560 DS18B20 TFT EKRAN 1.8" MQ135 L298N

Zapeli ste s projektom? Ovdje je pravo mjesto za postaviti pitanje. Imajte na umu da ekipa e-radionice neće uvijek i/ili redovno odgovarati na pitanja postavljena u ovom podforumu.
Odgovorite
mario.devcic#6058
Novak
Novak
Postovi: 3
Pridružen/a: uto lis 19, 2021 7:09 pm

Arduino Mega2560 DS18B20 TFT EKRAN 1.8" MQ135 L298N

Post Postao/la mario.devcic#6058 » uto lis 19, 2021 7:24 pm

Poštovani,
Molim za pomoć pošto mi je programiranje novo ali volim proučavati i potrebno mi je za akvarij...
Uspio sam sklepati dio iz više kodova u jedan, ali fali mi još dodat MQ135 senzor.
Uglavnom radim za akvarij hlađenje, tj. kad temperatura vode pređe 26C da se ventilatori upale, kad se spusti na 24C da s ventilatori ugase, to sam donekle sklepao i trenutno radi na moj način :D
i pokazuje na ekranu trenutnu temperaturu i najnižu i najvišu.
E sad bi volio preporuke tj. poboljšanje koda i kako još u to sve ubaciti MQ135 senzor pošto imam CO2 u slučaju curenja da mi javi (stavio bi onu zujalicu) i da ispisuje na ekranu kvalitetu zraka...
Ovi svi zenzori su kupljeni ovdje i ekran...

Kod: Označite sve

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <L298N.h>

// lcd
#define TFT_CS     53
#define TFT_RST    9
#define TFT_DC     8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);


#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 22

OneWire oneWire(ONE_WIRE_BUS);
float tempMin = 999;
float tempMax = 0;
int barra = 0;
char conta = 0;
DallasTemperature sensors(&oneWire);
DeviceAddress sensor1;

int ENA = 7;
int IN1 = 6;
int IN2 = 5;
int IN3 = 4;
int IN4 = 3;
int ENB = 2;

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

  // Localiza e mostra enderecos dos sensores
  Serial.println("Localizando sensor DS18B20...");
  Serial.print("Foram encontrados ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" sensores.");
  if (!sensors.getAddress(sensor1, 0))
    Serial.println("Sensor nao encontrado !");
  // Mostra o endereco do sensor encontrado no barramento
  Serial.print("Endereco sensor: ");
  mostra_endereco_sensor(sensor1);
  Serial.println();

  //inicializa lcd
  tft.initR(INITR_BLACKTAB);  // You will need to do this in every sketch
  tft.fillScreen(ST7735_BLACK);
  //tft print function!

  tft.setTextColor(ST7735_YELLOW);
  tft.setRotation(3);
  tft.setTextSize(2);
  tft.setCursor(0, 10);
  tft.println(" TEMP  C");

  tft.setTextSize(1);
  tft.setCursor(75, 10);
  tft.println("O");

  tft.setTextColor(ST7735_GREEN);
  tft.setTextSize(2);
  tft.setCursor(0, 40);
  tft.print(" SAD");

  tft.setTextColor(ST7735_BLUE);
  tft.setTextSize(2);
  tft.setCursor(0, 65);
  tft.print(" MIN");

  tft.setTextColor(ST7735_RED);
  tft.setTextSize(2);
  tft.setCursor(0, 90);
  tft.print(" MAX");

  pinMode (ENA, OUTPUT);
  pinMode (ENB, OUTPUT);
  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  pinMode (IN3, OUTPUT);
  pinMode (IN4, OUTPUT);
  
}

void loop() {

  // Le a informacao do sensor
  if (sensors.getAddress(sensor1, 0))
  {
    sensors.requestTemperatures();
    float tempC = sensors.getTempC(sensor1);
    // Atualiza temperaturas minima e maxima
    if (tempC < tempMin)
    {
      tempMin = tempC;
    }
    if (tempC > tempMax)
    {
      tempMax = tempC;
    }
if (tempC > 26){
  analogWrite (ENA, 255);
  analogWrite (ENB, 255);
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  }
  if (tempC < 24){
    analogWrite (ENA, 0);
  analogWrite (ENB, 0);
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, LOW);
  digitalWrite (IN3, LOW);
  digitalWrite (IN4, LOW);
  }

    //  EXIBE NO DISPLAY

    tft.setTextColor(ST7735_GREEN);
    apaga_linha(100, 40);
    tft.setTextSize(2);
    tft.setCursor(100, 40);
    tft.println(tempC, 1);
    //tft.print("C");

    tft.setTextColor(ST7735_BLUE);
    apaga_linha(100, 65);
    tft.setCursor(100, 65);
    tft.println(tempMin, 1);

    tft.setTextColor(ST7735_RED);
    apaga_linha(100, 90);
    tft.setCursor(100, 90);
    tft.println(tempMax, 1);

    tft.setTextColor(ST7735_GREEN);
    tft.setTextSize(1);
    apaga_linha(99, 104);
    tft.setCursor(45, 110);
    tft.print("  SENSOR OK  ");
    if (tempMin > 50)
      tempMin = 999;

  }
  else //(!sensors.getAddress(sensor1, 0))
  {
    tft.setTextColor(ST7735_RED);
    tft.setTextSize(1);
    apaga_linha(99, 104);
    tft.setCursor(45, 110);
    tft.print("  SENSOR  ERRO ");
    tempMin = 999;
    tempMax = 0;
  }

  //delay(1000);
  conta++;
  if (conta == 1)
  {
    tft.setTextSize(1);
    tft.setCursor(45, 110);
    tft.print("               |");
  }
  if  (conta == 2)
  {
    tft.setTextSize(1);
    tft.setCursor(45, 110);
    tft.print("               /");
  }

  if  (conta == 3)
  {
    tft.setTextSize(1);
    tft.setCursor(45, 110);
    tft.print("               -");
  }
  if (conta == 4)
  {
    tft.setTextSize(1);
    tft.setCursor(45, 110);
    tft.print("               \\");
    conta = 1;
  }

  delay(500);
}
void apaga_linha (int16_t x, int16_t y)
{
  tft.fillRect(x, y, 50, 16, ST7735_BLACK);
}

void termo (void)
{

}
void mostra_endereco_sensor(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // Adiciona zeros se necessário
    if (deviceAddress[i] < 16) Serial.print("0");

  }
}
mario.devcic#6058
Novak
Novak
Postovi: 3
Pridružen/a: uto lis 19, 2021 7:09 pm

Re: Arduino Mega2560 DS18B20 TFT EKRAN 1.8" MQ135 L298N

Post Postao/la mario.devcic#6058 » uto lis 19, 2021 9:10 pm

Evo sam malo preuredio i dodao MQ135
Svaki savjet je dobrodošao...

Kod: Označite sve

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <L298N.h>
#include <Wire.h>

// lcd
#define TFT_CS     53
#define TFT_RST    9
#define TFT_DC     8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);


#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 22

OneWire oneWire(ONE_WIRE_BUS);
float tempMin = 999;
float tempMax = 0;
int barra = 0;
char conta = 0;
DallasTemperature sensors(&oneWire);
DeviceAddress sensor1;

int ENA = 7;
int IN1 = 6;
int IN2 = 5;
int IN3 = 4;
int IN4 = 3;
int ENB = 2;

#define calibr 50           //konstanta za kalibraciju
const int A_ulaz = 13;     //Dodjela imena pinovima
const int D_trig = 31; 
const int LED = 12;

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

  // Localiza e mostra enderecos dos sensores
  Serial.println("Localizando sensor DS18B20...");
  Serial.print("Foram encontrados ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" sensores.");
  if (!sensors.getAddress(sensor1, 0))
    Serial.println("Sensor nao encontrado !");
  // Mostra o endereco do sensor encontrado no barramento
  Serial.print("Endereco sensor: ");
  mostra_endereco_sensor(sensor1);
  Serial.println();

  //inicializa lcd
  tft.initR(INITR_BLACKTAB);  // You will need to do this in every sketch
  tft.fillScreen(ST7735_BLACK);
  //tft print function!

  tft.setTextColor(ST7735_YELLOW);
  tft.setRotation(3);
  tft.setTextSize(2);
  tft.setCursor(0, 5);
  tft.println(" TEMP  C");

  tft.setTextSize(1);
  tft.setCursor(75, 5);
  tft.println("O");

  tft.setTextColor(ST7735_GREEN);
  tft.setTextSize(2);
  tft.setCursor(0, 30);
  tft.print(" SAD");

  tft.setTextColor(ST7735_BLUE);
  tft.setTextSize(2);
  tft.setCursor(0, 50);
  tft.print(" MIN");

  tft.setTextColor(ST7735_RED);
  tft.setTextSize(2);
  tft.setCursor(0, 70);
  tft.print(" MAX");

  tft.setTextColor(ST7735_WHITE);
  tft.setTextSize(2);
  tft.setCursor(0, 110);
  tft.print(" ZRAK");

  pinMode (ENA, OUTPUT);
  pinMode (ENB, OUTPUT);
  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  pinMode (IN3, OUTPUT);
  pinMode (IN4, OUTPUT);

pinMode(A_ulaz,INPUT);  //Analogni pin ulaz
pinMode(D_trig,INPUT);    //Digitalni pin ulaz
  pinMode(LED,OUTPUT);    //LEDica izlaz
  
}

void loop() {

  // Le a informacao do sensor
  if (sensors.getAddress(sensor1, 0))
  {
    sensors.requestTemperatures();
    float tempC = sensors.getTempC(sensor1);
    // Atualiza temperaturas minima e maxima
    if (tempC < tempMin)
    {
      tempMin = tempC;
    }
    if (tempC > tempMax)
    {
      tempMax = tempC;
    }
if (tempC >= 26){
  analogWrite (ENA, 255);
  analogWrite (ENB, 255);
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  }
  if (tempC <= 24){
    analogWrite (ENA, 0);
  analogWrite (ENB, 0);
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, LOW);
  digitalWrite (IN3, LOW);
  digitalWrite (IN4, LOW);
  }
                          
  int Sr_vr = 0;          //Srednja vrijednost
  int Q = 0;              //Kalibrirana vrijednost
  int suma = 0;           //Suma mjerenih vrijednosti
  int i;                  //Brojac za for petlju
  int x;                  //Pomocna varijabla
                                                                                                  
  for (i = 0; i < 10; ++i){  //Izmjeri svake pola sekunde vrijednost, 10x
    x = analogRead(13);
    suma += x;             
                      
  }                                            
                                                     
  Sr_vr = suma/10;       //Srednja vrijednost očitavanja
  Q = Sr_vr - calibr;    //Korekcija za preciznost
                                                             
  Serial.print(Q);            
  Serial.println(" PPM");
                                                                                        
  if(Q>750){             //Paljenje alarma ako razina prijeđe dopustenu
    digitalWrite(LED,HIGH); 
  }                                                        
  else{                                                 
    digitalWrite(LED,LOW);   
  }                                             
    //  EXIBE NO DISPLAY

    tft.setTextColor(ST7735_GREEN);
    apaga_linha(100, 30);
    tft.setTextSize(2);
    tft.setCursor(100, 30);
    tft.println(tempC, 1);
    //tft.print("C");

    tft.setTextColor(ST7735_BLUE);
    apaga_linha(100, 50);
    tft.setCursor(100, 50);
    tft.println(tempMin, 1);

    tft.setTextColor(ST7735_RED);
    apaga_linha(100, 70);
    tft.setCursor(100, 70);
    tft.println(tempMax, 1);

tft.setTextColor(ST7735_WHITE);
    apaga_linha(100, 110);
    tft.setCursor(100, 110);
    tft.println(Q, 1);

    tft.setTextColor(ST7735_GREEN);
    tft.setTextSize(1);
    apaga_linha(40, 90);
    tft.setCursor(45, 90);
    tft.print("  SENSOR OK  ");
    if (tempMin > 50)
      tempMin = 999;

  }
  else //(!sensors.getAddress(sensor1, 0))
  {
    tft.setTextColor(ST7735_RED);
    tft.setTextSize(1);
    apaga_linha(40, 90);
    tft.setCursor(45, 90);
    tft.print("  SENSOR  ERRO ");
    tempMin = 999;
    tempMax = 0;
  }

  //delay(1000);
  

  delay(500);
}
void apaga_linha (int16_t x, int16_t y)
{
  tft.fillRect(x, y, 50, 16, ST7735_BLACK);
}


void mostra_endereco_sensor(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // Adiciona zeros se necessário
    if (deviceAddress[i] < 16) Serial.print("0");

  }
}
ivan.fadiga#4726
e-radionica.com team
e-radionica.com team
Postovi: 262
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Osijek

Re: Arduino Mega2560 DS18B20 TFT EKRAN 1.8" MQ135 L298N

Post Postao/la ivan.fadiga#4726 » sri lis 20, 2021 7:31 am

Pozdrav,
Ako ste počeli s programiranjem onda kod sigurno nije najbolji, ali bitno je da Vam radi na ispravan način (kako vi želite) te da nemate nekih grešaka koje bi dovele do beskonačne petlje.
Za MQ135 senzor ima gotovih primjera te vam je tako najbolje da nađete par primjera i probate shvatiti kako oni rade te onda implementirate jedan od njih u svoj kod.
Možda bi Vam bilo dobro podesiti MQ senzor s potenciometrom na željenu vrijednost i onda digitalni pin spojiti na interrupt pin mikrokontrolera te samo na pojavu interrupta paliti zujalicu.
Sigurno će netko drugi pogledati kod i dati Vam par savjeta, jer ja se ne bavim programiranjem pa ne znam baš najbolje i najbrže metode za dobar kod.

LP,
Ivan
mario.devcic#6058
Novak
Novak
Postovi: 3
Pridružen/a: uto lis 19, 2021 7:09 pm

Re: Arduino Mega2560 DS18B20 TFT EKRAN 1.8" MQ135 L298N

Post Postao/la mario.devcic#6058 » sri lis 20, 2021 3:02 pm

Hvala, kod i je preuzet i samo ubačen, nego čisto me zanima neki savjet, jer je sve ubiti copy paste, i dorade neke moje što sam skužio kako ide...
znam da se i može brzina ventilatora prilagodit da se postepeno ubrzavaju/smanjuju...
nekužim baš sa zagradama dali to tako ide ja sam samo lipio jedno ispod drugog.
Odgovorite