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
Postar um comentário