Arduino - CP V7.12
/* Wilson R Bueno 14/03/2024
* >>>> Atenção: utilizar Arduino 1.8.12 <<<<<< * Projeto Medidor Contrapressão
* >>>> Editar usando o adm do computador para evitar travamentos no Arduino <<<<
* 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 * V2.1 - Condicionais
* V2.1.1 - Simplificando para testar condicionais * V2.2 - Adicionando SwitchCase - Funcional * V2.2.1 - Limpando - Funcional
* V2.2.2 - Iniciando gravação * V3 - Reformulando menus - unido com projeto Menu Básico para CP V0 https://www.youtube.com/watch?v=Swr2Q1IFiBM&ab_channel=WRKits
* V3.1 - adicionando e mesclando * V3.1.1 - funcional * V3.1.2 / V3.1.3 - progressivo * V3.1.4 - retirada o menu de seleção básico da WR Kits - funcional
* V3.1.5 - executar tarefas - progressivo * V3.1.6 - progressivo - menu OK - faltam os submenus * V3.1.7 - formatando submenus
* V3.1.8 - falta submenu - colocando função RESET soft * V4 - retirando menus WR Kits e colocando menu do Lacerda: MENU COM TRÊS BOTÕES
ABRAÃO LACERDA - ACESSE O LINK https://www.youtube.com/channel/UCn_SRCloMrZ5y9XOHSIUFUQ
* V4.1 / 4.2 / 4.2.1 - progressivo * V5 - inclusão módulos de temperatura * V5.1 - acelerando a gravação file.close() ??
* V6.2 - retorno à ordem dos menus * V6.3 - retirando Menus do loop * V6.4 - inicializando submenus, zerando variáveis
* V6.5 - progressivo * V6.6 - progressivo * V6.7 - inclusão do segundo submenu * V6.8 - problema
* V6.9 - incluindo submenus - ok. Falta acertar sub sub menu calibração * V6.10 - incluindo Switch Case no sub sub menu calibração - não funcional
* V6.11 - usando leitor de cartão externo * V6.12 -inserindo leitor umidade e temperatura - falta submenus
* V7.0 - Incluindo timers diferentes para cada aquisição SD, serial, LCD e usando um timer confiável
* https://josecintra.com/blog/arduino-controlando-intervalos-tempo/
* V7.1 - progressivo e alterando frequÊncia de gravação * V7.2 - Ampliação dos submenus * V7.3.1 - progressivo - subsub menu não funcional
* V7.4, V7.5 - não funcional * V7.6 - retirando WRKits e alterando submenus
* V7.6.7 - resolvendo reset e colocando submenus - funcional * V7.7 - zerar os canais e aplicar ganho
* V7.8 - otimização
* V7.8.1 - adicionando submenu de ganho e média móvel para canal analógico WRKits#108 https://www.youtube.com/watch?v=cxPQ0AMQ5bo&ab_channel=WRKits
* V7.8.2 - funcional
* V7.8.2.1 - verificar falha no acesso dos menus - não funcional
* média móvel = deixou o programa muito lento. Avaliando custo benefício
* V7.8.4 ref: 0=0 - submenus usando case, para eliminar o problema de travamento no submenu, base https://www.youtube.com/watch?v=Swr2Q1IFiBM&ab_channel=WRKits
* V7.8.4.1 - inclusão da aquisição via Excel PLX e troca do Timing por timers separados - não funcional
* V7.8.5 / V7.8.6 / V7.8.7 - progressivo e uso do return; - funcional
* V7.9 - alteração menus - funcional
* V7.9.1 - otimização e inclusão de subsubmenus
* V7.10 - zero e ganho nos canais
* V7.10.1 - descartar
* V7.10.2 - incluir conversor 4-20mA - progressivo
* V7.11 V7.11.1 - progressivo
* V7.12 - média móvel - não compensa o atraso
*/
// --- Bibliotecas Auxiliares ---
#include <LiquidCrystal_I2C.h>
#include <Wire.h> //biblioteca I2C
#include "RTClib.h" //biblioteca do RTC
#include <SPI.h> // biblioteca comunicação serial
#include <SD.h> // biblioteca cartão SD
#include <Keypad.h> // Biblioteca para controle do teclado de matrizes
#include "max6675.h" // biblioteca do shield max6675
#include <Adafruit_AHT10.h> //biblioteca sensor umidade e temperatura
//Timers
unsigned long Tgrava = 0;
const int lederroPin = 14;
const int record = 13;
int freqgrav = 1000; //record frequency
int w = 0; // constante para gravação
int q = 0; //condicional
int a = 0; // constante para gravação única do cabeçalho
int z = 0; // constante para gravação //Serial
//Para o teclado
const byte LINHAS = 4; // Linhas do teclado
const byte COLUNAS = 5; // Colunas do teclado
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
// --- Protótipo das Funções Auxiliares ---
void fileopen(); //Função do menu1, data e hora
void menuP(); //Menu principal
void subMenu();
void resetando(); //Reset geral
void gravacao(); //Função do menu2, gravacao
void temperatures();
void(* resetFunc) (void) = 0; // create a standard reset function
//Inicializa o display no endereco 0x27
LiquidCrystal_I2C lcd(0x27,16,2);
//Relógio
RTC_DS1307 rtc;
//char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//Base de tempo
//unsigned long millisdisplaytime = millis();
//Open file on SD card
File logfile;
int pinoCS = 49; // Pin CS Turn on
void error(char *str) {
Serial.print(F("error: "));
Serial.println(str);
while(1);
}
int tela = 1; //variável para controlar a mudança de tela no menu
float conv = 1.67; //variável para conversão em tensão 204.6
//vcp Variáveis cpp = resultado contrapressão, cpz = zerar, cp = leitura canais analógicos, cpg = ganho
int cpp1 = 0;float cpz1 = 0;float cp1 = A0;int cpg1 = 0;
int cpp2 = 0;float cpz2 = 0;float cp2 = A1;int cpg2 = 0;
int cpp3 = 0;float cpz3 = 0;float cp3 = A2;int cpg3 = 0;
int cpp4 = 0;float cpz4 = 0;float cp4 = A3;int cpg4 = 0;
int cpp5 = 0;float cpz5 = 0;float cp5 = A4;int cpg5 = 0;
// float cpp6 = 0;float cpz6 = 0;float cp6 = A5;int cpg6 = 0;
// float cpp7 = 0;float cpz7 = 0;float cp7 = A6;int cpg7 = 0;
// float cpp8 = 0;float cpz8 = 0;float cp8 = A7;int cpg8 = 0;
//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
//5th thermocouple
int so5Pin = 46;// SO=Serial Out do shield termopar
int cs5Pin = 48;// CS = chip select CS pin do shield termopar
int sck5Pin = 12;// SCK = Serial Clock pin do shield termopar
/*
//6th thermocouple
int so6Pin = 10;// SO=Serial Out do shield termopar -> não usar o pino 11
int cs6Pin = 9;// CS = chip select CS pin do shield termopar
int sck6Pin = 8;// SCK = Serial Clock pin do shield termopar
//7th thermocouple
int so7Pin = 7;// SO=Serial Out do shield termopar
int cs7Pin = 6;// CS = chip select CS pin do shield termopar
int sck7Pin = 5;// SCK = Serial Clock pin do shield termopar
//8th thermocouple
int so8Pin = 4;// SO=Serial Out do shield termopar
int cs8Pin = 3;// CS = chip select CS pin do shield termopar
int sck8Pin = 2;// 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);
MAX6675 robojax5(sck5Pin, cs5Pin, so5Pin);
// MAX6675 robojax6(sck6Pin, cs6Pin, so6Pin);
// MAX6675 robojax7(sck7Pin, cs7Pin, so7Pin);
// MAX6675 robojax8(sck8Pin, cs8Pin, so8Pin);
//AHT10 card umidity and temperature
Adafruit_AHT10 aht;
//Degree simbol character
byte grau[8] ={ B00001100,
B00010010,
B00010010,
B00001100,
B00000000,
B00000000,
B00000000,
B00000000,};
// FUNÇÃO FILTRO - MÉTODO MÉDIA MÓVEL (MM)
float mediaMovel(float xis) {
static float media = 0.0;
static int indice = 1;
if (indice == 0 || indice == 33) {
indice = 1;
media = 0.0;
}
media = media + (xis - media) / indice++;
return media;
}
void setup() /////////////////////////////////////////////////
{
Serial.begin(9600); //inicialização serial
Serial.println(F("Initializing ..."));
pinMode (lederroPin, OUTPUT); //Alimentação Led de erro
pinMode (record, OUTPUT); //Alimentação Led 13 de gravação
//Initialize AHT10 card umidity and temperature
if (! aht.begin()) {
Serial.println(F("Could not find AHT10? Check wiring"));
while (1) delay(10);
}
Serial.println(F("AHT10 Card Ok"));
//Cria o caractere customizado com o simbolo do grau
lcd.createChar(0, grau);
//inicia o display 16x2
lcd.init();
lcd.backlight();
lcd.begin (16,2);
//Inicialização do programa
lcd.setCursor(0, 0);
lcd.print(F(" R&D-TE MARELLI"));
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(F("Ver 07.11.1-Mar24 "));
delay(1000);
//AHT10
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
lcd.setCursor(0, 1);
lcd.print(temp.temperature);
lcd.setCursor(4, 1);
lcd.write((byte)0); //Mostra o simbolo do grau formado pelo array
lcd.print(F("C : "));
lcd.setCursor(9, 1);
lcd.print(humidity.relative_humidity);
lcd.setCursor(13, 1);
lcd.print(F("%HR "));
delay(1500);
//Inicialização do cartão SD
pinMode(pinoCS, OUTPUT); // Declara pino CS como saída
Serial.print(F("SD card..."));
if (!SD.begin(4)) {
Serial.println(F("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(F("* FAIL ON *"));
lcd.setCursor(3, 1);
lcd.print(F("* SD CARD *"));
while (1);
}
Serial.println(F("Ok"));
logfile.print(F("Temperature: ")); logfile.print(temp.temperature); logfile.println(F(" degrees C"));
logfile.print(F("Humidity: ")); logfile.print(humidity.relative_humidity); logfile.println(F("% rH"));
DateTime now = rtc.now();
//Relógio RTC
if (! rtc.begin()) {
Serial.println(F("Couldn't find RTC"));
lcd.clear();
lcd.setBacklight(HIGH);
lcd.setCursor(3, 0);
lcd.print(F("* FAIL ON *"));
lcd.setCursor(7, 1);
lcd.print(F("* RTC *"));
digitalWrite(lederroPin, HIGH); // turn the LED on (HIGH is the voltage level)
while (1);
}
if (! rtc.isrunning()) {
Serial.println(F("RTC is NOT running!"));
lcd.clear();
lcd.setBacklight(HIGH);
lcd.setCursor(3, 0);
lcd.print(F("* FAIL ON *"));
lcd.setCursor(7, 1);
lcd.print(F("* RTC *"));
digitalWrite(lederroPin, HIGH); // turn the LED on (HIGH is the voltage level)
}
Serial.println(F("RTC is Ok"));
// 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(2023, 9, 06, 10, 55, 0));
logfile.print(F("Marelli GTS Amparo")); logfile.print(temp.temperature); logfile.println(F("Project: Enxugamento N Placa V3.3"));
logfile.print(F("Temperature: ")); logfile.print(temp.temperature); logfile.println(F(" °C"));
logfile.print(F("Umidity: ")); logfile.print(humidity.relative_humidity); logfile.println(F("% rH"));
logfile.println("LABEL,Date,Time,Timer,TU1,TU2,TU3,TU4,TU5,TU6,TU7,TU8,TP1,TP2,TP3,TP4,TP5,TP6,TP7,TP8");
//Inicialização Menu Superior Excel PLX-DAQ
Serial.println("CLEARDATA"); // reset da comunicação //Serial
Serial.println("LABEL,Date,Time,Timer,CP1,CP2,CP3,CP4,CP5,TP1,TP2,TP3,TP4,TP5");
} ///////////////////////////////////////end setup
void loop()///////////////////////////////////////
{
menuP();
} ////////////////////////////////////////end loop
void menuP(){ //Menu e submenus
//Identificação tecla pressionada
char leitura_teclas = teclado_personalizado.getKey(); // Atribui a variavel a leitura do teclado
// Se alguma tecla foi pressionada
if(leitura_teclas){
if(leitura_teclas == 'R'){ // Se a tecla Reset foi pressionada
lcd.clear();
resetando();
}
}
// === Ações no display LCD === // Menus Principais //
digitalWrite(record, LOW); //Indica gravação no cartão
if (tela==1){ //Tela 1
lcd.setCursor(0,0);
//condicionais para colocar o zero, depois de cada 9
DateTime now = rtc.now();
if(now.hour()<10)lcd.print(F("0"));// sempre 2 dígitos
lcd.print(now.hour());
lcd.print(F(":"));
if(now.minute()<10)lcd.print(F("0"));
lcd.print(now.minute());
lcd.print(F(":"));
if(now.second()<10)lcd.print(F("0"));
lcd.print(now.second());
lcd.print(F("-"));
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print((now.year()-2000), DEC);
lcd.setCursor(0,1);
lcd.print(F(">Enter to Record"));
}
else if (tela==2){
lcd.setCursor(0,0);
lcd.print(F(" CH CALIBRATION --"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to ZERO<<"));
}
else if (tela==3){
lcd.setCursor(0,0);
lcd.print(F(" CH CALIBRATION "));
lcd.setCursor(0,1);
lcd.print(F(">Enter to GAIN<<"));
}
else if (tela==4){
lcd.setCursor(0,0);
lcd.print(F("> TEMPERATURES <"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to Record<<"));
}
/////////////////////////////////////////////////Movimentação das telas
// === Ações do Botão MAIS === // ////////////
if(leitura_teclas == 'D'){
//Menu principal
if (tela==1)tela=2;
else if (tela==2)tela=3;
else if (tela==3)tela=4;
else if (tela==4)tela=1;
//Menu 2
else if (tela==21)tela=22;
else if (tela==22)tela=23;
else if (tela==23)tela=24;
else if (tela==24)tela=25;
else if (tela==25)tela=26;
else if (tela==26)tela=27;
else if (tela==27)tela=28;
else if (tela==28)tela=21;
//Menu 3
else if (tela==31)tela=32;
else if (tela==32)tela=33;
else if (tela==33)tela=34;
else if (tela==34)tela=35;
else if (tela==35)tela=36;
else if (tela==36)tela=37;
else if (tela==37)tela=38;
else if (tela==38)tela=31;
delay(30);} //Por causa do efeito Bounce - repique
// === Ações do Botão MENOS === // ////////////
if(leitura_teclas == 'U'){
//Menu principal
if (tela==1)tela=4;
else if (tela==2)tela=1;
else if (tela==3)tela=2;
else if (tela==4)tela=3;
//Menu 2
else if (tela==21)tela=28;
else if (tela==28)tela=27;
else if (tela==27)tela=26;
else if (tela==26)tela=25;
else if (tela==25)tela=24;
else if (tela==24)tela=23;
else if (tela==23)tela=22;
else if (tela==22)tela=21;
//Menu 3
else if (tela==31)tela=38;
else if (tela==38)tela=37;
else if (tela==37)tela=36;
else if (tela==36)tela=35;
else if (tela==35)tela=34;
else if (tela==34)tela=33;
else if (tela==33)tela=32;
else if (tela==32)tela=31;
delay(30);}
if(leitura_teclas == 'S'){ // //Teste tecla Parada para interromper a gravação e retornar ao menu 2
//Serial.println("Parada solicitada");
lcd.clear();
if((tela==21)|| (tela==22)|| (tela==23)|| (tela==24)|| (tela==25)|| (tela==26)|| (tela==27)|| (tela==28))tela=2;
else if((tela==211)|| (tela==212)|| (tela==213)|| (tela==214)|| (tela==215)|| (tela==216)|| (tela==217)|| (tela==218))tela=2;
else if((tela==311)|| (tela==312)|| (tela==313)|| (tela==314)|| (tela==315)|| (tela==316)|| (tela==317)|| (tela==318))tela=3;
return; // finalmente retornou ao menu principal!
}
/////////////////////////////////////////////////Fim Movimentação das telas principais
// === Ações do Botão ENTER === /////////////////////////////////
//Movimentação de menu para submenu1
if(leitura_teclas == 'O'){
if (tela==1){tela=10;}
else if (tela==2)tela=21;
else if (tela==3)tela=31;
else if (tela==4)tela=40;
else if (tela==21)tela=211;
else if (tela==22)tela=212;
else if (tela==23)tela=213;
else if (tela==24)tela=214;
else if (tela==25)tela=215;
else if (tela==26)tela=216;
else if (tela==27)tela=217;
else if (tela==28)tela=218;
else if (tela==31)tela=311;
else if (tela==32)tela=312;
else if (tela==33)tela=313;
else if (tela==34)tela=314;
else if (tela==35)tela=315;
else if (tela==36)tela=316;
else if (tela==37)tela=317;
else if (tela==38)tela=318;
delay(30);
}
subMenu();
}
void subMenu()
{
// === Ações no display LCD === // Submenus //
if (tela==10){
fileopen(); //Abertura de arquivo
logfile.flush();
//Data e hora abertura do arquivo
DateTime now = rtc.now();
if(now.hour()<10)lcd.print(F("0"));// sempre 2 dígitos
logfile.print(now.hour());
logfile.print(F(":"));
if(now.minute()<10)lcd.print(F("0"));
logfile.print(now.minute());
logfile.print(F(":"));
if(now.second()<10)lcd.print(F("0"));
logfile.println(now.second());
gravacao();
}
if (tela==21){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 01 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to ZERO<<"));
}
if (tela==22){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 02 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to ZERO<<"));
}
if (tela==23){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 03 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to ZERO<<"));
}
if (tela==24){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 04 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to ZERO<<"));
}
if (tela==25){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 05 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to ZERO<<"));
}
if (tela==26){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 06 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to ZERO<<"));
}
if (tela==27){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 07 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to ZERO<<"));
}
if (tela==28){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 08 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to ZERO<<"));
}
if (tela==31){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 01 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to GAIN<<"));
}
if (tela==32){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 02 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to GAIN<<"));
}
if (tela==33){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 03 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to GAIN<<"));
}
if (tela==34){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 04 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to GAIN<<"));
}
if (tela==35){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 05 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to GAIN<<"));
}
if (tela==36){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 06 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to GAIN<<"));
}
if (tela==37){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 07 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to GAIN<<"));
}
if (tela==38){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 08 -->>"));
lcd.setCursor(0,1);
lcd.print(F(">Enter to GAIN<<"));
}
if (tela==40){
fileopen(); //Abertura de arquivo
logfile.flush();
//Data e hora abertura do arquivo
DateTime now = rtc.now();
if(now.hour()<10)lcd.print(F("0"));// sempre 2 dígitos
logfile.print(now.hour());
logfile.print(F(":"));
if(now.minute()<10)lcd.print(F("0"));
logfile.print(now.minute());
logfile.print(F(":"));
if(now.second()<10)lcd.print(F("0"));
logfile.println(now.second());
temperatures();
}
if (tela==211){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 01 -->>"));
lcd.setCursor(0,1);
lcd.print(F("RESETING TO ZERO"));
}
if (tela==212){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 02 -->>"));
lcd.setCursor(0,1);
lcd.print(F("RESETING TO ZERO"));
}
if (tela==213){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 03 -->>"));
lcd.setCursor(0,1);
lcd.print(F("RESETING TO ZERO"));
}
if (tela==214){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 04 -->>"));
lcd.setCursor(0,1);
lcd.print(F("RESETING TO ZERO"));
}
if (tela==215){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 05 -->>"));
lcd.setCursor(0,1);
lcd.print(F("RESETING TO ZERO"));
}
if (tela==216){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 06 -->>"));
lcd.setCursor(0,1);
lcd.print(F("RESETING TO ZERO"));
}
if (tela==217){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 07 -->>"));
lcd.setCursor(0,1);
lcd.print(F("RESETING TO ZERO"));
}
if (tela==218){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 08 -->>"));
lcd.setCursor(0,1);
lcd.print(F("RESETING TO ZERO"));
}
if (tela==311){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 01 -->>"));
lcd.setCursor(0,1);
lcd.print(F("Enter Gain Value"));
}
if (tela==312){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 02 -->>"));
lcd.setCursor(0,1);
lcd.print(F("Enter Gain Value"));
}
if (tela==313){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 03 -->>"));
lcd.setCursor(0,1);
lcd.print(F("Enter Gain Value"));
}
if (tela==314){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 04 -->>"));
lcd.setCursor(0,1);
lcd.print(F("Enter Gain Value"));
}
if (tela==315){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 05 -->>"));
lcd.setCursor(0,1);
lcd.print(F("Enter Gain Value"));
}
if (tela==316){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 06 -->>"));
lcd.setCursor(0,1);
lcd.print(F("Enter Gain Value"));
}
if (tela==317){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 07 -->>"));
lcd.setCursor(0,1);
lcd.print(F("Enter Gain Value"));
}
if (tela==318){
lcd.setCursor(0,0);
lcd.print(F(">> CHANNEL 08 -->>"));
lcd.setCursor(0,1);
lcd.print(F("Enter Gain Value"));
}
}
void fileopen()
{
//Create a new file sequencial on SD card
char filename[] = "LOGGE000.TXT";
for (uint8_t i = 0; i < 1000; i++)
{
filename[5] = '0' + (i/100)%10;
filename[6] = '0' + (i/10)%10;
filename[7] = '0' + i%10;
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
logfile.println(filename);
//Data e hora abertura do arquivo
DateTime now = rtc.now();
logfile.print(now.day(), DEC);
logfile.print('/');
logfile.print(now.month(), DEC);
logfile.print('/');
logfile.println((now.year()-2000), DEC);
if(now.hour()<10)lcd.print(F("0"));// sempre 2 dígitos
logfile.print(now.hour());
logfile.print(F(":"));
if(now.minute()<10)lcd.print(F("0"));
logfile.print(now.minute());
logfile.print(F(":"));
if(now.second()<10)lcd.print(F("0"));
logfile.print(now.second());
logfile.print(F("-"));
lcd.clear();
lcd.setBacklight(HIGH);
lcd.setCursor(0, 0);
lcd.print(F(" FILE OPEN "));
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(F("File:"));
lcd.print(filename);
delay(1000);
break; // leave the loop!
}
}
if (! logfile) {
error("couldnt create file");
Serial.println(F("Fail to create file"));
lcd.clear();
lcd.setBacklight(HIGH);
lcd.setCursor(3, 0);
lcd.print(F("* FAIL ON *"));
lcd.setCursor(3, 1);
lcd.print(F("* SD CARD *"));
digitalWrite(lederroPin, HIGH); // turn the LED on (HIGH is the voltage level)
}
Serial.print(F("Logging to: "));
Serial.println(filename);
delay(1000);
} //end fileopen
void gravacao()
{
for(int k=2; k>1; k++) //Para manter o loop da gravação
{
char leitura_teclas = teclado_personalizado.getKey(); // Atribui a variavel a leitura do teclado
if(leitura_teclas == 'R'){ // Se a tecla Reset foi pressionada
lcd.clear();
resetando();
}
if(leitura_teclas == 'S'){ // //Teste tecla Parada para interromper a gravação e retornar ao menu 1
Serial.println("Parada solicitada");
lcd.clear();
tela=1;
return; // finalmente retornou ao menu principal!
}
unsigned long atual = millis();
digitalWrite(record, LOW); //Indica gravação no cartão
//Leitura das CPs
//cpp1 = (analogRead(cp1)/conv);
float cpp1 = 5.0 * analogRead(0) * 600.0 / 1024.0;
//Serial.println(mediaMovel(sample));
//delay(100);
cpp2 = (analogRead(cp2)/conv);
cpp3 = (analogRead(cp3)/conv);
cpp4 = (analogRead(cp4)/conv);
cpp5 = (analogRead(cp5)/conv);
// cpp6 = (analogRead(cp6)/conv);
// cpp7 = (analogRead(cp7)/conv);
// cpp8 = (analogRead(cp8)/conv);
if (atual - Tgrava > 1000) {
Serial.print( (String) "DATA,DATE,TIME,TIMER,"); //Menu PLX-DAQ
Serial.print(cpp1);
Serial.print(F(","));
Serial.print(cpp2);
Serial.print(F(","));
Serial.print(cpp3);
Serial.print(F(","));
Serial.print(cpp4);
Serial.print(F(","));
Serial.print(cpp5);
Serial.print(F(","));
//Serial.print(cpp6);
//Serial.print(F(","));
//Serial.print(cpp7);
//Serial.print(F(","));
//Serial.print(cpp8);
Serial.print(F(","));
Serial.print(robojax1.readCelsius(),1); // termopar 1
Serial.print(F(","));
Serial.print(robojax2.readCelsius(),1); // termopar 2
Serial.print(F(","));
Serial.print(robojax3.readCelsius(),1); // termopar 3
Serial.print(F(","));
Serial.print(robojax4.readCelsius(),1); // termopar 4
Serial.print(F(","));
Serial.print(robojax5.readCelsius(),1); // termopar 5
Serial.println(F(","));
//Serial.print(robojax6.readCelsius(),1); // termopar 6
//Serial.print(F(","));
//Serial.print(robojax7.readCelsius(),1); // termopar 7
//Serial.print(F(","));
//Serial.println(robojax8.readCelsius(),1); // termopar 8
//Saída LCD
lcd.setCursor(0,0);
lcd.print(cpp1);
lcd.print(F("|"));
lcd.print(cpp2);
lcd.print(F("|"));
lcd.print(cpp3);
lcd.print(F(" mbar "));
//lcd.print(cpp4);
lcd.print(F("......."));
lcd.setCursor(0,1);
//lcd.print(F("."));
lcd.print(cpp4);
lcd.print(F(" | "));
lcd.print(cpp5);
lcd.print(F(" | "));
//lcd.print(cpp7);
//lcd.print(F("."));
//lcd.print(cpp8);
lcd.print(F("mbar "));
//Saída Cartão SD
logfile.flush();
DateTime now = rtc.now();
if(a==0){
logfile.println(F("Time,#,PT1,PT2,PT3,PT4,PT5,T1,T2,T3,T4,T5"));
a++;
}
if(now.hour()<10)logfile.print(F("0"));// sempre 2 dígitos
logfile.print(now.hour());
logfile.print(F(":"));
if(now.minute()<10)logfile.print(F("0"));
logfile.print(now.minute());
logfile.print(F(":"));
if(now.second()<10)logfile.print(F("0"));
logfile.print(now.second());
logfile.print(F(" , "));
logfile.print(z);
logfile.print(F(" , "));
logfile.print(cpp1);
logfile.print(F(" , "));
logfile.print(cpp2);
logfile.print(F(" , "));
logfile.print(cpp3);
logfile.print(F(" , "));
logfile.print(cpp4);
logfile.print(F(" , "));
logfile.print(cpp5);
logfile.print(F(" , "));
//logfile.print(cpp6);
//logfile.print(F(" , "));
//logfile.print(cpp7);
//logfile.print(F(" , "));
//logfile.print(cpp8);
//logfile.print(F(" , "));
logfile.print(robojax1.readCelsius()); // termopar 1
logfile.print(F(","));
logfile.print(robojax2.readCelsius()); // termopar 2
logfile.print(F(","));
logfile.print(robojax3.readCelsius()); // termopar 3
logfile.print(F(","));
logfile.print(robojax4.readCelsius()); // termopar 4
logfile.print(F(","));
logfile.print(robojax5.readCelsius()); // termopar 5
logfile.println(F(","));
//logfile.print(robojax6.readCelsius()); // termopar 6
//logfile.print(F(","));
//logfile.print(robojax7.readCelsius()); // termopar 7
//logfile.print(F(","));
//logfile.println(robojax8.readCelsius()); // termopar 8
z++;
digitalWrite(record, HIGH);
Tgrava = atual;
}
}
w++; //Contagem para base de tempo
} ///////////////////end gravacao()
void temperatures()
{
for(int k=2; k>1; k++) //Para manter o loop da gravação
{
char leitura_teclas = teclado_personalizado.getKey(); // Atribui a variavel a leitura do teclado
if(leitura_teclas == 'R'){ // Se a tecla Reset foi pressionada
lcd.clear();
resetando();
}
if(leitura_teclas == 'S'){ // //Teste tecla Parada para interromper a gravação e retornar ao menu 1
Serial.println("Parada solicitada");
lcd.clear();
tela=4;
return; // finalmente retornou ao menu principal!
}
unsigned long atual = millis();
digitalWrite(record, LOW); //Indica gravação no cartão
//Leitura das CPs
cpp1 = (analogRead(cp1)/conv);
cpp2 = (analogRead(cp2)/conv);
cpp3 = (analogRead(cp3)/conv);
cpp4 = (analogRead(cp4)/conv);
cpp5 = (analogRead(cp5)/conv);
//cpp6 = (analogRead(cp6)/conv);
//cpp7 = (analogRead(cp7)/conv);
//cpp8 = (analogRead(cp8)/conv);
if (atual - Tgrava > 1000) {
Serial.print( (String) "DATA,DATE,TIME,TIMER,"); //Menu PLX-DAQ
Serial.print(cpp1);
Serial.print(F(","));
Serial.print(cpp2);
Serial.print(F(","));
Serial.print(cpp3);
Serial.print(F(","));
Serial.print(cpp4);
Serial.print(F(","));
Serial.print(cpp5);
Serial.print(F(","));
//Serial.print(cpp6);
//Serial.print(F(","));
//Serial.print(cpp7);
//Serial.print(F(","));
//Serial.print(cpp8);
Serial.print(F(","));
Serial.print(robojax1.readCelsius(),0.1); // termopar 1
Serial.print(F(","));
Serial.print(robojax2.readCelsius(),0.1); // termopar 2
Serial.print(F(","));
Serial.print(robojax3.readCelsius(),0.1); // termopar 3
Serial.print(F(","));
Serial.print(robojax4.readCelsius(),0.1); // termopar 4
Serial.print(F(","));
Serial.print(robojax5.readCelsius(),0.1); // termopar 5
Serial.println(F(","));
//Serial.print(robojax6.readCelsius(),1);
//Serial.print(F(","));
//Serial.print(robojax7.readCelsius(),0.1); // termopar 7
//Serial.print(F(","));
//Serial.println(robojax8.readCelsius(),0.1); // termopar 8
//Saída LCD
lcd.setCursor(0,0);
lcd.print(robojax1.readCelsius(),0.1);
lcd.print(F("."));
lcd.print(robojax2.readCelsius(),0.1);
lcd.print(F("."));
lcd.print(robojax3.readCelsius(),0.1);
lcd.print(F("."));
lcd.print(robojax4.readCelsius(),0.1);
lcd.print(F("......."));
lcd.setCursor(0,1);
lcd.print(F("."));
lcd.print(robojax5.readCelsius(),0.1);
lcd.print(F("."));
//lcd.print(robojax6.readCelsius(),0.1);
//lcd.print(F("."));
//lcd.print(robojax7.readCelsius(),0.1);
//lcd.print(F("."));
// lcd.print(robojax8.readCelsius(),0.1);
lcd.print(F("......."));
//Saída Cartão SD
logfile.flush();
DateTime now = rtc.now();
if(a==0){
logfile.println(F("Time,#,PT1,PT2,PT3,PT4,PT5,PT6,PT7,PT8,T1,T2,T3,T4,T5"));
a++;
}
if(now.hour()<10)logfile.print(F("0"));// sempre 2 dígitos
logfile.print(now.hour());
logfile.print(F(":"));
if(now.minute()<10)logfile.print(F("0"));
logfile.print(now.minute());
logfile.print(F(":"));
if(now.second()<10)logfile.print(F("0"));
logfile.print(now.second());
logfile.print(F(" , "));
logfile.print(z);
logfile.print(F(" , "));
logfile.print(cpp1);
logfile.print(F(" , "));
logfile.print(cpp2);
logfile.print(F(" , "));
logfile.print(cpp3);
logfile.print(F(" , "));
logfile.print(cpp4);
logfile.print(F(" , "));
logfile.print(cpp5);
logfile.print(F(" , "));
//logfile.print(cpp6);
//logfile.print(F(" , "));
//logfile.print(cpp7);
//logfile.print(F(" , "));
//logfile.print(cpp8);
//logfile.print(F(" , "));
logfile.print(robojax1.readCelsius()); // termopar 1
logfile.print(F(","));
logfile.print(robojax2.readCelsius()); // termopar 2
logfile.print(F(","));
logfile.print(robojax3.readCelsius()); // termopar 3
logfile.print(F(","));
logfile.print(robojax4.readCelsius()); // termopar 4
logfile.print(F(","));
logfile.print(robojax5.readCelsius()); // termopar 5
logfile.println(F(","));
//logfile.print(robojax6.readCelsius()); // termopar 6
//logfile.print(F(","));
//logfile.print(robojax7.readCelsius()); // termopar 7
//logfile.print(F(","));
//logfile.println(robojax8.readCelsius()); // termopar 8
z++;
digitalWrite(record, HIGH);
Tgrava = atual;
}
}
w++; //Contagem para base de tempo
} ///////////////////end gravacao()
void resetando()
{
logfile.close();
lcd.setCursor(0, 0);
lcd.print(F("......RESET......"));
lcd.setCursor(0, 1);
lcd.print(F("----------------"));
delay(1000);
resetFunc(); // reset the Arduino via software function
}
Comentários
Postar um comentário