Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Wire.h>
- #include <OneWire.h>
- #include <SPI.h>
- #include <SD.h>
- #include <LiquidCrystal_I2C.h>
- #include <DallasTemperature.h>
- #include "RTClib.h"
- #include <IRremote.h>
- #include "PCF8574.h"
- #define ONE_WIRE_BUS 4
- LiquidCrystal_I2C lcd(0x21,16,2);
- RTC_DS1307 RTC;
- IRsend irsend;
- PCF8574 expander;
- char INBYTE;
- OneWire oneWire(ONE_WIRE_BUS);
- DallasTemperature sensors(&oneWire);
- DeviceAddress temp1={0x28, 0x48, 0x08, 0xA1, 0x04, 0x00, 0x00, 0x4C};
- DeviceAddress temp2={0x28, 0x7A, 0x8C, 0x9F, 0x03, 0x00, 0x00, 0x3C};
- File dataFile;
- int switchPin = 2;
- int BedLed = 9;
- int PcLed = A2;
- int lcdBacklight = A3;
- int photocellPin = 0;
- int photocellReading;
- int LuxReading;
- int pirPin = 5;
- int resolution = 11;
- int delayInMillis = 0;
- int idle = 0;
- int tempMax = 0.0;
- int tempMin = 30.0;
- int lastTime = -1;
- const int chipSelect = 10;
- const int batteryPin = 1;
- boolean lastButton = LOW;
- boolean currentButton = LOW;
- unsigned long lastTempRequest = 0;
- float temperature1 = 0.0;
- float temperature2 = 0.0;
- const float referenceVolts = 5.0; //
- byte newChar[8] = {B00110, B01001, B01001, B00110, B00000, B00000, B00000, B00000}; //znak stopni
- int latchPin = 8;
- int clockPin =6;
- int dataPin = 7;
- int segmentSelect[4]= { 1,2,4,8 };
- int seven_seg_digits[10]={ 192,249,164,176,153,146,130,248,128,152 };
- long interval = 1000;
- int firstDigit=0;
- int secondDigit=0;
- int thirdDigit=0;
- int fourthDigit=0;
- long previousMillis = 0;
- void setup() {
- Serial.begin(19200);
- Wire.begin();
- RTC.begin();
- SD.begin();
- expander.begin(0x20);
- lcd.init();
- pinMode(switchPin, INPUT);
- pinMode(SS, OUTPUT);
- pinMode(BedLed, OUTPUT);
- pinMode(pirPin, INPUT);
- pinMode(PcLed, OUTPUT);
- pinMode(lcdBacklight, OUTPUT);
- pinMode(latchPin, OUTPUT);
- pinMode(clockPin, OUTPUT);
- pinMode(dataPin, OUTPUT);
- for (int i=0; i<8; i++)
- expander.pinMode(i, OUTPUT);
- expander.digitalWrite(4, HIGH);
- sensors.begin();
- sensors.setResolution(temp1, resolution);
- sensors.setResolution(temp2, resolution);
- sensors.setWaitForConversion(false);
- sensors.requestTemperatures();
- delayInMillis = 750 / (1 << (12 - resolution));
- lastTempRequest = millis();
- char filename[] = "LOGGER00.CSV";
- for (uint8_t i = 0; i < 100; i++) {
- filename[6] = i/10 + '0';
- filename[7] = i%10 + '0';
- if (! SD.exists(filename)) {
- dataFile = SD.open(filename, FILE_WRITE);
- break;
- }
- }
- dataFile.println("datetime, temp1, temp2");
- RTC.adjust(DateTime(__DATE__, __TIME__));
- displayLCDstart();
- }
- void loop() {
- displayNumber();
- // displayLCD(); < --------- this causing flickering
- pir();
- // getTemp(); < --------- this causing flickering
- logs();
- logSD();
- if (Serial.available() < 1) return;
- else {
- serialread();
- }
- }
- void getTemp() {
- if (millis() - lastTempRequest >= delayInMillis)
- {
- temperature1 = sensors.getTempC(temp1);
- temperature2 = sensors.getTempC(temp2);
- sensors.requestTemperatures();
- lastTempRequest = millis();
- }
- }
- void serialread() {
- INBYTE = Serial.read(); // read next available byte
- if( INBYTE == '1' ) digitalWrite(BedLed, HIGH);
- if( INBYTE == '2' ) digitalWrite(BedLed, LOW);
- if( INBYTE == '6' ) digitalWrite(PcLed, HIGH);
- if( INBYTE == '5' ) digitalWrite(PcLed, LOW);
- if( INBYTE == '3' ) digitalWrite(lcdBacklight, HIGH);
- if( INBYTE == '4' ) digitalWrite(lcdBacklight, LOW);
- if( INBYTE == '8' ) expander.digitalWrite(4, LOW);
- if( INBYTE == '7' ) expander.digitalWrite(4, HIGH);
- if( INBYTE == 'a' ) irsend.sendNEC(0xFF00FF, 32); // Audio On/Off
- if( INBYTE == 'b' ) irsend.sendNEC(0xFF8877, 32); // Audio Vol Up
- if( INBYTE == 'c' ) irsend.sendNEC(0xFF08F7, 32); // Audio Vol Down
- if( INBYTE == 'd' ) irsend.sendNEC(0xFF50AF, 32); // Audio Bass Up
- if( INBYTE == 'e' ) irsend.sendNEC(0xFF708F, 32); // Audio Bass Down
- if( INBYTE == 'f' ) irsend.sendNEC(0xFF906F, 32); // Audio Treble Up
- if( INBYTE == 'g' ) irsend.sendNEC(0xFFB04F, 32); // Audio Treble Down
- if( INBYTE == 'h' ) irsend.sendNEC(0xFF20DF, 32); // Audio Change Input
- if( INBYTE == 'i' ) irsend.sendSamsung(0xE0E0807F, 38); // TV Source
- if( INBYTE == 'j' ) irsend.sendSamsung(0xE0E0E01F, 38); // TV Vol Up
- if( INBYTE == 'k' ) irsend.sendSamsung(0xE0E0D02F, 38); // TV Vol Down
- if( INBYTE == 'l' ) irsend.sendSamsung(0xE0E040BF, 38); // TV ON/OFF
- if( INBYTE == 'm' ) irsend.sendSamsung(0xE0E048B7, 38); // TV Chanel Up
- if( INBYTE == 'n' ) irsend.sendSamsung(0xE0E008F7, 38); // TV Chanel Down
- }
- boolean debounce(boolean last)
- {
- boolean current = digitalRead(switchPin);
- if (last != current)
- {
- delay(5);
- current = digitalRead(switchPin);
- }
- return current;
- }
- void pir() {
- if (LuxReading < 70){
- if (digitalRead(pirPin) == HIGH) {
- digitalWrite(BedLed, HIGH);
- }
- else {
- digitalWrite(BedLed, LOW);
- }
- }
- }
- void displayLCDstart() {
- lcd.createChar(0, newChar);
- lcd.clear();
- lcd.setCursor(2,0);
- lcd.print("Home Temp");
- lcd.setCursor(8,1);
- lcd.print("by CoX");
- delay(1500);
- }
- void displayLCD() {
- DateTime now = RTC.now();
- currentButton = debounce(lastButton);
- if (lastButton == LOW && currentButton == HIGH)
- {
- DateTime now = RTC.now();
- lcd.clear();
- lcd.setCursor(3,0);
- if(now.day() < 10)
- {
- lcd.print("0");
- }
- lcd.print(now.day(), DEC);
- lcd.print('/');
- if(now.month() < 10)
- {
- lcd.print("0");
- }
- lcd.print(now.month(), DEC);
- lcd.print('/');
- lcd.print(now.year(), DEC);
- lcd.setCursor(1,1);
- lcd.print("Max=");
- lcd.print(tempMax);
- lcd.print(" Min=");
- lcd.print(tempMin);
- delay(3000);
- }
- lastButton = currentButton;
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print(temperature1);
- lcd.write(8);
- lcd.print("C");
- lcd.setCursor(10,0);
- if(now.hour() < 10)
- {
- lcd.print("0");
- }
- lcd.print(now.hour(), DEC);
- lcd.print(':');
- if(now.minute() < 10)
- {
- lcd.print("0");
- }
- lcd.print(now.minute(), DEC);
- lcd.setCursor(0,1);
- lcd.print(temperature2);
- lcd.write(8);
- lcd.print("C");
- }
- void logs() {
- photocellReading = analogRead(photocellPin);
- LuxReading = map(photocellReading, 0, 1023, 10, 900);
- int val = analogRead(batteryPin);
- float volts = (val / 1023.0) * referenceVolts;
- Serial.print(temperature1);
- Serial.print(temperature2);
- if (LuxReading < 100) {
- Serial.print("0");
- Serial.print(LuxReading);
- }
- else {
- Serial.print(LuxReading);
- }
- Serial.println(volts);
- Serial.print('\r');
- Serial.flush();
- tempMin = min(tempMin, temperature1);
- tempMax = max(tempMax, temperature1);
- }
- void logSD() {
- DateTime now = RTC.now();
- int time = now.second();
- if (abs(time - lastTime) > 10)
- {
- dataFile.print('"');
- dataFile.print(now.day(), DEC);
- dataFile.print("/");
- dataFile.print(now.month(), DEC);
- dataFile.print("/");
- dataFile.print(now.year(), DEC);
- dataFile.print(" ");
- dataFile.print(now.hour(), DEC);
- dataFile.print(":");
- dataFile.print(now.minute(), DEC);
- dataFile.print(":");
- dataFile.print(now.second(), DEC);
- dataFile.print('"');
- dataFile.print(", ");
- dataFile.print(temperature1);
- dataFile.print(", ");
- dataFile.print(temperature2);
- dataFile.print(", ");
- dataFile.println();
- dataFile.flush();
- lastTime = time;
- }
- }
- void clearDisplay() {
- digitalWrite(latchPin, LOW);
- shiftOut(dataPin, clockPin, MSBFIRST, 0);
- shiftOut(dataPin, clockPin, MSBFIRST, 0);
- digitalWrite(latchPin, HIGH);
- }
- void displayNumber() {
- long beginTime = millis();
- for(int digit = 4 ; digit > 0 ; digit--) {
- switch(digit) {
- case 1:
- displayDigitOne();
- break;
- case 2:
- displayDigitTwo();
- break;
- case 3:
- displayDigitThree();
- break;
- case 4:
- displayDigitFour();
- break;
- }
- delayMicroseconds(2000);
- updateDisplay();
- clearDisplay();
- }
- }
- void updateDisplay() {
- DateTime now = RTC.now();
- firstDigit=now.hour()/10;
- secondDigit=now.hour()%10;
- thirdDigit=now.minute()/10;
- fourthDigit=(now.minute()%10);
- }
- void displayDigitOne() {
- digitalWrite(latchPin, LOW);
- shiftOut(dataPin, clockPin, MSBFIRST, seven_seg_digits[firstDigit]);
- shiftOut(dataPin, clockPin, MSBFIRST, segmentSelect[0]);
- digitalWrite(latchPin, HIGH);
- }
- void displayDigitTwo() {
- digitalWrite(latchPin, LOW);
- shiftOut(dataPin, clockPin, MSBFIRST, seven_seg_digits[secondDigit]);
- shiftOut(dataPin, clockPin, MSBFIRST, segmentSelect[1]);
- digitalWrite(latchPin, HIGH);
- }
- void displayDigitThree() {
- digitalWrite(latchPin, LOW);
- shiftOut(dataPin, clockPin, MSBFIRST, seven_seg_digits[thirdDigit]);
- shiftOut(dataPin, clockPin, MSBFIRST, segmentSelect[2]);
- digitalWrite(latchPin, HIGH);
- }
- void displayDigitFour() {
- digitalWrite(latchPin, LOW);
- shiftOut(dataPin, clockPin, MSBFIRST, seven_seg_digits[fourthDigit]);
- shiftOut(dataPin, clockPin, MSBFIRST, segmentSelect[3]);
- digitalWrite(latchPin, HIGH);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement