/* based from reader version 1.2 rtc uses caps (300+) for backup. 300-500uf has about 1-2 hours of backup time in loss of power. Default settings charges caps. If a 3v batt like cr2025 is used (a non charging backup batt) you MUST block out charging in code around line 440. It WILL overheat and burn up the pro-mini and ac adapter. */ #include //use eeprom for user input #include #include ////// ir remote pins and varr ///////// #define RECV_PIN 5 // IR sensor IRrecv irrecv(RECV_PIN); decode_results results; byte data = 0; long int killdata; #define ledWidth 64 //Q change for # of leds, 64 cube clock #define stillWidth 31 //Q change for width in 'still' menues #define SWdelay 250 // sets switch delay + blinks screen #define twomin 120000 // sets timeout length #define threemin 180000 // sets timeout length #define DToffset 152 // default temperature offset to eeprom // added to 120 for total offset // lower=lower tmp ... higher=higher tmp /////////////////////////////////////////////////////////////////// //mmmmmmmmmmmmmmmmmmmmmm pin-outs mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm #define clockPinrow 9 // row is single 595 to ground #define dataPinrow 10 #define latchrcPin 11 //latch row + col shared byte clockPin=12; #define coldataPin 13 #define RTCclock 6 //rtc pins #define RTCdataIO 7 //rtc pins #define RTCrst 8 //rtc pins //// A pins do not need to be defined //// A2 is keypad analogread(A2) 5v scale //// A3 is temperature sensor analogread(A3) 5v scale //// D5 is IR sensor (defined above as RECV_PIN 5 ) ///////// end pin-outs //////////////// //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm //mmmmmmmmmmmmmm key pad + in-line keys + remote mmmmmmmmmmmm #define SWmenu 192 // -10 ss +10 #define SWup 36 // x ? up x ? #define SWrt 72 // lf ent rt #define SWenter 40 // exit dn menu #define SWdn 160 // ------------------------- #define SWlf 24 // 18 34 66 #define SWexit 144 // 20 36 68 #define SWss 34 // 24 40 72 #define SW49 18 // -10 144 160 192 #define SW51 66 // +10 #define SWblnkl 20 // not used, need deff #define SWblnkr 68 // not used, need deff //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm ////////////// end keypad selection ////////////////////// //// function loop switches //// byte whileMenu = 0; byte whileEdit = 0; byte whileUser = 0; byte newDay=1; //once daily update rtc (no need to update every rtc read byte edc; //used in seconds display int refreshTime=0; //for rtc refresh unsigned long timeOut=0; //60,000 = 1min (240,000 4min) 1k=1sec int displayCount=0; //goes neg (used in disp1[]) int bank1 = 1023; //analogread for in-line switches ///// temperature varr byte Tforce; int Tavgtotal; float Tavg; float Tavg2; int Tread; int TdisplayC; int TdisplayF; byte TCF=3; //switch 0=no display 2= C' or 3= F' (TCF...123) int Toffset=152; //see below /// adj 'Toffset' in menu = adj temperature. /// Offset scale = +5 ... temp +1 C' /// stored in eeprom as 152 then adj by Teeadj /// because eeprom store = byte. /// store byte then add 120 for full offset /// this gives max offset of 404 /// this is confusing but i want a default offset when erased so default /// settings restored. And i want user offset to stay when power goes off. byte skip = 0; int eeInfo = 0; //eeprom info int d = 0; //eeprom write and read int dd = 1; //eeprom read to msg int x = 0; byte Five = 0; byte fiveShift = 0; byte col = 0; byte colShift = 0; byte blank = 0; //to blink cursor byte Speed = 0; //max count 256 int same = 0; int inXX = 0; // must go negetive int nextLetter = 0; //0-330+ byte allmessShift = 0; //0-7 byte messShift = 0; //0-7 byte oldStop = 0; int stopStart = 20; //scrolling speed, 257 in pause, eeprom415 //// array stored in program storage (32k) not in dynamic (2k) //// //// markers are 63,95,127 const int letter[] PROGMEM = {31,27,17,17,27, 31,16,11,11,16, //0-star, 5-A 31,0,10,10,17, 31,0,14,14,14, 31,0,14,14,17, //10-B, 15-C, 20-D 31,0,10,10,10, 31,0,11,11,11, 31,17,14,10,8, //25-E, 30-F, 35-G 31,0,27,27,0, 31,14,0,0,14, 31,28,30,30,0, //40-H, 45-I, 50-J 31,0,27,21,14, 31,0,30,30,30, 31,0,19,19,0, //55-K, 60-L, 65-M 31,0,23,27,0, 31,0,14,14,0, 31,0,11,11,3, //70-N, 75-O, 80-P 31,0,14,12,0, 31,0,11,11,20, 31,22,10,10,13, //85-Q, 90-R, 95-S 31,15,0,0,15, 31,01,30,30,1, 31,7,27,29,0, //100-T, 105-U, 110-V 31,1,24,24,1, 31,4,27,27,4, 31,7,24,24,7, //115-W, 120-X, 125-Y 31,12,10,10,6, //130-Z 31,17,14,14,17, 31,14,0,0,30, 31,8,10,10,22, //135-0, 140-1, 145-2 31,14,10,10,0, 31,3,27,27,0, 31,2,10,10,13, //150-3, 155-4, 160-5 31,16,10,10,12, 31,14,13,11,7, 31,17,10,10,17, //165-6, 170-7, 175-8 31,23,11,10,17, //180-9 31,0,95,31,31, // 185-vert line 63,30,26,30,30, 30,30,30,30,30, //190-eom, 195-underscore 31,15,23,27,29, 31,29,27,23,15, //200-\ slash L 205-/ slash R 31,15,15,95,31, 15,15,15,15,15, //210-quote 215-overscore 31,15,95,31,31, 31,25,25,25,31, //220-apost 225- = equ 2,10,0,10,8, 31,30,95,31,31, //230-doll 235-period pt 31,21,95,31,31, 31,27,27,95,31, //240-colen cln 245- - dsh 31,31,31,95,31, 31,15,8,11,3, //250-space 255-qus ? 31,2,95,31,31, 31,0,14,95,31, //260 xpl ! 265-left squ 31,31,14,0,31, 27,21,10,27,27, //270-rite squ 275-left arrow < 27,27,10,21,27, 27,23,0,23,27, //280-rite arrow 285-up arrow 27,29,0,29,27, 31,27,17,27,95, //290-down arrow 295-plus + 0,0,0,31,31, 31,31,0,0,0, //300-lite left 305-lite rite 3,3,3,3,3, 24,24,24,24,24, //310-lite up 315-lite down 0,0,0,0,0, 31,27,23,14,95, //320-lite all 325-% percent 31,21,21,95,31, 31,31,17,31,95, //330-pmrtc 335-sec1 31,29,27,23,95, 31,27,27,27,95, //340-sec2/ 345-sec3- 31,23,27,29,95, 31,21,95,31,31, //350-sec4\ 355-amrtc 31,30,28,24,16, 31,16,24,28,30, //360-rt triangle 365-lf tri 31,15,7,3,1, 31,1,3,7,15, //370-rtop tri 375-ltop tri 30,28,24,28,30, 15,7,3,7,15, //380-btm tri 385-top tri 31,31,31,95,31, }; ///390 space at end, allways change letterEnd #define letterEnd 390 //390 used for last access position of letter[] //in extensive patterns bump to higher limit. //need to change eemsgIn() to match #define st 0 //star * #define A 5 //letters are all caps #define B 10 //define uses NO memory #define C 15 #define D 20 #define E 25 #define F 30 #define G 35 #define H 40 #define I 45 #define J 50 #define K 55 #define L 60 #define M 65 #define N 70 #define O 75 #define P 80 #define Q 85 #define R 90 #define S 95 #define T 100 #define U 105 #define V 110 #define W 115 #define X 120 #define Y 125 #define Z 130 #define zer 135 #define one 140 #define two 145 #define thr 150 #define fou 155 #define fiv 160 #define six 165 #define sev 170 #define eig 175 #define nin 180 #define eom 190 //end of message ( MARKER starts with 63,30,26,30,30) #define und 195 //underscore _ #define slL 200 //slash left #define slR 205 //slash right / #define qt 210 //quote (either side) " #define ovr 215 //overscore ( MARKER must not change) #define pt 235 //peroid . #define cln 240 //colen : #define dsh 245 //dash - #define ss 250 //space ( MARKER must not change) #define qus 255 //question mark ? #define plu 295 //plus + #define pmrtc 330 //PM colen with dot #define amrtc 355 //AM colen only ////////////////////// clock setup and variables ///////////// #define Wmin 130 //register address #define Whour 132 //hour + am/pm + 12/24 //register 132=hour bit7 H = 12h, bit5 H = pm #define Wday 134 #define Wmonth 136 #define Wwday 138 #define Wyear 140 #define twelve24 128 //128=12h, 0=24h mode byte openReg = 128; //128,0 new rtc needs to be turned on byte writeData = 0; //run this to writeRTC() function //144,171 sets charger to 2diode+8k byte nowTmin=0; //0-5 byte nowmin=0; //0-9 00-59 byte nowThour=0; //0-1 byte nowhour=0; //0-9 1-12 byte nowAP=0; //0=am, am=blank 1=pm, pm=dot byte nowTday=0; //0-3 byte nowday=0; //0-9 1-31 byte nowTmonth=0; //0-1 byte nowmonth=0; //0-9 1-12 byte nowwday=0; //1-7 1=monday 7=sunday byte nowTyear=0; //0-9 byte nowyear=0; //0-9 00-99 byte conVert=0; byte x1=0; //display info byte x2=0; //clockSet() display info byte x3=0; //display info byte x4=0; //order unconvert byte xinfo=0; //global generic info byte poss=0; //possition of cursur byte dataBurst[64]; byte dataconvert[]={nowThour,nowhour,nowTmin,nowmin,nowTmonth, nowmonth,nowTday,nowday,nowTyear,nowyear }; byte dataorder[]={1,2,4,5,}; //from ttime[] byte dataorder2[]={1,2,4,5,9,10,}; //from ddate[] int ttime[]={ss,nowThour,nowhour,cln,nowTmin,nowmin,nowAP,F,R,I,eom }; int ddate[]={ss,nowTmonth,nowmonth,slR,nowTday,nowday, slR,two,zer,nowTyear,nowyear,eom }; int xorder=0; //goes negitave byte xxorder=0; byte order[]={0,1,2,3,4,5,6,7,8,9,}; //changes by 'set order' byte disp1[] = { M,I,N,U,T,E,ss,ss,ss,ss, H,O,U,R,ss,ss,ss,ss,ss,ss, //0-9 10-19 W,K,ss,D,A,Y,ss,ss,ss,ss, M,O,N,T,H,ss,ss,ss,ss,ss, //20-29 30-39 D,A,Y,ss,ss,ss,ss,ss,ss,ss, Y,E,A,R,ss,ss,ss,ss,ss,ss, //40-49 50-59 E,R,A,S,E,ss,ss,ss,ss,ss, E,D,I,T,ss,ss,ss,ss,ss,ss, //60-69 70-79 O,R,D,E,R,ss,ss,ss,ss,ss, T,E,M,P,E,T,ss,ss,ss,ss, //80-89 90-99 M,S,G,ss,ss,ss,ss,ss, M,O,N,T,U,E,W,E,D,T,H,R,F,R,I,S,A,T,S,U,N,}; //100-107 108-128 byte disp1End=90; //sets end for rotate through display int ms1[45]; int ms2[45]; int ms3[45]; int ms4[45]; int ms5[45]; int ms6[45]; int ms7[45]; int ms8[10]; int eSpace[]= { 0,46, 48,93, 95,140, 142,187, 189,234, 236,281, 283,328, 330,340, }; // ms1 ms2 ms3 ms4 ms5 ms6 ms7 ms8 //only used with user edit... only stores that current edting msg int* allmess[] = {ttime,ddate,ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8, }; //************************************************************************ //////////////////// FUNCTIONS ////////////////////////////** //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm void scanWritestill() { //need 'same' as start for x, else x=anything for (int col=0; col<=ledWidth; col++) { digitalWrite(latchrcPin, LOW); if (col==0) { Five=0; digitalWrite(coldataPin, HIGH); digitalWrite(clockPin, LOW); digitalWrite(coldataPin, HIGH); digitalWrite(clockPin, HIGH); digitalWrite(coldataPin, LOW); digitalWrite(clockPin, LOW); } //col=0 end if (col>=stillWidth) { x=9; } //blank spaces to end of screen digitalWrite(clockPin, LOW); digitalWrite(clockPin, HIGH); digitalWrite(clockPin, LOW); shiftOut(dataPinrow, clockPinrow, LSBFIRST, pgm_read_word_near(letter+(disp1[x]+Five))); digitalWrite(latchrcPin, HIGH); Five++; if (Five==5) { Five=0; x++; } } } //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm void scanWrite1() { PORTB=B00000000; // latch low PORTB=B00110000; delayMicroseconds(5); PORTB=B00000000; //one pulse } //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm void scanWrite2() { PORTB=B00000000; // latch low PORTB=B00010000; delayMicroseconds(5); PORTB=B00000000; //push pulse } //^^^^^^^^^^^^^^^^^^ end scan for led screen ^^^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm //////// FORMATT EEPROM, ALL ZERO (star), loads default readings /////////////////// //// ONLY WAY HERE IS TO ERASE in MENU ... or FIRST LOAD OF A NEW MICRO void eeformat() { for (int i=0; i<800; i++) { EEPROM.write(i,0); } //erases entire eeprom for (int i=0; i<=380; i++) { EEPROM.write(i,0); } //filled 0-380 with zeros (star) EEPROM.write(2,one); EEPROM.write(9,eom); EEPROM.write(49,two); EEPROM.write(56,eom); EEPROM.write(96,thr); EEPROM.write(103,eom); //put msg number in each msg (spot) EEPROM.write(143,fou); EEPROM.write(150,eom); EEPROM.write(190,fiv); EEPROM.write(197,eom); EEPROM.write(237,six); EEPROM.write(244,eom); EEPROM.write(284,sev); EEPROM.write(291,eom); //then stars to 380 EEPROM.write(400,0); EEPROM.write(401,1); EEPROM.write(402,2); EEPROM.write(403,3); EEPROM.write(404,4); EEPROM.write(405,5); //default order[] EEPROM.write(406,6); EEPROM.write(407,7); EEPROM.write(408,8); EEPROM.write(409,9); EEPROM.write(415,10); //default speed EEPROM.write(417,3); //default F' Toffset=DToffset; //defined default offset value ~~152 //only this line restores the #define offset EEPROM.write(419,Toffset); //default temperature offset value EEPROM.write(399,11); //switch ON (11) showing new micro got loaded eemsgIn(); } //^^^^^^^^^^^ END OF EEPROM ERACE ^^^^^^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm ///////// eemsgIn() eeprom info to msg at startup ms1,ms2,ms3... ////////// /////// and any saved paramaters, speed,order,mode,etc void eemsgIn() { x=allmessShift; //just a screen save of last allmessShift allmessShift=2; //start on msg 1 d=0; dd=0; stopStart=EEPROM.read(415); //scroll speed TCF=EEPROM.read(417); //TCF temperature C' or F' (2 or 3) Toffset=EEPROM.read(419); //tmper offset=152 (x byte (+120)) //max store is 254. then add (+120)=404 max for (int i=400; i<=409; i++) { order[d]=EEPROM.read(i); d++; } //loads order[] int eindex=0; int eeInfo=0; int dd=0; while (eindex <= 338) { //338 end place for ms8 eeInfo=EEPROM.read(eindex); switch(eeInfo) { case 0: eeInfo=0; break; //no case needed if 0 (zero) case 4: eeInfo=260; break; case 9: eeInfo=265; break; case 14: eeInfo=270; break; case 19: eeInfo=275; break; case 24: eeInfo=280; break; case 29: eeInfo=285; break; case 34: eeInfo=290; break; case 39: eeInfo=295; break; case 44: eeInfo=300; break; case 49: eeInfo=305; break; case 54: eeInfo=310; break; case 59: eeInfo=315; break; case 64: eeInfo=320; break; case 69: eeInfo=325; break; case 74: eeInfo=330; break; case 79: eeInfo=335; break; case 84: eeInfo=340; break; case 89: eeInfo=345; break; case 94: eeInfo=350; break; case 99: eeInfo=355; break; case 104: eeInfo=360; break; case 109: eeInfo=365; break; case 114: eeInfo=370; break; case 119: eeInfo=375; break; case 124: eeInfo=380; break; case 129: eeInfo=385; break; case 134: eeInfo=390; break; case 139: eeInfo=395; break; case 144: eeInfo=400; break; } allmess[allmessShift][dd] = eeInfo; dd++; eindex++; if (eindex==45) { allmessShift++; dd=0; eindex=47; } //reset for ms 2 if (eindex==92) { allmessShift++; dd=0; eindex=94; } //ms3 if (eindex==139) { allmessShift++; dd=0; eindex=141; } //ms4 if (eindex==186) { allmessShift++; dd=0; eindex=188; } //ms5 if (eindex==233) { allmessShift++; dd=0; eindex=235; } //ms6 if (eindex==280) { allmessShift++; dd=0; eindex=282; } //ms7 if (eindex==327) { allmessShift++; dd=0; eindex=329; } //ms8 } //end WHILE loop // "time_square" uses msg8 as inside temperature, default F' ms8[0]=ss; ms8[1]=360; ms8[2]=F; ms8[3]=220; ms8[4]=dsh; ms8[5]=dsh; ms8[6]=365; ms8[7]=ss; ms8[8]=eom; //F'-- allmessShift=x; } //end eein // cheated. need to store full int (2 bytes) into eeprom 1 byte. // then remove 1 byte at a time and then combine into int inside msg. // // instead I store a byte. The 'letter[]' array only logs X5, 5,10,15,20... // so when storing a msg the byte is 5,10,15,20... // ex. 'happy'= 40,5,80,80,125 (all x5) // any byte over 255 is stored x-256 because the '0' is counted. // so storing 280 as a byte the computer stores 24 // having x5 in letter[] means that 24 will never be repeated // sence only x5 are valid. // // this is where I cheated and use case to match the letter[] index // to the stored byte. // speed is not important and this is a small database to store. // this keeps the memory half by using byte instead int. // // if > 255 case converts to byte up to 400. if 'chr set' goes past // 400 need to add more case. //^^^^^^^^^^^ end of eemsgIn ^^^^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm ///////// eeStore() STORE MSG TO EEPROM + AUTO eom /////// void eeStore() { allmess[allmessShift][inXX]=eom; //eom=63 (index spot 190 in letter[] ) d=(allmessShift*2)-4; dd=0; byte oneMore=0; byte ddd=0; if (d>=2) { ddd=1; } //file skips somewhere, stupid fix, eSpace[] 0-49 bad for (int i=eSpace[d]-ddd; i<=eSpace[d+1]; i++) { EEPROM.write(i,allmess[allmessShift][dd]); dd++; if (oneMore==1) { oneMore=0; break; } if (allmess[allmessShift][dd]==eom) { oneMore=1; } //count at eom } //1 more loop to write } //end eestore //^^^^^^^^^^^ END OF eeStore ^^^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm /////////// clockSet() function ////////////////////// void clockSet() { whileMenu=1; timeOut=millis(); x1=zer; x2=zer; poss=1; blank=0; byte dispwday=108; //QQQQQQQQQQQmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm //next line = charger or you block out and use the next next line openReg = 144; writeData=171; writeRTC(); //ON: cap charger 2diodes + 8k // openReg = 144; writeData=0; writeRTC(); //OFF: no charge //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm //starts clock crystal openReg = 128; writeData = 0; writeRTC(); //turns on clock crystal if (nowhour==zer && nowThour==zer) { openReg = 132; writeData = 177; writeRTC(); } //sets to 12h mode (0 for 24h) // 177=12h mode, pm, +32=PM, +128=12h mode, +16=10hr, 0-9, // 11:00 PM = 32+128+16+1=177 while (whileMenu==1) { blank++; if(blank>=60) { blank=0; } switch(displayCount) { case 0: openReg=130; break; //min case 10: openReg=132; break; //hour case 20: openReg=138; break; //week day case 30: openReg=136; break; //month case 40: openReg=134; break; //day case 50: openReg=140; break; //year } if (displayCount==10 || displayCount==30) { //hour 1-12 or month 1-12 poss=3; if (x1==zer && x2==zer) { x1=one; } //starts screen with '1' if (readSW()==SWexit || timeOut+twomin<=millis()) { whileMenu=0; } if (readSW()==SWenter) { delay(SWdelay); if (displayCount==10) { newDay=1; unConvert(); amPM(); whileMenu=0; } if (displayCount==30) { newDay=1; unConvert(); writeData=x1+x2; writeRTC(); whileMenu=0; } } if (readSW()==SWup) { delay(SWdelay); x1+=5; if (x1==nin+5 && x2==zer) { x1=zer; x2=one; } if (x1==thr && x2==one) { x1=one; x2=zer; } } } if (displayCount==40) { //day 1-31 poss=3; if (x1==zer && x2==zer) { x1=one; } if (readSW()==SWexit || timeOut+twomin<=millis()) { whileMenu=0; } if (readSW()==SWenter) { delay(SWdelay); newDay=1; unConvert(); writeData=x1+x2; writeRTC(); whileMenu=0; } if (readSW()==SWup) { delay(SWdelay); x1+=5; if (x1==nin+5 && x2==zer) { x1=zer; x2=one; } if (x1==nin+5 && x2==one) { x1=zer; x2=two; } if (x1==nin+5 && x2==two) { x1=zer; x2=thr; } if (x1==two && x2==thr) { x1=one; x2=zer; } } } if (displayCount==20) { //mon,tue,wed,thr,fri,sat,sun 1-7 if (x1==zer && x2==zer) { x1=one; } //starts screen with '1' x2=ss; poss=3; if (readSW()==SWexit || timeOut+twomin<=millis()) { whileMenu=0; } if (readSW()==SWenter) { delay(SWdelay); newDay=1; unConvert(); writeData=x1; writeRTC(); whileMenu=0; } if (readSW()==SWup) { delay(SWdelay); x1+=5; dispwday+=3; if (x1==sev+5) { x1=one; dispwday=108; } } } if (poss==1) { //right digit possition ox if (readSW()==SWexit || timeOut+twomin<=millis()) { whileMenu=0; } if (readSW()==SWenter) { delay(SWdelay); newDay=1; unConvert(); writeData=x1+x2; writeRTC(); whileMenu=0; } if (readSW()==SWlf || readSW()==SWrt) { delay(SWdelay); poss=0; } if (readSW()==SWup) { delay(SWdelay); x1+=5; if (x1==nin+5) { x1=zer; } } if (readSW()==SWdn) { delay(SWdelay); x1-=5; if (x1==zer-5) { x1=nin; } } } if (poss==0) { //left digit possition xo if (readSW()==SWexit || timeOut+twomin<=millis()) { whileMenu=0; } if (readSW()==SWenter) { delay(SWdelay); newDay=1; unConvert(); writeData=x1+x2; writeRTC(); whileMenu=0; } if (readSW()==SWlf || readSW()==SWrt) { delay(SWdelay); poss=1; } if (readSW()==SWup) { delay(SWdelay); x2+=5; if (x2==fiv+5) { x2=zer; } } if (readSW()==SWdn) { delay(SWdelay); x2-=5; if (x2==zer-5) { x2=fiv; } } } for (int col=0; col<=ledWidth; col++) { if (col==0) { x=ss; } if (col==2) { x=x2; Five=0; } if (blank>=50 && col==2 && poss==0) { x=ss; } //blinks if (col==7) { x=x1; Five=0; } if (blank>=50 && col==7 && poss==1) { x=ss; } if (blank>=50 && col==7 && poss==3) {x=ss;} if (col==12) { x=ss; Five=0; } if (col==15) { x=disp1[displayCount+0]; Five=0; } if (col==15 && displayCount==20) { x=disp1[dispwday+0]; Five=0; } if (col>=20) { x=disp1[displayCount+1]; } if (col>=20 && displayCount==20) { x=disp1[dispwday+1]; } if (col>=25) { x=disp1[displayCount+2]; } if (col>=25 && displayCount==20) { x=disp1[dispwday+2]; } if (col>=30) { x=ss; } if (col==0) { Five=0; scanWrite1(); } scanWrite2(); shiftOut(dataPinrow, clockPinrow, LSBFIRST, pgm_read_word_near(letter+x+Five)); digitalWrite(latchrcPin, HIGH); Five++; if (Five==5) { Five=0; x++; } } //end for col } } //^^^^^^^^^^^^^ end of clockSet() ^^^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm //////////// amPM() set am/pm, + 12/24 function ///////////////// void amPM() { xinfo=A; while (whileMenu==1) { blank++; if(blank>=60) { blank=0; } if (readSW()==SWexit || timeOut+twomin<=millis()) { whileMenu=0; } if (readSW()==SWenter) { delay(SWdelay); if (xinfo==A) { xinfo=0; } else xinfo=32; openReg=132; writeData=x1+x2+xinfo+twelve24; writeRTC(); whileMenu=0; } if (readSW()==SWup && xinfo==A) { delay(SWdelay); xinfo=P; } if (readSW()==SWup && xinfo==P) { delay(SWdelay); xinfo=A; } for (int col=0; col<=ledWidth; col++) { if (col==0) { x=ss; } if (col==1) { x=xinfo; Five=0; } if (blank>=50 && col==2) { x=ss; } if (col==6) { x=M; } if (col==11 && xinfo==P) { x=pmrtc; } if (col==11 && xinfo==A) { x=amrtc; } if (col>=16) { x=ss; } if (col==0) { Five=0; scanWrite1(); } scanWrite2(); shiftOut(dataPinrow, clockPinrow, LSBFIRST, pgm_read_word_near(letter+x+Five)); digitalWrite(latchrcPin, HIGH); Five++; if (Five==5) { Five=0; x++; } } //end for col } } //^^^^^^^^^^^^^ end amPM() ^^^^^^^^^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm ////////// convert to letter[] for led //////////////// void convertRTC() { if (nowAP==1) { ttime[3]=pmrtc; } //big colen =PM colen=AM else { ttime[3]=amrtc; } switch (nowwday) { case 1: ttime[7]=M; ttime[8]=O; ttime[9]=N; break; //mon case 2: ttime[7]=T; ttime[8]=U; ttime[9]=E; break; //tue case 3: ttime[7]=W; ttime[8]=E; ttime[9]=D; break; //wed case 4: ttime[7]=T; ttime[8]=H; ttime[9]=R; break; //thr case 5: ttime[7]=F; ttime[8]=R; ttime[9]=I; break; //fri case 6: ttime[7]=S; ttime[8]=A; ttime[9]=T; break; //sat case 7: ttime[7]=S; ttime[8]=U; ttime[9]=N; break; } //end switch for (byte gg=0; gg<=9; gg++) { conVert=dataconvert[gg]; switch (conVert) { case 0: conVert=135; break; //0 case 1: conVert=140; break; //1 case 2: conVert=145; break; //2 case 3: conVert=150; break; //3 case 4: conVert=155; break; //4 case 5: conVert=160; break; //5 case 6: conVert=165; break; //6 case 7: conVert=170; break; //7 case 8: conVert=175; break; //8 case 9: conVert=180; break; } //9 end switch if (gg<=3) { ttime[dataorder[gg]]=conVert; } else ddate[dataorder2[gg-4]]=conVert; } if (ttime[1]==135) { ttime[1]=ss; } //removes '0' 04:22= 4:22 if (ddate[1]==135) { ddate[1]=ss; } //removes '0' 06/16= 6/16/2015 } //^^^^^^^^^^^^^^ end convertRTC() ^^^^^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm ////////// unConvert() letter[] back to dec ///////// void unConvert() { switch (x1) { case 135: x1=0; break; case 140: x1=1; break; case 145: x1=2; break; case 150: x1=3; break; case 155: x1=4; break; case 160: x1=5; break; case 165: x1=6; break; case 170: x1=7; break; case 175: x1=8; break; case 180: x1=9; break; } //end switch x1 switch (x2) { case 135: x2=0; break; case 140: x2=16; break; case 145: x2=32; break; case 150: x2=48; break; case 155: x2=64; break; case 160: x2=80; break; //higest numb 5 ex 57 min, no60 case 165: x2=96; break; case 170: x2=112; break; case 175: x2=128; break; case 180: x2=144; break; } //end switch x2 } //end unconvert //^^^^^^^^^^^^^^^ end unConvert ^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm //////////////// write to RTC //////////////////// void writeRTC() { pinMode(RTCdataIO,OUTPUT); // transmitt to rtc digitalWrite(RTCrst,HIGH); delayMicroseconds( 4); //new, turn on 128/0 digitalWrite(RTCclock,LOW); delayMicroseconds( 1); //130-min, 132-hour, 134-day shiftOut(RTCdataIO,RTCclock,LSBFIRST,openReg); //byte or registers to open digitalWrite(RTCclock,LOW); delayMicroseconds( 1); //136-month,138-w day,140-year shiftOut(RTCdataIO,RTCclock,LSBFIRST,writeData); //byte to write delayMicroseconds( 1); // hour #7 bit =1 to stay in 12/not 24 digitalWrite(RTCrst,LOW); } //^^^^^^^^^^^^^^^ end writeRTC ^^^^^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm ////////////// readRTC() //////////// void readRTC() { pinMode(RTCdataIO,OUTPUT); // transmitt to rtc digitalWrite(RTCrst,HIGH); delayMicroseconds( 4); digitalWrite(RTCclock,LOW); delayMicroseconds( 1); shiftOut(RTCdataIO,RTCclock,LSBFIRST,0XBF); //BF hex for burst mode digitalWrite(RTCclock,LOW); delayMicroseconds( 1); pinMode(RTCdataIO,INPUT); byte fullread; if (newDay==1) fullread=55; else fullread=20; for( byte i = 0; i <= fullread; i++) { //0-55 (56) burst dataBurst[i]=digitalRead(RTCdataIO); // bit info inside databurst array ////65 if (i>=8 && i<=11) { bitWrite(dataconvert[3], i-8, dataBurst[i]); } //nowmin if (i>=12 && i<=14) { bitWrite(dataconvert[2], i-12, dataBurst[i]); } //nowTmin if (i>=16 && i<=19) {bitWrite(dataconvert[1], i-16, dataBurst[i]); } //hour if (i==20) {bitWrite(dataconvert[0], 0, dataBurst[i]); } //nowThour if (newDay==1) { if (i==21) {bitWrite(nowAP, 0, dataBurst[i]); } //am=0, pm=1 if (i>=24 && i<=27) {bitWrite(dataconvert[7], i-24, dataBurst[i]); } //day if (i>=28 && i<=30) {bitWrite(dataconvert[6], i-28, dataBurst[i]); } //Tday if (i>=32 && i<=35) {bitWrite(dataconvert[5], i-32, dataBurst[i]); } //month if (i==36) {bitWrite(dataconvert[4], 0, dataBurst[i]); } //Tmonth if (i>=40 && i<=43) {bitWrite(nowwday, i-40, dataBurst[i]); } //monday=1 if (i>=48 && i<=51) {bitWrite(dataconvert[9], i-48, dataBurst[i]); } //year if (i>=52 && i<=55) {bitWrite(dataconvert[8], i-52, dataBurst[i]); } //Tyear } digitalWrite( RTCclock, HIGH); delayMicroseconds( 1); digitalWrite( RTCclock, LOW); delayMicroseconds( 1); } digitalWrite(RTCrst, LOW); newDay=0; } //^^^^^^^^^^^^^^^^^^ end readRTC ^^^^^^^^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm /////////// set order /////////////////////////// void whileorder() { byte order2[]={T,D,one,two,thr,fou,fiv,six,sev,eig,S,ss, //0-11, x = changes T,D,one,two,thr,fou,fiv,six,sev,eig,S, }; //same = 12-22 x=0; timeOut=millis(); whileMenu=1; //x=index in order2[] dd=0; blank=0; same=12; //same=var name called from index of order2[] //dd=cursor left or right place while (whileMenu==1) { blank++; if (blank>=60) { blank=0; } if (readSW()==SWexit || timeOut+twomin<=millis()) { whileMenu=0; } if (readSW()==SWup) { delay(SWdelay); same++; if (dd==0 && same==22 || same>=23) { same=12; } } //no stop fst coll if (readSW()==SWdn) { delay(SWdelay); same--; if (dd==0 && same==11) { same=21; } if (dd!=0 && same<=11) { same=22; } } //letter dwn if (readSW()==SWlf) { delay(SWdelay); dd--; blank=0; if (dd<0) { dd=9; } } //display left if (readSW()==SWrt) { delay(SWdelay); dd++; blank=0; if (dd>=10) { dd=0; } } //display rite if (readSW()==SWenter) { delay(SWdelay); order2[dd]=order2[same]; dd++; blank=0; if (dd>=10) { dd=0; } } if (readSW()==SWmenu) { delay(550); for (int i=0; i<=9; i++) { x4=order2[i]; switch (x4) { case 100: x4=0; break; //T=0 in allmess[] time case 20: x4=1; break; //D=1 in allmess[] date case 140: x4=2; break; //msg 1 case 145: x4=3; break; //msg 2 case 150: x4=4; break; //3 case 155: x4=5; break; //4 case 160: x4=6; break; //5 case 165: x4=7; break; //6 case 170: x4=8; break; //7 case 175: x4=9; break; } // 8 end switch x4 order[i]=x4; EEPROM.write(400+i,x4); } //end for i xorder=0; whileMenu=0; } //END SWmenu for (int col=0; col<=ledWidth; col++) { if (col==0) { x=0; } if (col==5) { x=1; } if (col==10) { x=2; } //this sets up screen display if (col==15) { x=3; } if (col==20) { x=4; } if (col==25) { x=5; } //x is the index position inside order2 array if (col==30) { x=6; } if (col==35) { x=7; } if (col==40) { x=8; } if (col==45) { x=9; } if (col>=50) { x=11; } //blanks remaining screen. if (col==((dd*5)) && blank>=50) { x=11; } //creates blinking cursor if (col==((dd*5)) && blank<=50 ) { x=same; } if (col==0) { Five=0; scanWrite1(); } scanWrite2(); shiftOut(dataPinrow, clockPinrow, LSBFIRST, pgm_read_word_near(letter+(order2[x]+Five))); digitalWrite(latchrcPin, HIGH); Five++; if (Five==5) { Five=0; } } //end for col } } //^^^^^^^^^^^^^^^^^ end whileorder ^^^^^^^^^^^^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm /////////// userMenu function keys on displayCount x 10 ///////////// void userMenu() { while (whileMenu==1) { x=displayCount; //use disp1[] array scanWritestill(); if (readSW()==SWexit || timeOut+twomin<=millis()) { whileMenu=0; break; } if (readSW()==SWup) { delay(SWdelay); displayCount+=10; if (displayCount>disp1End) { displayCount=0; } } if (readSW()==SWdn) { delay(SWdelay); displayCount-=10; if (displayCount<0) { displayCount=disp1End; } } if (readSW()==SWenter && (displayCount>=0 && displayCount<=50)) //clock function { delay(SWdelay); whileMenu=0; clockSet(); } if (readSW()==SWenter && displayCount==60) //erace function { delay(SWdelay); whileMenu=0; eeformat(); } if (readSW()==SWenter && displayCount==70) //edit function { delay(SWdelay); whileMenu=0; whileEdit=1; allmessShift=2; } if (readSW()==SWenter && displayCount==80) //order function { delay(SWdelay); whileMenu=0; whileorder(); fiveShift=0; colShift=0; } if (readSW()==SWenter && displayCount==90) //adj temperature function { delay(SWdelay); whileMenu=0; whiletemp(); } } ///////////////////// USER EDIT SELECT MSG NUMBER TO EDIT /////////////////// while (whileEdit==1) { if (readSW()==SWexit || timeOut+twomin<=millis()) { eemsgIn(); whileEdit=0; break; } if (readSW()==SWenter) { delay(SWdelay); whileEdit=0; whileUser=1; } if (readSW()==SWup) { delay(SWdelay); allmessShift++; x=0; colShift=0; if (allmessShift>=9) { allmessShift=2; } } //Q CFM * if (readSW()==SWdn) { delay(SWdelay); allmessShift--; x=0; colShift=0; if (allmessShift<=1) { allmessShift=8; } } //Q CFM * x=100; //disp1[] position switch (allmessShift) { case 2: disp1[104]=one; break; case 3: disp1[104]=two; break; case 4: disp1[104]=thr; break; case 5: disp1[104]=fou; break; case 6: disp1[104]=fiv; break; case 7: disp1[104]=six; break; case 8: disp1[104]=sev; break; //seven last. NO edit on ms8 =(temperature) } scanWritestill(); } ///////////////////////// USER INPUT LETTERS ///////////////////// //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm // same=5; //starts at 'A' inXX=0; same=allmess[allmessShift][inXX]; //starts at msg first letter while (whileUser==1) { if (readSW()==SWup) { same+=5; delay(SWdelay); //in SW letter up if (same==eom) { same+=5; } //skips eom key if (same==letterEnd+5) { same=0; } } if (readSW()==SWdn) { same-=5; delay(SWdelay); //in SW letter dwn if (same==eom) { same-=5; } //skips eom key if (same<0) { same=letterEnd; } } if (readSW()==SWss) { delay(SWdelay); same=letterEnd; } //to letter[] last place if (readSW()==SW49) { delay(SWdelay); same-=50; if (same<0) { same=letterEnd; } } if (readSW()==SW51) { delay(SWdelay); same+=50; if (same>letterEnd) { same=0; } } if (readSW()==SWlf && inXX<=43) { delay(SWdelay); inXX++; } //shift left <45 if (readSW()==SWrt) { delay(SWdelay); inXX-- ; if (inXX<=0) { inXX=0; }} if (readSW()==SWenter) { delay(SWdelay); allmess[allmessShift][inXX]=same; inXX++; if (inXX>=45) { inXX--; } } //no edit past 45 (eom) if (readSW()==SWmenu) { delay(SWdelay); eeStore(); eemsgIn(); whileUser=0; } if (readSW()==SWexit || timeOut+twomin<=millis()) { eemsgIn(); whileUser=0; } for (int col=0; col<=ledWidth; col++) { if (col==0 && inXX>1) { Five=0; nextLetter= allmess[allmessShift][-2+inXX]; } if (col==5 && inXX>0) { Five=0; nextLetter= allmess[allmessShift][-1+inXX]; } if (col==10) { blank++; Five=0; nextLetter=same; } if (col==10 && blank>=65) { if (blank>=70) { blank=0; }; Five=0; nextLetter=und; } if (col==15) { Five=0; nextLetter=allmess[allmessShift][1+inXX]; } //start of new letter if (col==20) { Five=0; nextLetter=allmess[allmessShift][2+inXX]; } if (col==25) { Five=0; nextLetter=allmess[allmessShift][3+inXX]; } if (col==30) { Five=0; nextLetter=allmess[allmessShift][4+inXX]; } if (col==35) { Five=0; nextLetter=allmess[allmessShift][5+inXX]; } if (col==40) { Five=0; nextLetter=allmess[allmessShift][6+inXX]; } if (col>=46) { nextLetter=ss; } if (col==0) { Five=0; scanWrite1(); } scanWrite2(); shiftOut(dataPinrow, clockPinrow, LSBFIRST, pgm_read_word_near(letter+(nextLetter+Five))); digitalWrite(latchrcPin, HIGH); Five++; if (Five==5) { Five=0; } }//end if col }//end while user (input letters) same=0; Five=0; inXX=0; //reset } //end edit function //^^^^^^^^^^^^ END OF INPUT LETTERS ^^^^^^^^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm /////////// temperature() indoor readings only ////////////// // // 5v o---------www-------o--------www-----------o ground // 50k A3 sensor void temperature() { Tread=analogRead(A3); Tavg=Tread+Tavg; Tavgtotal++; //counts to 35 for average reading if (Tavgtotal>=35 || Tforce==1) { //update ~ 1 min. or forced from menu change Tforce=0; Tavg=Tavg/Tavgtotal; Tavg2=((Toffset+120)-Tavg)/5; //real Celcius in float xx.xx TdisplayC=Tavg2; //C' int xx. TdisplayF=(Tavg2*1.8)+32; //real Fehrenheit int xx. if (TCF==3) { // F' display ms8[2]=F; conVert=TdisplayF *.1; tempconvert(); ms8[4]=conVert; conVert=TdisplayF %10; tempconvert(); ms8[5]=conVert; if (TdisplayF>1000) { ms8[4]=9; ms8[5]=9; } //over 100 F' } else { //display for C' ms8[2]=C; conVert=TdisplayC *.1; tempconvert(); ms8[4]=conVert; conVert=TdisplayC %10; tempconvert(); ms8[5]=conVert; } Tavgtotal=0; Tavg=0; } //end if } //end temp function //^^^^^^^^^^^^ END OF temperature ^^^^^^^^^^^^^^^^^^^^^^^ // mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm ////////////////// tempconvert() makes screen info ////////////////// void tempconvert() { switch (conVert) { case 0: conVert=135; break; //0 case 1: conVert=140; break; //1 case 2: conVert=145; break; //2 case 3: conVert=150; break; //3 case 4: conVert=155; break; //4 case 5: conVert=160; break; //5 case 6: conVert=165; break; //6 case 7: conVert=170; break; //7 case 8: conVert=175; break; //8 case 9: conVert=180; break; } //9 end switch } ///////// end tempconvert() ////////////////////////////////// ////mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm /////////// whiletemp() adj temperature function ////////// void whiletemp() { x=0; byte adding=0; int dispneg=285; timeOut=millis(); whileMenu=1; byte Teeadj; int Tdisp[] = {F,C,285,290,}; while (whileMenu==1) { if (readSW()==SWexit || timeOut+twomin<=millis()) { whileMenu=0; break; } if (readSW()==SWup) { delay(SWdelay); adding++; if (adding==4) { adding=0; } } if (readSW()==SWenter) { delay(SWdelay); whileMenu=0; if (adding==0) { TCF=3; Tforce=1; temperature(); break; } //F' display if (adding==1) { TCF=2; Tforce=1; temperature(); break; } //C' display // + or - one step to offset and stores in eeprom, erase() defaults eeprom... about 152 if (adding==2) { Teeadj=EEPROM.read(419); Teeadj++; Toffset=Teeadj; EEPROM.write(419,Teeadj); Tforce=1; temperature(); break; } if (adding==3) { Teeadj=EEPROM.read(419); Teeadj--; Toffset=Teeadj; EEPROM.write(419,Teeadj); Tforce=1; temperature(); break; } }//end enter if for (int col=0; col<=ledWidth; col++) { if (col==0) { Five=0; x=ss; scanWrite1(); } if (col==5) { Five=0; x=Tdisp[adding]; } if (col>=10) { x=ss; } //blank scanWrite2(); shiftOut(dataPinrow, clockPinrow, LSBFIRST, pgm_read_word_near(letter+x+Five)); digitalWrite(latchrcPin, HIGH); Five++; if (Five==5) { Five=0; } } //end for col } //end whileMenu } //end whiletemp /////// end whiletemp function //////////////////////////////////// ///mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm /////////// myScreen() user created screens ////// void myScreen() { whileMenu=1; timeOut=millis(); fiveShift=0; colShift=0; x=0; Five=0; nextLetter=0; } ///want to make a user defined screen //^^^^^^^^^^^^^ end myScreen() ^^^^^^^^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm /////////////////// readSW() function ////////////////////// //has two sections 1. for ir remote, 2. for 10 push switches byte readSW(void) { //irrecv keeps data alive and when called by a second readSW(), data is not updated. //killdata forces updated data. or code each call to use and kill data in that line //all sw have delay of 120-250 so killdata under this time length if (killdata+100<=millis()) { data=0; } //must use data or reset to zero if (data>0) { return(data); } //data good.. no update if (irrecv.decode(&results)) { //if got new data switch(results.value) { case 0xFF629D: data=0; break; //may use later case 0xFF22DD: data=0; break; // '' case 0xFF02FD: data=0; break; case 0xFFC23D: data=0; break; case 0xFFA857: data=0; break; case 0xFF6897: data=18; break; //-10 case 0xFF9867: data=34; break; //pause case 0xFFB04F: data=66; break; //+10 case 0xFF30CF: data=0; break; case 0xFF18E7: data=36; break; //up case 0xFF7A85: data=0; break; case 0xFF10EF: data=24; break; //left case 0xFF38C7: data=40; break; //enter case 0xFF5AA5: data=72; break; //rite case 0xFF42BD: data=144; break; //exit case 0xFF4AB5: data=160; break; //down case 0xFF52AD: data=192; break; //menu default: data=0; break; //default }// End Case irrecv.resume(); // Receive the next value killdata=millis(); //sheds data timeOut=millis(); return(data); } //end irrecv bank1 = analogRead(A2); if (bank1>=960) { data=0; return(data); } //no sw pushed, A2=1023 (HI) else { delayMicroseconds(50); bank1=analogRead(A2); } // Serial.println(bank1); switch(bank1) { //5v usb case 0 ... 10: data=144; break; //exit 0-5 case 110 ... 135: data=192; break; //menu 118-122 case 217 ... 245: data=34; break; //pau-ss 228-229 case 320 ... 350: data=40; break; //enter 334-335 case 422 ... 450: data=160; break; //down 434-436 case 520 ... 550: data=36; break; //up 534-535 case 615 ... 650: data=24; break; //left 631-630 case 710 ... 745: data=72; break; //rite 728-725 case 805 ... 840: data=18; break; //-10 825-821 case 900 ... 940: data=66; break; //+10 924-917 default: data=0; break; } //end case timeOut=millis(); bank1=1023; return(data); } //end function /////////////// END readSW() ///////////////////// //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm //^^^^^^^^^^^^^^^ END of FUNCTIONS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm //HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH //...................................................................... //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void setup() { ///////////////////// runs one time only ///////// // Serial.begin(9600); if (EEPROM.read(399)!=11) { eeformat(); } //new micro gets loaded and 11 ON eemsgIn(); //loads msg from stored in eeprom pinMode(latchrcPin, OUTPUT); //shared latch row + coll pinMode(clockPin, OUTPUT); pinMode(coldataPin, OUTPUT); // columns pinMode(clockPinrow, OUTPUT); pinMode(dataPinrow, OUTPUT); // rows pinMode(RTCclock,OUTPUT); pinMode(RTCdataIO,OUTPUT); pinMode(RTCrst,OUTPUT); irrecv.enableIRIn(); // Start the receiver } //end setup //^^^^^^^^^^^^^^ END of setup ^^^^^^^^^^^^^^^^ //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm //zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz //uuuuuuuuuuuuuuuuuuuuuuuuUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU //HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH void loop() { refreshTime++; //about 1.2sec refresh rtc and temperature if (refreshTime==100) { temperature(); } //read temperature sensor if(refreshTime>=120) { refreshTime=0; readRTC(); convertRTC(); edc=0; ttime[6]=335; if (ttime[2]==two && ttime[4]==zer && ttime[5]==zer) { newDay=1; } } if(refreshTime==30 || refreshTime==60 || refreshTime==90 ) { edc+=5; ttime[6]=335+edc; } //spinn clock display // Serial.println(readSW()); // delay(200); ////////////////// SIX button enter for functions //////////// ///////// ss,rt,lf,up,dn,menu //////////// switch(readSW()) { case 0: break; //no switch pushed no need to continu to read case case SWss: delay(SWdelay); //pause or space or up/down if (stopStart<32) { oldStop=stopStart; stopStart=257; } //byte stopstart never> 256 else { stopStart=oldStop; } //normal display paus break; case SWrt: delay(120); if(stopStart==257) { stopStart=oldStop; } //remove from pause else stopStart++; ////slower if (stopStart>=26) { stopStart=25; } //slow limit stop EEPROM.write(415,stopStart); break; case SWlf: delay(120); if(stopStart==257) { stopStart=oldStop; } //remove from pause else stopStart--; ////faster if (stopStart<=2) { stopStart=2; } //fast limit stop EEPROM.write(415,stopStart); break; case SWup: delay(SWdelay); xorder++; if (order[xorder]==S || xorder>9) { xorder=0; } x=0; colShift=0; fiveShift=0; allmessShift=order[xorder]; break; case SWdn: delay(SWdelay); xorder--; if (xorder<0) { xorder=9; } //xorder goes '-' must be 'int' if (order[xorder]==S) { xorder--; } x=0; colShift=0; fiveShift=0; allmessShift=order[xorder]; break; case SWmenu: displayCount=0; whileMenu=1; userMenu(); break; } //end case readsw() //////////// end readSW() function //////////////////// ////////////////// LED DISPLAY SCREEN /////////////////// /////////// left scroll mode //////////////////////////// Speed++; nextLetter=allmess[allmessShift][colShift]+fiveShift; if (pgm_read_word_near(letter+nextLetter)==95 ) { fiveShift=0; colShift++; nextLetter=allmess[allmessShift][colShift]+fiveShift; } //95 marker for space <5 if ( pgm_read_word_near(letter+nextLetter)==63) { fiveShift=0; colShift=0; xorder++; if (order[xorder]==S || xorder>9) { xorder=0; } allmessShift=order[xorder]; nextLetter=allmess[allmessShift][colShift]+fiveShift; } //eol end of line reset Five=fiveShift; x=colShift; xxorder=xorder; messShift=allmessShift; //sends out first pulse, 'for loop' pushes one pulse to end PORTB=B00000000; // latch low PORTB=B00110000; delayMicroseconds(5); PORTB=B00000000; //one pulse for (int col=0; col<=ledWidth; col++) { PORTB=B00000000; // latch low if (col>0) { PORTB=B00010000; delayMicroseconds(5); PORTB=B00000000; } //push pulse shiftOut(dataPinrow, clockPinrow, LSBFIRST, pgm_read_word_near(letter+nextLetter)); PORTB=B00001000; //latch hi Five++; nextLetter++; //Five=counter nextLetter++=fiveShift if (Five>=5) { Five=0; x++; nextLetter=allmess[messShift][x]; } //makes 5 to end x++=colShift if (pgm_read_word_near(letter+nextLetter)==95 ) //95 marker for adjusting width <5 { Five=0; x++; nextLetter=allmess[messShift][x]; } if (pgm_read_word_near(letter+nextLetter)==63) { x=0; Five=0; xxorder++; if (order[xxorder]==S || xxorder>9) { xxorder=0; } messShift=order[xxorder]; nextLetter=allmess[messShift][x]; } //eom if (Speed==stopStart) { Speed=0; fiveShift++; if (fiveShift>=5) { fiveShift=0; colShift++; } } } //col loop end } //void loop end THE END END END END zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm /* all my latest modles use 10 switches + 10 1k resistors. I have a pull-up resistor on pin A2 51k. anything around 40-80k is good but you will have to 'serial monitor' the new window values for each switch. */