// Programvare for Ut og Fly størst verdi - Utført for Norsk Jernbanemuseum // Vitensenteret i Trondheim, v/Nils Kr. Rossing - 14.09.19 // Denne versjonen tar hensyn til at modellen kan bli stående i mørke // Den vi da renske bordet en gang og ikke mer. // IO-port nummer int LDR_0 = 10; int LDR_1 = 9; int LDR_2 = 8; int LDR_3 = 7; int LDR_4 = 6; int LDR_5 = 5; int LDR_6 = 4; int LDR_7 = 3; int LDR_8 = 2; int LDR_9 = 1; int LDR_10 = 0; // Flagg for posisjoner som er tildekket int LDR_0_F = 0; int LDR_1_F = 0; int LDR_2_F = 0; int LDR_3_F = 0; int LDR_4_F = 0; int LDR_5_F = 0; int LDR_6_F = 0; int LDR_7_F = 0; int LDR_8_F = 0; int LDR_9_F = 0; int LDR_10_F = 0; // Avleste verdier for lyssensorer int LL_0; int LL_1; int LL_2; int LL_3; int LL_4; int LL_5; int LL_6; int LL_7; int LL_8; int LL_9; int LL_10; // Vekt, verdi og terskelverdier int W_1_0 = 10; int V_1_0 = 100; int Lim_1_0 = 200; //750; // Terskelverdi LDR - Vekt 1,0 kg, verdi 100 kr. int W_1_5 = 15; int V_1_5 = 125; int Lim_1_5 = 200; //900; // Terskelverdi LDR - Vekt 1,5 kg, verdi 125 kr. int W_2_0 = 20; int V_2_0 = 175; int Lim_2_0 = 200; //900; // Terskelverdi LDR - Vekt 2,0 kg, verdi 175 kr. int W_2_5 = 25; int V_2_5 = 175; int Lim_2_5 = 200; //950; // Terskelverdi LDR - Vekt 2,5 kg, verdi 175 kr. int W_3_0 = 30; int V_3_0 = 200; int Lim_3_0 = 200; //600; // Terskelverdi LDR - Vekt 3,0 kg, verdi 200 kr. int W_3_5 = 35; int V_3_5 = 250; int Lim_3_5 = 200; //900; // Terskelverdi LDR - Vekt 3,5 kg, verdi 250 kr. int W_4_0 = 40; int V_4_0 = 250; int Lim_4_0 = 200; //700; // Terskelverdi LDR - Vekt 4,0 kg, verdi 250 kr. int W_4_5 = 45; int V_4_5 = 250; int Lim_4_5 = 200; //950; // Terskelverdi LDR - Vekt 4,5 kg, verdi 250 kr. int W_5_0 = 50; int V_5_0 = 400; int Lim_5_0 = 200; //600; // Terskelverdi LDR - Vekt 5,0 kg, verdi 400 kr. int W_5_5 = 55; int V_5_5 = 500; int Lim_5_5 = 200; //600; // Terskelverdi LDR - Vekt 5,5 kg, verdi 500 kr. int W_6_0 = 60; int V_6_0 = 500; int Lim_6_0 = 200; //900; // Terskelverdi LDR - Vekt 6,0 kg, verdi 500 kr. int LimMargin = 300; // Her kan terskelmarginen for deteksjon justeres int LimMarginDark = 600; // Her kan terskelverdien for slukket utstilling settes int darkFlag = 0; // Registrerer om rommet er mørkt over tid // Variable som holder de ulike // sifferne som skal vises på display int Siffer_1_kg = 0; int Siffer_10_kg = 0; int Siffer_100_kg = 0; int Siffer_1_kr = 0; int Siffer_10_kr = 0; int Siffer_100_kr = 0; int Siffer_1000_kr = 0; // Variable for ulik bruk int Total_Weight = 0; int Total_Verdi = 0; int Old_Weight =0; volatile int OnTime = 0; int vent = 100; int pinCLK = 13; int pinSDI = 12; int pinLE = 11; int pin_OE = 10; int pinSpare = 3; int pinCheck = 2; int Check; volatile int Overweight = 33; volatile int Run_flag = LOW; int Best = 31; int Best_Verdi = 1700; int Nest_Best = 29; int Nest_Best_Verdi = 1600; int Bra = 27; int Bra_Verdi = 1500; int Daarlig = 25; int Daarlig_Verdi = 1400; int Daarligst = 23; int Vifte = 22; int Rest = 0; int TimeLimit = 150; // 50 tilsvarer ca. 20 sek. 150 tilsvarer ca. 60 sek. int ActiveFlagg = 0; int BlinkTid = 2; int Sjekk = 0; volatile char n, m; volatile int i; int ant_loop = 0; int Sif[7]; byte SifCon[10]; void setup() { pinMode(Daarligst, OUTPUT); // Pinne 23 (Rød) pinMode(Daarlig, OUTPUT); // Pinne 25 (Gul) pinMode(Bra, OUTPUT); // Pinne 27 (Gul) pinMode(Nest_Best, OUTPUT); // Pinne 29 (Gul) pinMode(Best, OUTPUT); // Pinne 31 (Grønn) pinMode(Overweight, OUTPUT);// Pinne 33 (Rød) pinMode(Check, INPUT); // Pinne 8 pinMode(pinCLK, OUTPUT); // Pinne 13 pinMode(pinSDI, OUTPUT); // Pinne 12 pinMode(pinLE, OUTPUT); // Pinne 11 pinMode(pin_OE, OUTPUT); // Pinne 10 pinMode(Vifte, OUTPUT); // Pinne 22 pinMode(pinSpare, INPUT); // Pinne 2 (Interupt 0 inngang SPARE) pinMode(pinCheck, INPUT); // Pinne 3 (Interupt 1 inngang CHECK) attachInterrupt(0, Status, FALLING); // Attach interrupt to pin 3 digitalWrite(pin_OE, LOW); digitalWrite(pinLE, LOW); SifCon[0] = B11111100; // 0 (ABCDEFG DP) SifCon[1] = B01100000; // 1 (ABCDEFG DP) SifCon[2] = B11011010; // 2 (ABCDEFG DP) SifCon[3] = B11110010; // 3 (ABCDEFG DP) SifCon[4] = B01100110; // 4 (ABCDEFG DP) SifCon[5] = B10110110; // 5 (ABCDEFG DP) SifCon[6] = B10111110; // 6 (ABCDEFG DP) SifCon[7] = B11100000; // 7 (ABCDEFG DP) SifCon[8] = B11111110; // 8 (ABCDEFG DP) SifCon[9] = B11110110; // 4 (ABCDEFG DP) Serial.begin(9600); CalibrationLDR(); Serial.println("Utgave: Ut_og_fly_Rev_1_5_2 - 14.09.19"); } void loop() { // Sjekk om sensor er tildekket, // legg til eller trekk fra riktig vekt og verdi // Serial.print("LOOP: "); // Serial.print(ant_loop); // ant_loop++; LL_0 = analogRead(LDR_0); // Read analog LDR 0 if ((LL_0 > Lim_1_0) && (LDR_0_F == 0)) { Total_Weight = Total_Weight + W_1_0; Total_Verdi = Total_Verdi + V_1_0; LDR_0_F = 1; delay(vent); } else if ((LL_0 < Lim_1_0) && (LDR_0_F == 1)) { Total_Weight = Total_Weight - W_1_0; Total_Verdi = Total_Verdi - V_1_0; LDR_0_F = 0; delay(vent); } LL_1 = analogRead(LDR_1); // Read analog LDR 1 if ((LL_1 > Lim_1_5) && (LDR_1_F == 0)) { Total_Weight = Total_Weight + W_1_5; Total_Verdi = Total_Verdi + V_1_5; LDR_1_F = 1; delay(vent); } else if ((LL_1 < Lim_1_5) && (LDR_1_F == 1)) { Total_Weight = Total_Weight - W_1_5; Total_Verdi = Total_Verdi - V_1_5; LDR_1_F = 0; delay(vent); } LL_2 = analogRead(LDR_2); // Read analog LDR 2 if ((LL_2 > Lim_2_0) && (LDR_2_F == 0)) { Total_Weight = Total_Weight + W_2_0; Total_Verdi = Total_Verdi + V_2_0; LDR_2_F = 1; delay(vent); } else if ((LL_2 < Lim_2_0) && (LDR_2_F == 1)) { Total_Weight = Total_Weight - W_2_0; Total_Verdi = Total_Verdi - V_2_0; LDR_2_F = 0; delay(vent); } LL_3 = analogRead(LDR_3); // Read analog LDR 3 if ((LL_3 > Lim_2_5) && (LDR_3_F == 0)) { Total_Weight = Total_Weight + W_2_5; Total_Verdi = Total_Verdi + V_2_5; LDR_3_F = 1; delay(vent); } else if ((LL_3 < Lim_2_5) && (LDR_3_F == 1)) { Total_Weight = Total_Weight - W_2_5; Total_Verdi = Total_Verdi - V_2_5; LDR_3_F = 0; delay(vent); } LL_4 = analogRead(LDR_4); // Read analog LDR 4 if ((LL_4 > Lim_3_0) && (LDR_4_F == 0)) { Total_Weight = Total_Weight + W_3_0; Total_Verdi = Total_Verdi + V_3_0; LDR_4_F = 1; delay(vent); } else if ((LL_4 < Lim_3_0) && (LDR_4_F == 1)) { Total_Weight = Total_Weight - W_3_0; Total_Verdi = Total_Verdi - V_3_0; LDR_4_F = 0; delay(vent); } LL_5 = analogRead(LDR_5); // Read analog LDR 5 if ((LL_5 > Lim_3_5) && (LDR_5_F == 0)) { Total_Weight = Total_Weight + W_3_5; Total_Verdi = Total_Verdi + V_3_5; LDR_5_F = 1; delay(vent); } else if ((LL_5 < Lim_3_5) && (LDR_5_F == 1)) { Total_Weight = Total_Weight - W_3_5; Total_Verdi = Total_Verdi - V_3_5; LDR_5_F = 0; delay(vent); } LL_6 = analogRead(LDR_6); // Read analog LDR 6 if ((LL_6 > Lim_4_0) && (LDR_6_F == 0)) { Total_Weight = Total_Weight + W_4_0; Total_Verdi = Total_Verdi + V_4_0; LDR_6_F = 1; delay(vent); } else if ((LL_6 < Lim_4_0) && (LDR_6_F == 1)) { Total_Weight = Total_Weight - W_4_0; Total_Verdi = Total_Verdi - V_4_0; LDR_6_F = 0; delay(vent); } LL_7 = analogRead(LDR_7); // Read analog LDR 7 if ((LL_7 > Lim_4_5) && (LDR_7_F == 0)) { Total_Weight = Total_Weight + W_4_5; Total_Verdi = Total_Verdi + V_4_5; LDR_7_F = 1; delay(vent); } else if ((LL_7 < Lim_4_5) && (LDR_7_F == 1)) { Total_Weight = Total_Weight - W_4_5; Total_Verdi = Total_Verdi - V_4_5; LDR_7_F = 0; delay(vent); } LL_8 = analogRead(LDR_8); // Read analog LDR 8 if ((LL_8 > Lim_5_0) && (LDR_8_F == 0)) { Total_Weight = Total_Weight + W_5_0; Total_Verdi = Total_Verdi + V_5_0; LDR_8_F = 1; delay(vent); } else if ((LL_8 < Lim_5_0) && (LDR_8_F == 1)) { Total_Weight = Total_Weight - W_5_0; Total_Verdi = Total_Verdi - V_5_0; LDR_8_F = 0; delay(vent); } LL_9 = analogRead(LDR_9); // Read analog LDR 9 if ((LL_9 > Lim_5_5) && (LDR_9_F == 0)) { Total_Weight = Total_Weight + W_5_5; Total_Verdi = Total_Verdi + V_5_5; LDR_9_F = 1; delay(vent); } else if ((LL_9 < Lim_5_5) && (LDR_9_F == 1)) { Total_Weight = Total_Weight - W_5_5; Total_Verdi = Total_Verdi - V_5_5; LDR_9_F = 0; delay(vent); } LL_10 = analogRead(LDR_10); // Read analog LDR 9 if ((LL_10 > Lim_6_0) && (LDR_10_F == 0)) { Total_Weight = Total_Weight + W_6_0; Total_Verdi = Total_Verdi + V_6_0; LDR_10_F = 1; delay(vent); } else if ((LL_10 < Lim_6_0) && (LDR_10_F == 1)) { Total_Weight = Total_Weight - W_6_0; Total_Verdi = Total_Verdi - V_6_0; LDR_10_F = 0; delay(vent); } // Serial.print("LL_0: "); Serial.print(LL_0); Serial.print(" Lim_1_0: "); Serial.println(Lim_1_0); // Serial.print("LL_1: "); Serial.print(LL_1); Serial.print(" Lim_1_5: "); Serial.println(Lim_1_5); // Serial.print("LL_2: "); Serial.print(LL_2); Serial.print(" Lim_2_0: "); Serial.println(Lim_2_0); // Serial.print("LL_3: "); Serial.print(LL_3); Serial.print(" Lim_2_5: "); Serial.println(Lim_2_5); // Serial.print("LL_4: "); Serial.print(LL_4); Serial.print(" Lim_3_0: "); Serial.println(Lim_3_0); // Serial.print("LL_5: "); Serial.print(LL_5); Serial.print(" Lim_3_5: "); Serial.println(Lim_3_5); // Serial.print("LL_6: "); Serial.print(LL_6); Serial.print(" Lim_4_0: "); Serial.println(Lim_4_0); // Serial.print("LL_7: "); Serial.print(LL_7); Serial.print(" Lim_4_5: "); Serial.println(Lim_4_5); // Serial.print("LL_8: "); Serial.print(LL_8); Serial.print(" Lim_5_0: "); Serial.println(Lim_5_0); // Serial.print("LL_9: "); Serial.print(LL_9); Serial.print(" Lim_5_5: "); Serial.println(Lim_5_5); // Serial.print("LL_10: "); Serial.print(LL_10); Serial.print(" Lim_6_0: "); Serial.println(Lim_6_0); // delay(1000); // Beregner sifrene i vekten Siffer_100_kg = (Total_Weight/100); Siffer_10_kg = ((Total_Weight - 100*Siffer_100_kg)/10); Siffer_1_kg = (Total_Weight - 100*Siffer_100_kg - 10*Siffer_10_kg); Sif[6] = char(Siffer_100_kg); // Adder 48 for å angi ASKII-verdien Sif[5] = char(Siffer_10_kg); // Adder 128 for å angi punkt ved sifferet Sif[4] = char(Siffer_1_kg); // Adder 48 for å angi ASKII-verdien // Beregner sifrene i krondeverdien Siffer_1000_kr = (Total_Verdi/1000); Siffer_100_kr = ((Total_Verdi - 1000*Siffer_1000_kr)/100); Siffer_10_kr = ((Total_Verdi - 1000*Siffer_1000_kr - 100*Siffer_100_kr)/10); Siffer_1_kr = (Total_Verdi - 1000*Siffer_1000_kr - 100*Siffer_100_kr - 10*Siffer_10_kr); Sif[3] = char(Siffer_1000_kr); // Adder 48 for å angi ASKII-verdien Sif[2] = char(Siffer_100_kr); // Adder 48 for å angi ASKII-verdien Sif[1] = char(Siffer_10_kr); // Adder 48 for å angi ASKII-verdien Sif[0] = char(Siffer_1_kr); // Adder 48 for å angi ASKII-verdien BigDisplay (); // Skriv vekt til display if (Old_Weight != Total_Weight) { // Serial.println("Vekten er forandret"); OnTime = 0; ActiveFlagg = 1; Old_Weight = Total_Weight; // Oppdaterer gammelverdi } else { OnTime = OnTime + 1; } // Avslutt og tøm bordet dersom det er gått tilstrekkelig lang tid siden noe har skjedd if ((OnTime > TimeLimit) && (ActiveFlagg == 1)) { Rydd_bordet (); ActiveFlagg = 0; OnTime = 0; Old_Weight = 0; } else if ((OnTime > TimeLimit) && (ActiveFlagg == 0)) { OnTime = 0; } // Serial.print(" ActiveFlagg = "); // Serial.print(ActiveFlagg); // Serial.print(" Total vekt: "); // Serial.print(Total_Weight); // Serial.print(" Old vekt = "); // Serial.print(Old_Weight); // Serial.print(" OnTime = "); // Serial.println(OnTime); // Registrer overvekt if (Total_Weight > 200) { digitalWrite(Overweight, HIGH); } else { digitalWrite(Overweight, LOW); } delay(100); } void Status () { if (Total_Weight > 200) { for (n = 0; n < 4; n++) // Blinkende lys ved overvekt { digitalWrite (Best, HIGH); // Alarm digitalWrite (Nest_Best, HIGH); digitalWrite (Bra, HIGH); digitalWrite (Daarlig, HIGH); digitalWrite (Daarligst, HIGH); digitalWrite (Overweight, HIGH); for(i=0 ; i<30 ; i++) {delayMicroseconds(16383);} // ca. 0,5 sek. digitalWrite (Best, LOW); // Alarm digitalWrite (Nest_Best, LOW); digitalWrite (Bra, LOW); digitalWrite (Daarlig, LOW); digitalWrite (Daarligst, LOW); digitalWrite (Overweight, LOW); for(i=0 ; i<30 ; i++) {delayMicroseconds(16383);} // ca. 0,5 sek. } } else { if (Total_Verdi == Best_Verdi) digitalWrite (Best, HIGH); if ((Nest_Best_Verdi <= Total_Verdi) && (Total_Verdi < Best_Verdi)) digitalWrite (Nest_Best, HIGH); if ((Bra_Verdi <= Total_Verdi) && (Total_Verdi < Nest_Best_Verdi)) digitalWrite (Bra, HIGH); if ((Daarlig_Verdi <= Total_Verdi) && (Total_Verdi < Bra_Verdi)) digitalWrite (Daarlig, HIGH); if (Total_Verdi < Daarlig_Verdi) digitalWrite (Daarligst, HIGH); for(i=0 ; i<200 ; i++) {delayMicroseconds(16383);} // ca. 3 sek. digitalWrite (Best, LOW); digitalWrite (Nest_Best, LOW); digitalWrite (Bra, LOW); digitalWrite (Daarlig, LOW); digitalWrite (Daarligst, LOW); } } void Rydd_bordet () { int LMD; LMD = LimMarginDark; if((LL_0 > LMD) && // Sjekk om alle sensorene er mørke (LL_1 > LMD) && // Dette kan enten skyldes at alle brikkene (LL_2 > LMD) && // ligger på bordet og det må tømmes (LL_3 > LMD) && // Eller rommet er mørkt og det trengs ikke å tømmes. (LL_4 > LMD) && // Ved mørkt rom forsøkes tømt en gang (LL_5 > LMD) && // men ikke flere. (LL_6 > LMD) && (LL_7 > LMD) && (LL_8 > LMD) && (LL_9 > LMD) && (LL_10 > LMD)) { if(darkFlag == 0) { digitalWrite (Vifte, HIGH); Serial.print("Rydder bordet"); delay(4000); digitalWrite (Vifte, LOW); darkFlag = 1; } } else { digitalWrite (Vifte, HIGH); Serial.print("Rydder bordet"); delay(4000); digitalWrite (Vifte, LOW); darkFlag = 0; } } void CalibrationLDR() { Lim_1_0 = analogRead(LDR_0) + LimMargin; // Read analog LDR 0 Lim_1_5 = analogRead(LDR_1) + LimMargin; // Read analog LDR 1 Lim_2_0 = analogRead(LDR_2) + LimMargin; // Read analog LDR 2 Lim_2_5 = analogRead(LDR_3) + LimMargin; // Read analog LDR 3 Lim_3_0 = analogRead(LDR_4) + LimMargin; // Read analog LDR 4 Lim_3_5 = analogRead(LDR_5) + LimMargin; // Read analog LDR 5 Lim_4_0 = analogRead(LDR_6) + LimMargin; // Read analog LDR 6 Lim_4_5 = analogRead(LDR_7) + LimMargin; // Read analog LDR 7 Lim_5_0 = analogRead(LDR_8) + LimMargin; // Read analog LDR 8 Lim_5_5 = analogRead(LDR_9) + LimMargin; // Read analog LDR 9 Lim_6_0 = analogRead(LDR_10) + LimMargin; // Read analog LDR 10 } void BigDisplay () { // unsigned char tall; byte tall; char c = 0; digitalWrite(pinCLK, LOW); delay(250); for (n = 6; n > -1; n--) { tall = SifCon[Sif[n]]; if (n == 5) tall = tall + 1; // Serial.println(int(tall)); for (m = 0; m < 8; m++) { //Serial.println(int(tall)); if (tall & 128) { digitalWrite(pinSDI, HIGH); } else { digitalWrite(pinSDI, LOW); } delayMicroseconds(100); tall = tall << 1; digitalWrite(pinCLK, HIGH); // Clocking bit into shiftregister delayMicroseconds(100); digitalWrite(pinCLK, LOW); } delay(1); } digitalWrite(pinLE,HIGH); // Latch display data delayMicroseconds(200); digitalWrite(pinLE,LOW); }