Arduino - Contrapressão V2

 /*Wilson R Bueno 06 06 2023

 * Projeto Medidor Contrapressão 

 * Display IC2

 * Shield Ethernet e Cartão SD

 * V0.0 - base

 * V0.1 - retirando cartão ultrasson

 * V0.2 - gravando no cartão

 * V0.3 - Mesclando com o programa Enxugamento v13 NV

 * V1.0 - Funcional Base Enxugamento V13 NV

 * V2 - Adicionando teclado do programa Controle de Acesso

*/


#include <Wire.h>

#include "RTClib.h" //biblioteca do RTC

#include "max6675.h" // biblioteca do shield max6675

#include <SPI.h> // biblioteca comunicação serial

#include <SD.h> // biblioteca cartão SD

#include <LiquidCrystal_I2C.h>

#include <Ethernet.h>

#include <Password.h> // Biblioteca utilizada para controle de senha

#include <Keypad.h> // Biblioteca para controle do teclado de matrizes


const byte LINHAS = 4; // Linhas do teclado

const byte COLUNAS = 5; // Colunas do teclado


Password senha = Password( "1147" ); // Senha utilizada para liberacao


const int PINO_LED_VERMELHO = 11; // LED vermelho conectado ao pino 11

const int PINO_LED_VERDE = 10; // LED verde conectado ao pino 10


const char TECLAS_MATRIZ[LINHAS][COLUNAS] = { // Matriz de caracteres (mapeamento do teclado)

  {'7', '8', '9', 'U', 'C'},

  {'4', '5', '6', 'D', 'S'},

  {'1', '2', '3', 'O', 'F'},

  {'*', '0', 'E', 'P', 'R'}

};


const byte PINOS_LINHAS[LINHAS] = {23, 25, 27, 29}; // Pinos de conexao com as linhas do teclado

const byte PINOS_COLUNAS[COLUNAS] = {31, 33, 35, 37, 39}; // Pinos de conexao com as colunas do teclado


Keypad teclado_personalizado = Keypad(makeKeymap(TECLAS_MATRIZ), PINOS_LINHAS, PINOS_COLUNAS, LINHAS, COLUNAS); // Inicia teclado



//Array of bytes - grade (°) special caracter

  byte slash[8]= { 

    B01100,  // B stands for binary formatter and the 5 numbers are the pixels

    B10010,

    B01100,

    B00000,

    B00000,

    B00000,

    B00000,

    B00000,

  };


const int lederroPin = 53;   

const int record = 13;   


//Inicializa o display no endereco 0x27

  LiquidCrystal_I2C lcd(0x27,16,2);


//RTC

  RTC_DS1307 rtc;

  char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};


//LCD millis time base

  unsigned long millisdisplaytime = millis();

     

//Open file on SD card

  File logfile;


