Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <LiquidCrystal.h>
- #include <avr/pgmspace.h>
- #include <Time.h>
- #include <IRremote.h>
- #include <NewSoftSerial.h>
- #define recvPin 10 //Pin na katerem je IR sprejemnik
- #define virtualSerialRX 6
- #define virtualSerialTX 7
- #define onRelay 9
- #define offRelay 8
- #define TONE_PIN 13
- #define an_gumbi 0
- #define an_light 1
- NewSoftSerial mySerial(virtualSerialRX, virtualSerialTX);
- IRrecv irrecv(recvPin);
- IRsend irsend;
- decode_results results;
- short int st_oseb = 1;
- boolean luc_prizgana = false;
- unsigned short int svetlost = 0;
- unsigned long int cas_off = 0;
- byte smiley[8] = {
- B01110,
- B10001,
- B11011,
- B10101,
- B11111,
- B10001,
- B01110,
- };
- //Flash based string table. Necessary because otherwise the strings will take up all of our ram.
- prog_char string_0[] PROGMEM = "< Luc on/off >";
- prog_char string_1[] PROGMEM = "< Budilka >";
- prog_char string_2[] PROGMEM = "3. DODAJ UPORABNIKA";
- prog_char string_3[] PROGMEM = "< Nastavi uro >";
- prog_char string_4[] PROGMEM = "< Pokazi RAM >";
- prog_char string_5[] PROGMEM = "< Zapri meni >";
- prog_char string_6[] PROGMEM = " ";
- prog_char string_7[] PROGMEM = "V teku...";
- prog_char string_8[] PROGMEM = "Napaka!";
- prog_char string_9[] PROGMEM = "Koncano!";
- PROGMEM const char *StringTable[] = {string_0, string_1, string_2, string_3, string_4, string_5, string_6, string_7, string_8, string_9};
- //Zacasni spremenljivki, ki jih uporabljamo znotraj programa - tako prihranimo na RAMu
- char buffer[21];
- char minibuff[5];
- time_t cas;
- boolean budilka_nastavljena;
- unsigned short int budilka_ura;
- unsigned short int budilka_minuta;
- short int meniOpcija = 0;
- LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
- void setup()
- {
- pinMode(onRelay, OUTPUT);
- pinMode(offRelay, OUTPUT);
- pinMode(TONE_PIN, OUTPUT);
- mySerial.begin(9600);
- irrecv.enableIRIn();
- Serial.begin(9600);
- Serial.println("start");
- lcd.createChar(0, smiley);
- lcd.begin(16, 2);
- //lcd.print("Start now");
- lcd.clear();
- //availableMemory();
- }
- //Funkcija systemSync poskrbi za nastavljanje ure in datuma (poslje zahtevek za uro na racunalnik in prebere rezultate)
- void systemSync()
- {
- lcd.clear();
- lcd.setCursor(0,1);
- strcpy_P(buffer, (char*)pgm_read_word(&(StringTable[7]))); //Izpiši "V teku..."
- lcd.print(buffer);
- Serial.flush();
- Serial.print("IN\0");
- delay(5000);
- unsigned int index = 0;
- while (Serial.available() > 0)
- {
- buffer[index] = Serial.read();
- index++;
- if (index > 14)
- {
- break;
- }
- }
- unsigned short int i = 0;
- if (buffer[i] == 'N' && buffer[i+1] == 'C' && buffer[i+2] == '=')
- {
- unsigned short int ura = 0;
- unsigned short int minuta = 0;
- unsigned short int dan = 0;
- unsigned short int mesec = 0;
- unsigned short int leto = 0;
- minibuff[0] = buffer[i+3];
- minibuff[1] = buffer[i+4];
- minibuff[2] = '\0';
- ura = atoi(minibuff);
- minibuff[0] = buffer[i+5];
- minibuff[1] = buffer[i+6];
- minibuff[2] = '\0';
- minuta = atoi(minibuff);
- minibuff[0] = buffer[i+7];
- minibuff[1] = buffer[i+8];
- minibuff[2] = '\0';
- dan = atoi(minibuff);
- minibuff[0] = buffer[i+9];
- minibuff[1] = buffer[i+10];
- minibuff[2] = '\0';
- mesec = atoi(minibuff);
- minibuff[0] = buffer[i+11];
- minibuff[1] = buffer[i+12];
- minibuff[2] = buffer[i+13];
- minibuff[3] = buffer[i+14];
- minibuff[4] = '\0';
- leto = atoi(minibuff);
- setTime(ura, minuta, 0, dan, mesec, leto);
- }
- if (timeStatus() == timeSet || timeStatus() == timeNeedsSync)
- {
- lcd.clear();
- lcd.setCursor(0,1);
- strcpy_P(buffer, (char*)pgm_read_word(&(StringTable[9])));
- lcd.print(buffer);
- cas = now();
- }
- else
- {
- lcd.clear();
- lcd.setCursor(0,1);
- strcpy_P(buffer, (char*)pgm_read_word(&(StringTable[8])));
- lcd.print(buffer);
- }
- delay(3000);
- }
- void showFirstLine()
- {
- strcpy_P(buffer, (char*)pgm_read_word(&(StringTable[6])));
- lcd.setCursor(0,0);
- lcd.print(buffer);
- }
- void showHomeScreen()
- {
- cas = now();
- strcpy_P(buffer, (char*)pgm_read_word(&(StringTable[6])));
- itoa(hour(cas), minibuff, 10);
- if (hour(cas) < 10)
- {
- buffer[0] = '0';
- buffer[1] = minibuff[0];
- }
- else
- {
- buffer[0] = minibuff[0];
- buffer[1] = minibuff[1];
- }
- buffer[2] = ':';
- itoa(minute(cas), minibuff, 10);
- if (minute(cas) < 10)
- {
- buffer[3] = '0';
- buffer[4] = minibuff[0];
- }
- else
- {
- buffer[3] = minibuff[0];
- buffer[4] = minibuff[1];
- }
- itoa(day(cas), minibuff, 10);
- if (day(cas) < 10)
- {
- buffer[6] = '0';
- buffer[7] = minibuff[0];
- }
- else
- {
- buffer[6] = minibuff[0];
- buffer[7] = minibuff[1];
- }
- buffer[8] = '.';
- itoa(month(cas), minibuff, 10);
- if (month(cas) < 10)
- {
- buffer[9] = '0';
- buffer[10] = minibuff[0];
- }
- else
- {
- buffer[9] = minibuff[0];
- buffer[10] = minibuff[1];
- }
- buffer[11] = '.';
- itoa(year(cas), minibuff, 10);
- buffer[12] = minibuff[0];
- buffer[13] = minibuff[1];
- buffer[14] = minibuff[2];
- buffer[15] = minibuff[3];
- lcd.setCursor(0,0);
- lcd.print(buffer);
- strcpy_P(buffer, (char*)pgm_read_word(&(StringTable[6])));
- //lcd.setCursor(0,1);
- //lcd.print(buffer);
- lcd.setCursor(0,1);
- lcd.write(0);
- itoa(st_oseb, minibuff, 10);
- if (st_oseb < 10)
- {
- buffer[0] = minibuff[0];
- buffer[1] = ' ';
- }
- else
- {
- buffer[0] = minibuff[0];
- buffer[1] = minibuff[1];
- }
- buffer[2] = ' ';
- lcd.print(buffer);
- }
- int availableMemory() {
- int size = 2048; // Use 2048 with ATmega328
- byte *buf;
- while ((buf = (byte *) malloc(--size)) == NULL)
- ;
- free(buf);
- return size;
- }
- void scanSerial()
- {
- if (mySerial.available() > 0)
- {
- minibuff[0] = mySerial.read();
- delay(500);
- if (minibuff[0] == 'S')
- {
- minibuff[1] = mySerial.read();
- minibuff[2] = mySerial.read();
- if (minibuff[1] == 'T' && minibuff[2] == '=')
- {
- minibuff[0] = mySerial.read();
- minibuff[1] = mySerial.read();
- minibuff[2] = '\0';
- short int osebice = atoi(minibuff);
- Serial.println("poslana vrednost");
- Serial.println(osebice);
- autoLight(st_oseb, osebice);
- if (osebice != st_oseb)
- {
- noise(true);
- noise(true);
- noise(false);
- }
- st_oseb = osebice;
- }
- }
- }
- }
- void scanRemote()
- {
- if (irrecv.decode(&results))
- {
- switch (results.value)
- {
- case 0x20DF30CF: Serial.println("Power pritisnjen"); digitalWrite(onRelay, HIGH); delay(1000); digitalWrite(onRelay, LOW); break;
- case 0x20DFB04F: Serial.print("Svetloba: "); Serial.println(svetlost);break;
- case 0x20DFB847: mySerial.print("ST=0"); mySerial.print(st_oseb+1); mySerial.print("\0"); delay(100); Serial.println("play"); break;
- case 0x20DFB24D: mySerial.print("ST=0"); mySerial.print(st_oseb-1); mySerial.print("\0"); delay(100); Serial.println("pauza"); break;
- case 0x20DF0AF5: Serial.println("luc prizigam..."); prizgiLuc(); break;
- }
- irrecv.resume();
- }
- }
- void scanButton()
- {
- int prebrano = analogRead(0);
- if (prebrano <= 10)
- {
- }
- else if (prebrano <= 30)
- {
- meniOpcija++;
- if (meniOpcija > 6)
- {
- meniOpcija = 1;
- }
- showMenu();
- }
- else if (prebrano <= 120)
- {
- meniOpcija--;
- if (meniOpcija < 1)
- {
- meniOpcija = 6;
- }
- showMenu();
- }
- else if (prebrano <= 250)
- {
- switch (meniOpcija)
- {
- case 0: break;
- case 1: (luc_prizgana == true ? ugasniLuc() : prizgiLuc()); break; //if luc == prizgana -> ugasni luc, if luc == ugasnjena -> prizgi luc
- case 2: break;
- case 3: break;
- case 4: systemSync(); break;
- case 5: lcd.clear(); lcd.setCursor(0,0); lcd.print("Prosti RAM: "); lcd.setCursor(0,1); lcd.print(availableMemory()); delay(5000); break;
- case 6: meniOpcija = 0; break;
- }
- showMenu();
- }
- else
- {
- }
- }
- void showMenu()
- {
- if (meniOpcija == 0)
- {
- showHomeScreen();
- }
- else
- {
- showFirstLine();
- strcpy_P(buffer, (char*)pgm_read_word(&(StringTable[6])));
- lcd.setCursor(0,1);
- lcd.print(buffer);
- lcd.setCursor(0,1);
- strcpy_P(buffer, (char*)pgm_read_word(&(StringTable[meniOpcija-1])));
- lcd.print(buffer);
- }
- delay(500);
- }
- void autoLight(int old_st, int new_st)
- {
- if (old_st == 0 && new_st > 0)
- {
- if (svetlost < 600 && luc_prizgana == false)
- {
- prizgiLuc();
- }
- cas_off = 0;
- }
- }
- void ugasniLuc()
- {
- digitalWrite(offRelay, HIGH);
- delay(1000);
- digitalWrite(offRelay, LOW);
- luc_prizgana = false;
- cas_off = 0;
- }
- void prizgiLuc()
- {
- digitalWrite(onRelay, HIGH);
- delay(1000);
- digitalWrite(onRelay, LOW);
- luc_prizgana = true;
- cas_off = 0;
- }
- void scanSensor()
- {
- svetlost = analogRead(an_light);
- if ((st_oseb <= 0) && (luc_prizgana == true))
- {
- if (cas_off == 0)
- {
- cas_off = millis();
- Serial.println("Ugasanje...");
- }
- if (millis() > cas_off + 300000)
- {
- ugasniLuc();
- Serial.println("Ugasnjeno!");
- }
- }
- }
- void noise(boolean up)
- {
- if (up == true)
- {
- tone(TONE_PIN, 1175);
- delay(170);
- noTone(TONE_PIN);
- }
- else
- {
- tone(TONE_PIN, 784);
- delay(170);
- noTone(TONE_PIN);
- }
- }
- void loop()
- {
- scanSensor();
- scanSerial();
- scanButton();
- scanRemote();
- if (meniOpcija == 0)
- {
- showHomeScreen();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement