Código
- eDOT:estação meteorológica e relógio de precisão versátil
eDOT:Estação meteorológica de precisão versátil e relógio Arduino
// eDOT:Estação meteorológica e relógio de precisão versátil // HISTÓRICO // 12/11/2105 Coeficientes de calibração de medição adicionados // 06/09/2016 Brilho automático da tela adicionado // 06/09/2016 Agendador de tarefas adicionado // 07/08/2016 Adicionado tela inicial do eDOT # include #include #include #include #include #include #include #include "RTClib.h" #include Adafruit_BME280 bme; // I2CRTC_DS3231 rtc; int pinCS =10; // Anexe CS a este pino, DIN a MOSI e CLK a SCK (cf http://arduino.cc/en/Reference/SPI) int numberOfHorizontalDisplays =7; int numberOfVerticalDisplays =1; Max72xxPanel matrix =Max72xxPanel (pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); # define TEMPERATURA 0 # define UMIDADE 1 # define PRESSÃO 2 # define HORA 3 # define DIA 4 # define DATA 5float temp; float tempavg; char tempf [8]; float hum; float humavg; char humf [8]; float press; float pressavg; char pressf [8]; int tela =0; // tela inicial longa anteriorLEDMillis =0; // para display LED updatelong LEDInterval =5000; // atraso entre as telas int screenMax =5; // número máximo de screenbool screenChanged =true; // tela statusfloat lightsens; float screenBrt =0; float lightsensavg; Average avetemp (60); // Média para temperatura (80 amostras) Média avehum (60); // Média para umidade (80 amostras) Média avepress (60); // Média para pressão (80 amostras) Média avelightsens (40); // Média para a pressão (80 amostras) // Coeficientes de calibraçãofloat temp_o =-1,70; float temp_s =1,0; float temp_lin; float hum_o =2,45; float hum_s =1,0; float hum_lin; float press_o =0,0; float press_s =1,0; float press_lin; // Correção do sensor de brilhofloat brt_o =-4; float brt_s =1.35; Tarefa agendada1; Tarefa agendada2; void setup () {Task1.start (); Task2.start (); Wire.begin (); // Iniciar I2C bme.begin (0x76); matrix.setIntensity (screenBrt); // Use um valor entre 0 e 15 para o brilho // Ajuste às suas próprias necessidades // matrix.setPosition (0, 0, 0); // A primeira exibição está em <0, 0> // matrix.setPosition (1, 1, 0); // O segundo display está em <1, 0> matrix.setRotation (0, 1); // Ajusta a orientação do display matrix.setRotation (1, 1); // Ajusta a orientação do display matrix.setRotation (2, 1); // Ajusta a orientação do display matrix.setRotation (3, 1); // Ajusta a orientação do display matrix.setRotation (4, 1); // Ajusta a orientação do display matrix.setRotation (5, 1); // Ajusta a orientação do display matrix.setRotation (6, 1); // Ajusta a orientação do display matrix.setRotation (7, 1); // Ajustar a orientação do display / * matrix.setRotation (8, 1); // Ajusta a orientação do display matrix.setRotation (9, 1); // Ajustar orientação de exibição * / rtc.begin (); // matrix.setRotation (3, 2); // A mesma retenção para a última exibição // rtc.adjust (DateTime (F (__ DATE__), F (__ TIME __))); // rtc.adjust (DateTime (2016, 02, 28, 16, 44, 0)); //Serial.begin(9600);//eDOT SPLASHSCREEN matrix.fillScreen (0); matrix.write (); matrix.setCursor (12,0); matrix.print ("eDOT"); para (screenBrt =0; screenBrt <=15; screenBrt ++) {atraso (25); matrix.setIntensity (screenBrt); // Use um valor entre 0 e 15 para o brilho matrix.write (); } atraso (250); para (screenBrt =15; screenBrt> =0; screenBrt -) {atraso (50); matrix.setIntensity (screenBrt); // Use um valor entre 0 e 15 para o brilho matrix.write (); } atraso (500); matrix.fillScreen (0); matrix.write (); delay (1000);} void loop () {Task1.check (acq1.500); Task2.check (acq2,20);} void acq1 () {// AQUISIÇÃO E MÉDIA DE DADOS temp =bme.readTemperature (); avetemp.push (temp); tempavg =avetemp.mean (); hum =bme.readHumidity (); avehum.push (hum); humavg =avehum.mean (); press =bme.readPressure (); avepress.push (pressione); pressavg =avepress.mean (); DateTime now =rtc.now (); outSec =now.second (); outMin =agora.minuto (); outHour =now.hour (); outday =now.dia (); outmonth =now.month (); outyear =now.year () - 2000; dow =now.dayOfTheWeek (); } void acq2 () {lightsens =analogRead (A3); avelightsens.push (lightsens); lightsensavg =avelightsens.mean (); screenBrt =constrain (((lightsensavg / 1023 * 15) * brt_s + brt_o), 0, 15); matrix.setIntensity (screenBrt); // LINEARISAÇÃO DE DADOS temp_lin =tempavg * temp_s + temp_o; hum_lin =humavg * hum_s + hum_o; press_lin =pressavg * press_s + press_o; currentLEDMillis longo sem sinal =millis (); //Serial.println(screenBrt); if (currentLEDMillis - previousLEDMillis> LEDInterval) // salvar a última vez que você alterou o display {previousLEDMillis =currentLEDMillis; screen ++; if (screen> screenMax) screen =0; // redefinir para a tela inicial assim que o ciclo for concluído screenChanged =true; } // if (screenChanged) // atualizar a medição na alteração da tela // {// screenChanged =false; // zera para a próxima iteraçãowitch (tela) {case TEMPERATURE:dtostrf (temp_lin, 4, 2, tempf); // formatar para cinco dígitos com duas casas decimais matrix.setCursor (6,0); matrix.setTextSize (1); matrix.setTextColor (255); matrix.print (tempf); // imprime a temperatura atual matrix.drawRect (37,0,2,2,255); // desenha o símbolo da nota matrix.setCursor (40,0); matrix.print ("C"); matrix.write (); // escreve os dados atuais para exibir matrix.fillScreen (0); // limpar displaybreak; case HUMIDADE:dtostrf (hum_lin, 4, 2, humf); // formatar para cinco dígitos com duas casas decimais matrix.setCursor (6,0); matrix.setTextSize (1); matrix.setTextColor (255); matrix.print (humf); // imprime a temperatura atual matrix.setCursor (37,0); matrix.print ("%"); matrix.write (); // escreve os dados atuais para exibir matrix.fillScreen (0); // limpar displaybreak; case PRESSURE:dtostrf (press_lin, 6, 0, pressf); // formatar para cinco dígitos com duas casas decimais matrix.setCursor (0,0); matrix.setTextSize (1); matrix.setTextColor (255); matrix.print (pressf); // imprime a temperatura atual matrix.setCursor (37,0); matrix.print ("Pa"); matrix.write (); // escreve os dados atuais para exibir matrix.fillScreen (0); // limpar displaybreak; case TIME:// dtostrf (press_lin, 6, 0, pressf); // formatar para cinco dígitos com duas casas decimais matrix.setCursor (0,0); matrix.setTextSize (1); matrix.setTextColor (255); if (outHour <10) {matrix.print ("0"); } matrix.print (outHour, 0); // imprime o horário atual matrix.print (":"); if (outMin <10) {matrix.print ("0"); } matrix.print (outMin, 0); // imprime os minutos atuais matrix.print (":"); if (outSec <10) {matrix.print ("0"); } matrix.print (outSec, 0); // imprime os segundos atuais matrix.write (); // escreve os dados atuais para exibir matrix.fillScreen (0); // limpar displaybreak; case DATE:// dtostrf (press_lin, 6, 0, pressf); // formatar para cinco dígitos com duas casas decimais matrix.setCursor (0,0); matrix.setTextSize (1); matrix.setTextColor (255); if (outday <10) {matrix.print ("0"); } matrix.print (outday, 0); // imprime as horas atuais matrix.print ("/"); if (outmonth <10) {matrix.print ("0"); } matrix.print (outmonth, 0); // imprime os minutos atuais matrix.print ("/"); matrix.print (outyear, 0); // imprime os segundos atuais matrix.write (); // escreve os dados atuais para exibir matrix.fillScreen (0); // limpar displaybreak; case DAY:// dtostrf (press_lin, 6, 0, pressf); // formatar para cinco dígitos com duas casas decimais matrix.setCursor (15,0); matrix.setTextSize (1); matrix.setTextColor (255); matrix.print (daysOfTheWeek [dow]); matrix.write (); // escreve os dados atuais para exibir matrix.fillScreen (0); // clear displaybreak; }}