//Shield Ethernet Definicoes de IP, mascara de rede e gateway

  byte mac[] = {

    0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

  IPAddress ip(10,10,10,200);          //Define o endereco IP

  IPAddress gateway(192,168,10,69);     //Define o gateway

  IPAddress subnet(255, 255, 255, 0); //Define a máscara de rede

//Inicializa o servidor web na porta 80

  EthernetServer server(80);

 

void error(char *str)  {

   Serial.print("error: ");

   Serial.println(str);

   while(1);

   }


//Thermocouples modules max6675

  //1st thermocouple

  int so1Pin = 22;// SO=Serial Out do shield termopar

  int cs1Pin = 24;// CS = chip select CS pin do shield termopar

  int sck1Pin = 26;// SCK = Serial Clock pin do shield termopar

  //2nd thermocouple

  int so2Pin = 28;// SO=Serial Out do shield termopar

  int cs2Pin = 30;// CS = chip select CS pin do shield termopar

  int sck2Pin = 32;// SCK = Serial Clock pin do shield termopar

  //3rd thermocouple

  int so3Pin = 34;// SO=Serial Out do shield termopar

  int cs3Pin = 36;// CS = chip select CS pin do shield termopar

  int sck3Pin = 38;// SCK = Serial Clock pin do shield termopar

  //4th thermocouple

  int so4Pin = 40;// SO=Serial Out do shield termopar

  int cs4Pin = 42;// CS = chip select CS pin do shield termopar

  int sck4Pin = 44;// SCK = Serial Clock pin do shield termopar


  //MAX6675 instance

    MAX6675 robojax1(sck1Pin, cs1Pin, so1Pin);

    MAX6675 robojax2(sck2Pin, cs2Pin, so2Pin);

    MAX6675 robojax3(sck3Pin, cs3Pin, so3Pin);

    MAX6675 robojax4(sck4Pin, cs4Pin, so4Pin);

/*

//Analogic channels for Time to Dry

  int correcao=204.7; // correção para mostrar em tensão

  float entradaA8 = 8; // variável que define que a porta A8 é flutuante

  float entradaA9 = 9; // variável que define que a porta A9 é flutuante

  float entradaA10 = 10; // variável que define que a porta A10 é flutuante

  float entradaA11 = 11; // variável que define que a porta A11 é flutuante

  float entradaA12 = 12; // variável que define que a porta A12 é flutuante

  float entradaA13 = 13; // variável que define que a porta A13 é flutuante

  float entradaA14 = 14; // variável que define que a porta A13 é flutuante

  float entradaA15 = 15; // variável que define que a porta A13 é flutuante  


//Variáveis para serial e cartão (*)

  float val1 = 0; //variável que guarda o valor lido na analógica

  float val2 = 0; //variável que guarda o valor lido na analógica

  float val3 = 0; //variável que guarda o valor lido na analógica

  float val4 = 0; //variável que guarda o valor lido na analógica

  float val5 = 0; //variável que guarda o valor lido na analógica

  float val6 = 0; //variável que guarda o valor lido na analógica

  float val7 = 0; //variável que guarda o valor lido na analógica

  float val8 = 0; //variável que guarda o valor lido na analógica


//Variáveis para LCD

  int val10 = 0; //variável que guarda o valor lido na analógica

  int val11 = 0; //variável que guarda o valor lido na analógica

  int val12 = 0; //variável que guarda o valor lido na analógica

  int val13 = 0; //variável que guarda o valor lido na analógica

  int val14 = 0; //variável que guarda o valor lido na analógica

  int val15 = 0; //variável que guarda o valor lido na analógica

  int val16 = 0; //variável que guarda o valor lido na analógica

  int val17 = 0; //variável que guarda o valor lido na analógica

*/


//Serial date for PLX-DAQ Excel files

  int ROW = 0; 

  int LABEL = 1;


//loop do STARTING no LCD

int x = 1;


//============================================================================

void setup() {


  //Set up the LCD's number of columns and rows:

    lcd.begin(16, 2); //4 linhas por causa dos menus

    lcd.createChar(7, slash); // Create a custom character for use on the LCD. Up to eight characters of 5x8 pixels are supported

     

  //Alimentação Led de erro

    pinMode (lederroPin, OUTPUT); // VCC


  //Alimentação Led de gravaçãoerro

    pinMode (record, OUTPUT); // VCC

 

  //inicialização serial

    Serial.begin(9600); //inicialização serial

   // Serial.println("CLEARDATA"); // reset da comunicação serial

    Serial.println("LABEL,Time,val1,val2,val3,val4,val5,val6,val7,val8,Temp1,Temp2,Temp3,Temp4,ROW"); // nomeia as colunas


  pinMode(PINO_LED_VERMELHO, OUTPUT); // Define pino 10 como saida

  pinMode(PINO_LED_VERDE, OUTPUT); // Define pino 11 como saida


  digitalWrite(PINO_LED_VERDE, LOW); // LED Verde apagado

  digitalWrite(PINO_LED_VERMELHO, LOW); // LED Vermelho apagado

  

/*

 if (! rtc.begin()) {

    Serial.println("Couldn't find RTC");

    while (1);

  }


  if (! rtc.isrunning()) {

    Serial.println("RTC is NOT running!");

  }

  

  // following line sets the RTC to the date & time this sketch was compiled

    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

    // This line sets the RTC with an explicit date & time, for example to set

    // June 6, 2023 at 3am you would call:

      //rtc.adjust(DateTime(2023, 6, 6, 14, 23, 0));

*/

//Inicialização LCD    

  lcd.init();


//Inicializa a interface de rede

  Ethernet.begin(mac, ip, gateway, subnet);

  server.begin();


/*

//Mostra projeto e versão no display

  lcd.clear();

  lcd.setBacklight(HIGH);

  lcd.setCursor(0,0);

  lcd.print("CONTRAPRESSAO");

  lcd.setCursor(0,1);

  lcd.print("      V1.0");

  delay(3000);  

*/


//Inicialização do cartão SD

  Serial.print("Initializing SD card...");


  if (!SD.begin(4)) {

    Serial.println("initialization failed!");

    digitalWrite(lederroPin, HIGH);   // turn the LED on (HIGH is the voltage level)

      lcd.clear();

      lcd.setBacklight(HIGH);

      lcd.setCursor(3, 0);

      lcd.print("* FAIL ON *");

      lcd.setCursor(3, 1);

      lcd.print("* SD CARD *");

    

    while (1);

  }

  Serial.println("initialization done.");


  

  char caracter;

  DateTime now = rtc.now();

     

    //Create a new file sequencial on SD card

     // char filename[] = "LogFil00.TXT";

      char filename[] = "LOGGER00.TXT";

      for (uint8_t i = 0; i < 1000; i++) 

      {

      filename[6] = i/10 + '0';

      filename[7] = i%10 + '0';

        if (! SD.exists(filename)) {

        // only open a new file if it doesn't exist

        logfile = SD.open(filename, FILE_WRITE); 

        digitalWrite(lederroPin, LOW);    // turn the LED off by making the voltage LOW

            

        //loop para correr o STARTING

          while (x<=17) {

            lcd.clear();

            lcd.setBacklight(HIGH);

            lcd.setCursor(3, 0);

            lcd.print("R&D MARELLI");

            lcd.print(" ");

            lcd.setCursor(x, 1);

            lcd.print("START V2.1-Jun23");

            //lcd.print("STARTING =|:)");

            delay(300);

            x++;

            }

            x = 0;

        

        break;  // leave the loop!

        }

       }

    

        if (! logfile) {

          error("couldnt create file");

          Serial.println("Fail to create file");

          lcd.clear();

          lcd.setCursor(3, 0);

          lcd.print("* FAIL ON *");

          lcd.setCursor(3, 1);

          lcd.print("* SD CARD *");

          digitalWrite(lederroPin, HIGH);   // turn the LED on (HIGH is the voltage level)

          }

          Serial.print("Logging to: ");

          Serial.println(filename);


  //Relógio RTC

      if (! rtc.begin()) {

        Serial.println("Couldn't find RTC");

        lcd.clear();

        lcd.setCursor(3, 0);

        lcd.print("* FAIL ON *");

        lcd.setCursor(7, 1);

        lcd.print("* RTC *");

        digitalWrite(lederroPin, HIGH);   // turn the LED on (HIGH is the voltage level)

      

      while (1);

        }

      if (! rtc.isrunning()) {

        Serial.println("RTC is NOT running!");

        lcd.clear();

        lcd.setCursor(3, 0);

        lcd.print("* FAIL ON *");

        lcd.setCursor(7, 1);

        lcd.print("* RTC *");

        digitalWrite(lederroPin, HIGH);   // turn the LED on (HIGH is the voltage level)

        

        }

     

     // Ajuste data e hora - following line sets the RTC to the date & time this sketch was compiled

         //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

     // This line sets the RTC with an explicit date & time, for example to set

     // January 21, 2014 at 3am you would call:

        //rtc.adjust(DateTime(2020, 12, 30, 11, 41, 0));

        

//===================================================================    

void loop(void){


  char leitura_teclas = teclado_personalizado.getKey(); // Atribui a variavel a leitura do teclado

  

  if(leitura_teclas){ // Se alguma tecla foi pressionada


/*

lcd.setCursor(0,1);

  lcd.print(leitura_teclas);

*/

    if(leitura_teclas == 'O'){ // Se a tecla 'Ok Finalizar' foi pressionada

      

      if(senha.evaluate()){ // Verifica se a senha digitada esta correta

        

        Serial.println("Senha confirmada!"); // Exibe a mensagem que a senha esta correta

        for(int i = 0; i < 5; i++){ // Pisca o LED 5 vezes rapidamente

          digitalWrite(PINO_LED_VERDE, HIGH);

          delay(50);

          digitalWrite(PINO_LED_VERDE, LOW);

          delay(50);

          

        }

      } else { // Caso a senha esteja incorreta

        

        Serial.println("Senha incorreta!"); // Exibe a mensagem que a senha esta errada

        for(int i = 0; i < 5; i++){ // Pisca o LED 5 vezes rapidamente

          digitalWrite(PINO_LED_VERMELHO, HIGH);

          delay(50);

          digitalWrite(PINO_LED_VERMELHO, LOW);

          delay(50);

          

        }

      }

      

      senha.reset(); // Limpa a variavel senha

      

    } else { // Caso outra tecla tenha sido pressionada

      

      Serial.println(leitura_teclas); // Exibe a tecla pressionada

      senha.append(leitura_teclas); // Salva o valor da tecla pressionada na variavel senha

      

    }

  }

  //char caracter;

  DateTime now = rtc.now();


/*

    val1 = analogRead(entradaA8); // faz a leitura da entrada A8

    val2 = analogRead(entradaA9); // faz a leitura da entrada A9

    val3 = analogRead(entradaA10); // faz a leitura da entrada A10

    val4 = analogRead(entradaA11); // faz a leitura da entrada A11

    val5 = analogRead(entradaA12); // faz a leitura da entrada A12

    val6 = analogRead(entradaA13); // faz a leitura da entrada A13

    val7 = analogRead(entradaA14); // faz a leitura da entrada A14

    val8 = analogRead(entradaA15); // faz a leitura da entrada A15


    val10 = analogRead(entradaA8); // faz a leitura da entrada A8

    val11 = analogRead(entradaA9); // faz a leitura da entrada A9

    val12 = analogRead(entradaA10); // faz a leitura da entrada A10

    val13 = analogRead(entradaA11); // faz a leitura da entrada A11

    val14 = analogRead(entradaA12); // faz a leitura da entrada A12

    val15 = analogRead(entradaA13); // faz a leitura da entrada A13

    val16 = analogRead(entradaA14); // faz a leitura da entrada A14

    val17 = analogRead(entradaA15); // faz a leitura da entrada A15

*/  

  //Condicionais

    //if (entradaA8 < 370) {

    //val1 = 800; }


      

  //Dados via serial

    ROW++; //Excel lines increment 

    Serial.print("DATA,TIME,"); // inicia a impressão de dados, sempre iniciando

  /*

    Serial.print(val1 / correcao);

    Serial.print(",");

    Serial.print(val2 / correcao);

    Serial.print(",");

    Serial.print(val3 / correcao);

    Serial.print(",");

    Serial.print(val4 / correcao);

    Serial.print(",");

    Serial.print(val5 / correcao);

    Serial.print(",");

    Serial.print(val6 / correcao);

    Serial.print(",");

    Serial.print(val7 / correcao);

    Serial.print(",");

    Serial.print(val8 / correcao);

    Serial.print(",");

    Serial.print(robojax1.readCelsius()); // termopar 1

    Serial.print(",");

    Serial.print(robojax2.readCelsius()); // termopar 2

    Serial.print(",");

    Serial.print(robojax3.readCelsius()); // termopar 3

    Serial.print(",");

    Serial.print(robojax4.readCelsius()); // termopar 4

    Serial.print(",");

    */

    Serial.println(ROW);

    

  //SD Card

    

    digitalWrite(record, HIGH);   // turn the LED on (HIGH is the voltage level)

     

    logfile.print(now.day(), DEC);

    logfile.print('/');

    logfile.print(now.month(), DEC);

    logfile.print('/');

    logfile.print(now.year(), DEC);

    //logfile.print(" (");

    //logfile.print(daysOfTheWeek[now.dayOfTheWeek()]);

    //logfile.print(") ");

    logfile.print(" , ");

    logfile.print(now.hour(), DEC);

    logfile.print(':');

    logfile.print(now.minute(), DEC);

    logfile.print(':');

    logfile.print(now.second(), DEC);

    logfile.print(" , ");

    //logfile.print(m/1000);           // milliseconds since start

    logfile.print(" , ");

  //  logfile.print(val1 / correcao);

    logfile.print(" , ");

  //  logfile.print(val2 / correcao);

    logfile.print(" , ");

 //   logfile.print(val3 / correcao);

    logfile.print(" , ");

 //   logfile.print(val4 / correcao);

    logfile.print(" , ");

 //   logfile.print(val5 / correcao);

    logfile.print(" , "); 

 //   logfile.print(val6 / correcao);

    logfile.print(" , "); 

//    logfile.print(val7 / correcao);

    logfile.print(" , ");

 //   logfile.print(val8 / correcao);

    logfile.print(" , ");

    logfile.print(robojax1.readCelsius());

    logfile.print(" , ");

    logfile.print(robojax2.readCelsius());

    logfile.print(" , ");

    logfile.print(robojax3.readCelsius());

    logfile.print(" , ");

    logfile.print(robojax4.readCelsius());

    logfile.println(" , ");

   digitalWrite(record, LOW);   // turn the LED on (HIGH is the voltage level)  

   // if ((millis() - syncTime) < SYNC_INTERVAL) return; {

       // syncTime = millis();

       // }

    // blink LED to show we are syncing data to the card & updating FAT!

        delay(400);

         

         

         //LCD

    displaytime();

        

 logfile.flush();


}


//To speed up the recording of file on SD card


void displaytime(){

  

  DateTime now = rtc.now();  

  if((millis() - millisdisplaytime) < 800){

/*    

    //LCD page 1  

      lcd.clear();

      lcd.setCursor(1, 0);

//      lcd.print(val10 / correcao);

      lcd.print(".0 ");

  //    lcd.print(val11 / correcao);

      lcd.print(".0 ");

    //  lcd.print(val12 / correcao);

      lcd.print(".0 ");

  //    lcd.print(val13 / correcao);

      lcd.print(".0 ");

      

      lcd.setCursor(1, 1);

   //   lcd.print(val14 / correcao);

      lcd.print(".0 ");

   //   lcd.print(val15 / correcao);

      lcd.print(".0 ");      

   //   lcd.print(val16 / correcao);

      lcd.print(".0 ");

   //   lcd.print(val17 / correcao);

      lcd.print(".0 ");


     

     }

     else {

       

     //LCD page 2  

      lcd.clear();

      lcd.setCursor(0, 0);

            lcd.print(robojax1.readCelsius()); // termopar 1

      lcd.write(7); // Writes a character to the LCD

      lcd.print("C  ");

      lcd.print(robojax2.readCelsius()); // termopar 1

      lcd.write(7); // Writes a character to the LCD

      lcd.print("C ");

      lcd.setCursor(0, 1);

      lcd.print(robojax3.readCelsius()); // termopar 1

      lcd.write(7); // Writes a character to the LCD

      lcd.print("C  ");

      lcd.print(robojax4.readCelsius()); // termopar 1

      lcd.write(7); // Writes a character to the LCD

      lcd.print("C "); 

*/


DateTime now = rtc.now();


  Serial.print(now.year(), DEC);

  Serial.print('/');

  Serial.print(now.month(), DEC);

  Serial.print('/');

  Serial.print(now.day(), DEC);

  Serial.print(" (");

  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);

  Serial.print(") ");

  Serial.print(now.hour(), DEC);

  Serial.print(':');

  Serial.print(now.minute(), DEC);

  Serial.print(':');

  Serial.print(now.second(), DEC);

  Serial.println();


  delay(1000);

  

  lcd.clear();

  lcd.setBacklight(HIGH);

  lcd.setCursor(0,0);

  lcd.print(now.hour(), DEC);

  lcd.print(':');

  lcd.print(now.minute(), DEC);

  lcd.print(':');

  lcd.print(now.second(), DEC);

  lcd.print(' ');

  lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);


  lcd.setCursor(0,1);

  lcd.print("CP ");

  //lcd.print(ROW);

  delay(500);

  


  }

    if((millis() - millisdisplaytime) > 800){

    millisdisplaytime = millis();

    }


//Aguarda conexao do browser

    EthernetClient client = server.available();

    if (client) {

      Serial.println("new client");

    // an http request ends with a blank line

      boolean currentLineIsBlank = true;

      while (client.connected()) {

      if (client.available()) {

        char c = client.read();

        Serial.write(c);

       // if you've gotten to the end of the line (received a newline

       // character) and the line is blank, the http request has ended,

       // so you can send a reply

        if (c == 'n' && currentLineIsBlank) {

          // send a standard http response header

          client.println("HTTP/1.1 200 OK");

          client.println("Content-Type: text/html");

          client.println("Connection: close");

          client.println("Refresh: 2"); //Recarrega a pagina a cada 2seg

          client.println();

          client.println("<!DOCTYPE HTML>");

          client.println("<html>");

          //Configura o texto e imprime o titulo no browser

          client.print("<font color=#0000FF><b><u>");

          client.print("Envio de informacoes pela rede utilizando Arduino");

          client.print("</u></b></font>");

          client.println("<br />");

          client.println("<br />");

          //Mostra o estado da porta digital 3

          int porta_digital = digitalRead(3);

          client.print("Porta Digital 3 : ");

          client.print("<b>");

          client.print(porta_digital);

          client.println("</b>");

          client.print("  (0 = Desligada, 1 = Ligada)");

          client.println("<br />");

          //Mostra as informacoes lidas pelo sensor ultrasonico

          client.print("Sensor Ultrasonico : ");

          client.print("<b>");

//          client.print(cmMsec);

          client.print(" cm");

          client.println("</b></html>");

          break;

        }

        if (c == 'n') {

          // you're starting a new line

          currentLineIsBlank = true;

        } 

        else if (c != 'r') {

          // you've gotten a character on the current line

          currentLineIsBlank = false;

        }

      }

    }

    // give the web browser time to receive the data

    delay(1);

    // close the connection:

    client.stop();

    }




}

 


 


Comentários

Postagens mais visitadas