/* SD CARD: MOSI - pin 11 MISO - pin 12 CLK - pin 13 CS - pin 10 */ #include #include #include File myFile; LiquidCrystal595 lcd(6,7,8); #define interval 3600000 // INTERVAL ZAPISA NA SD KARTICO (3600000 = VSAKO URO 1x) unsigned long waitUntil=0; int DS18S20_1_Pin = A0; // SENZOR TEMPERATURE 1 int DS18S20_2_Pin = A1; // SENZOR TEMPERATURE 2 int maxi = -1000; // ZACETNA MAX int mini = 1000; // ZACETNA MIN OneWire ds1(DS18S20_1_Pin); OneWire ds2(DS18S20_2_Pin); byte rpm; // RPM VENTULATORJA byte stanje = 0; // PRETVORBA RPM V PROCENT HITROSTI VRTENJA boolean fanInfo; // STANJE DELOVANJA/NEDELOVANJA VENTILATORJA #define alert 4 // OBVESTILO O NAPAKI #define ponastavi 2 // RESET OBVESTILA #define ledPin 5 // ALARM LED #define buzz 3 // PIEZO ZVOCNIK #define ventilator 9 // FET IZHOD VENTILATORJA // VOID void setup() { pinMode(ledPin, OUTPUT); // LED pinMode(buzz, OUTPUT); // BUZZ pinMode(alert, INPUT); // ALERT pinMode(ponastavi, OUTPUT); // RESET ALERT pinMode(ventilator, OUTPUT); // VENTILATOR TCCR1B = TCCR1B & 0b11111000 | 0x05; // PWM frekvenca 30 Hz, PIN 9 in 10 pinMode(10, OUTPUT); SD.begin(10); // if (!SD.begin(10)) // { // return; // } waitUntil = millis() + interval; // STEVEC lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print(".:: LUX TECH ::."); lcd.setCursor(0,1); lcd.print("________________"); digitalWrite(ledPin, HIGH); // LED TEST analogWrite(ventilator, 255); // VENTILATOR TEST digitalWrite(ponastavi, HIGH); // ZACETNI RESET TC670 digitalWrite(ponastavi, LOW); float temperature1 = getTemp(ds1); // KLICEMO TEMPERATURO, DA NE VRNE 85 float temperature2 = getTemp(ds2); delay (2000); lcd.clear(); } // LOOP void loop() { delay (100); // ZAKASNITEV ZA UPOCASNITEV PROGRAMA (default 100) float temperature1 = getTemp(ds1); float temperature2 = getTemp(ds2); int temp = ((temperature1 + temperature2) / 2); // POVPRECNA TEMPERATURA // MAX/MIN TEMP if(temp > maxi) {maxi = temp;} if(temp < mini) {mini = temp;} // IZPIS POVPRECNE TEMPERATURE NA SD KARTICO if ((long)(millis() - waitUntil) >= 0) { myFile = SD.open("log.txt", FILE_WRITE); myFile.println(temp); myFile.close(); waitUntil = waitUntil + interval; // POCAKA DO NASLEDNJEGA INTERVALA ZAPISA } // ZA RESET ALERTA V STANJU NEVRTENJA VENTILATORJA (KO JE RPM = 0) boolean seNiVrtel = (rpm == LOW); /* IDENTICNO ZGORNJEMU STAVKU boolean seNiVrtel = false; if ( rpm == LOW ) seNiVrtel = true ; */ // RPM VENTILATORJA (PWM) GLEDE NA STANJE TEMPERATURE Z DELTA T=2 STOPINJI if ( stanje == 0 ) { if ( tempĀ >= 26 ) { rpm = 127 ; } } else if ( stanje == 50 ) { if ( temp <= 24 ) { rpm = LOW ; } else if ( temp >= 28 ) { rpm = 191 ; } } else if ( stanje == 75 ) { if ( temp <= 26 ) { rpm = 127 ; } else if ( temp >= 30 ) { rpm = 255 ; } } else // STANJE JE 255 { if ( temp <= 28 ) { rpm = 191; } } // ZAPIS RPM VENTILATORJA analogWrite(ventilator, rpm); if (( rpm != LOW) && seNiVrtel) { delay(1200); // DELAY ZARADI ZAKASNITVE VENTILATORJA PRI VKLOPU (default 1200) digitalWrite(ponastavi, HIGH); // ALERT RESET digitalWrite(ponastavi, LOW); } // PRETVORBA RPM V PROCENTE ZA IZPIS NA SD if (rpm == 255) { stanje = 100; } else if(rpm == 191) { stanje = 75; } else if(rpm == 127) { stanje = 50; } else { stanje = 0; } // BRANJE STANJA VENTILATORJA fanInfo = digitalRead(alert); // ALARM V PRIMERU ODPOVEDI SENZORJA if (abs(temperature1 - temperature2) > 6) // ALARM CE JE DELTA T PREVELIK { lcd.setCursor(0, 0); lcd.print("NAPAKA #1 "); lcd.setCursor(0, 1); lcd.print("041-297-086 "); myFile = SD.open("log.txt", FILE_WRITE); myFile.println("NAPAKA #1"); myFile.close(); analogWrite(ventilator, 255); // VENTILATOR NA 100% digitalWrite(ledPin, HIGH); analogWrite(buzz, 100); delay(500); digitalWrite(ledPin, LOW); analogWrite(buzz, LOW); delay(500); } // ALARM V PRIMERU ODPOVEDI VENTILATORJA else if ((fanInfo == LOW) && (rpm != LOW)) { lcd.setCursor(0, 0); lcd.print("NAPAKA #2 "); lcd.setCursor(0, 1); lcd.print("041-297-086 "); myFile = SD.open("log.txt", FILE_WRITE); myFile.println("NAPAKA #2"); myFile.close(); digitalWrite(ponastavi, HIGH); // ALERT RESET digitalWrite(ponastavi, LOW); digitalWrite(ledPin, HIGH); // OPOZORILNA LED DIODA analogWrite(buzz, 100); // OPOZORILNI ZVOCNIK delay(500); digitalWrite(ledPin, LOW); analogWrite(buzz, LOW); delay(500); } // PROCEDURA V PRIMERU NORMALNEGA DELOVANJA else { lcd.setCursor(0, 0); lcd.print("T:"); // IZPIS POVPRECNE TEMPERATURE lcd.setCursor(2, 0); lcd.print(temp); if (temp < 1000) lcd.print(" "); // RESITEV PROBLEMA PREKRIVANJA ENIC IN DESETIC if (temp < 100) lcd.print(" "); if (temp < 10) lcd.print(" "); lcd.setCursor(5, 0); lcd.print((char)223); lcd.setCursor(6, 0); lcd.print("C "); // IZPIS MAX TEMP lcd.setCursor(9, 0); lcd.print("H:"); lcd.setCursor(11, 0); lcd.print(maxi); if (maxi < 1000) lcd.print(" "); // RESITEV PROBLEMA PREKRIVANJA ENIC IN DESETIC if (maxi < 100) lcd.print(" "); if (maxi < 10) lcd.print(" "); lcd.setCursor(14, 0); lcd.print((char)223); lcd.setCursor(15, 0); lcd.print("C"); // IZPIS MIN TEMP lcd.setCursor(9, 1); lcd.print("L:"); lcd.setCursor(11, 1); lcd.print(mini); if (mini < 1000) lcd.print(" "); // RESITEV PROBLEMA PREKRIVANJA ENIC IN DESETIC if (mini < 100) lcd.print(" "); if (mini < 10) lcd.print(" "); lcd.setCursor(14, 1); lcd.print((char)223); lcd.setCursor(15, 1); lcd.print("C"); // IZPIS STANJA VENTILATORJA lcd.setCursor(0, 1); lcd.print("V:"); if (rpm == 255) { lcd.setCursor(2, 1); lcd.print("100 % "); } if (rpm == 191) { lcd.setCursor(2, 1); lcd.print("75 % "); } if (rpm == 127) { lcd.setCursor(2, 1); lcd.print("50 % "); } if (rpm == LOW) { lcd.setCursor(2, 1); lcd.print("STOP "); } digitalWrite(ledPin, LOW); // CE NI NAPAKE STA LED IN ZVOCNIK IZKLJUCENA analogWrite(buzz, LOW); } } // IZRACUN TEMPERATURE float getTemp(OneWire sensor){ // VRNE TEMPERATURO V STOPINJAH byte data[12]; byte addr[8]; if ( !sensor.search(addr)) { // CE NI VEC SENZORJEV NA ISTI LINIJI SE ISKANJE RESETIRA sensor.reset_search(); return -1000; } if ( OneWire::crc8( addr, 7) != addr[7]) { // Serial.println("CRC ni pravilen!"); return -1000; } if ( addr[0] != 0x10 && addr[0] != 0x28) { // Serial.print("Neznana naprava!"); return -1000; } sensor.reset(); sensor.select(addr); sensor.write(0x44,1); byte present = sensor.reset(); sensor.select(addr); sensor.write(0xBE); for (int i = 0; i < 9; i++) { // 9 BAJTOV ZA SENZOR DS18B20 data[i] = sensor.read(); } sensor.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); float TemperatureSum = tempRead / 16; return TemperatureSum; }