/* * Ta i bruk eprom slik * * EEPROM.update(0, ledState); // skriver verdi til eprom * ledState = EEPROM.read(0); // leser verdi fra eprom * Ikke lagt inn ennaa! * * * Programmet for Arduino Medic * Fritt til gjenbruk * * 15.01.2023 * la2yg */ #include #include #include #include struct ts t; // konstanter const int bPin6 = 6; // microswitch const int bPin7 = 7; // trykkanapp vensre for ettak av dosett const int bPin8 = 8; // trykknapp for tenning av lys const int lydut= 10; // lydutgang til hoeyttaler String stringTid; // timer og minutter, 3 eller 4 sifret i txt-format // variable for reading the pushbutton status int pinState6 = 0; int pinState7 = 0; int pinState8 = 0; int pos; // variable to store the servo position int flagg_utlevert = 0; // markerer at dagens er levert int lydvarsel = 0; // dagens er klar for uttak int medictid = 9; // tid naar medisin skal taes int ukedag = 9; int dag = 63; // sjekk naar ny dag begynner int sekund; int minutt = 63; int timer; int teller = 0; // brukes for aa gi minuttvarsel int lys; int sluttminutt = 99; int j = 100; // iog j brukes til lydgeneering int i; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); Servo myservo; // create servo object to control a servo // twelve servo objects can be created on most boards int Teller = 0; // ************ ********* ********** ********** void setup() { Serial.begin(9600); Wire.begin(); myservo.attach(9); // attaches the servo on pin 9 to the servo object //myservo.write(90); // dette pgr av begrenset bevegelsesrom DS3231_init(DS3231_CONTROL_INTCN); lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Hallo der ute"); lcd.setCursor(0, 1); lcd.print("Naa starter vi!"); // initialize the pushbutton pin as an input: pinMode(bPin6, INPUT); // microswitch, varsler naar dosett er tatt ut pinMode(bPin7, INPUT); // Venstre side, dosett oenskes skoevet ut pinMode(bPin8, INPUT); // tenn lys i display pinMode(13, OUTPUT); // bakbelysning av LCD digitalWrite(13, HIGH); // startes naa for aa vise oppstarttekst lys = 1; // flagg for aa fortelle at lyset er paa slukk = 0; // flagg slukker display etter x min delay(100); // MRK naar tidsetting utfoert en gang sperr tidssettingen i programmet /* t.hour= 20; t.min = 13; t.sec= 00; t.mday= 13; t.mon= 11; t.year= 2022; DS3231_set(t); */ ////////////////////////// delay(2000); lcd.clear(); } // ******************* // VVVVVVVVVVVVVVVVVVV LOOP STARER HER VVVVVVVVVVVVVVVVVVVV // ******************* void loop() { avlestid(); // Les av tid // subrutine nr 1 if((timer == medictid)&& (flagg_utlevert == 0)) { medicutlevering(); // Sjekk om det er tid for utlevere dosett } // subrutine nr 2 if(flagg_utlevert == 1) { lydvarsling(); // Varsle med lyd naar dosett skyves ut } // subrutine nr 3 if(flagg_utlevert != 1) { dosettut(); } // subrutine nr 4 // Stopp lyd naar dosett blir tatt ut tennlys(); // subrutine nr 5 // Tenn/slukk displaylys tautdosett(); // subrutine nr 6 skriver tekst naar dosett blir tatt ut } // ********************* // MMMMMMMMMMMMMMMMMMMM LOOP ER SLUTT HER MMMMMMMMMMMMMMMMMMMM // ********************* // ************************************************************* // ******************** Subrutine nr 1 ********************* void avlestid() { DS3231_get(&t); // tidsinformasjonen fra RTC if(dag != t.mday) { // sjekk om det er ny dag dag = t.mday; flagg_utlevert = 0; // resettes hver midnatt lydvarsel = 0; slukk = 0; lys = 1; digitalWrite(13, HIGH); lcd.setCursor(0, 1); lcd.print(" Natt/morgen "); } if(minutt != t.min) { // sjekker om det er nytt minutt minutt = t.min; timer = t.hour; ukedag = t.wday; lcd.setCursor(0,0); // Oppdaterer display hvert minutt switch(ukedag) { case 7: lcd.print("Snd"); break; case 1: lcd.print("Man"); break; case 2: lcd.print("Tir"); break; case 3: lcd.print("Ons"); break; case 4: lcd.print("Tor"); break; case 5: lcd.print("Fre"); break; case 6: lcd.print("Lrd"); break; } lcd.print(" "); if(dag < 10) { // lager dag/maaned og klokkeslett for utskrift lcd.print(0); lcd.print(dag); lcd.print("."); }else{ lcd.print(dag); lcd.print("."); } switch(t.mon) { case 1: lcd.print("jan"); break; case 2: lcd.print("feb"); break; case 3: lcd.print("mar"); break; case 4: lcd.print("apr"); break; case 5: lcd.print("mai"); break; case 6: lcd.print("jun"); break; case 7: lcd.print("jul"); break; case 8: lcd.print("aug"); break; case 9: lcd.print("sep"); break; case 10: lcd.print("okt"); break; case 11: lcd.print("nov"); break; case 12: lcd.print("des"); break; } lcd.print(" "); if(timer<10) { // setter inn 0 hvis time er < 10 lcd.print("0"); // dette for aa faa to siffret time lcd.print(timer); lcd.print(":"); }else{ lcd.print(timer); lcd.print(":"); } if(minutt<10) { // sjekk om ett eller tosiffret minutt lcd.print("0"); lcd.print(minutt); }else{ lcd.print(minutt); } } } // ******************** Subrutine nr 1 ********************* // ************************************************************* // ******************** Subrutine nr 2 ********************* void medicutlevering() { flagg_utlevert = 1; // dosett er skjoevet ut og venter paa utskrift lydvarsel = 1; // klargjort for aa varsle med lyd lys = 1; digitalWrite(13, HIGH); // setter paa lys // naa skyves dosetten ut for (pos = 90; pos >= 0; pos -= 1) { // goes from 0 degrees to 90 degrees // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' // myservo.write(0); delay(15); // waits 15ms for the servo to reach the position } for (pos = 0; pos <= 90; pos += 1) { // goes from 180 degrees to 0 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } lcd.setCursor(0,1); lcd.print(" Ta ut dosett "); } // ******************** Subrutine nr 2 ********************* // ************************************************************* // ******************** Subrutine nr 3 ********************* void lydvarsling() { pinState6 = digitalRead(bPin6); if(pinState6 == 1) { // hvis dosett ikke er tatt ut, varsle med lyd if(lydvarsel == 1) { lydvarsel = 0; // stopper lyden i 1 min teller = minutt; for(int j = 0; j<3; j++) { for(i= 400; i<1400; i = i + 200) { tone(lydut,i); delay(80); } digitalWrite(13, LOW); delay(15); for(i = 1201; i > 599; i = i - 200) { tone(lydut,i); delay(80); } digitalWrite(13, HIGH); } noTone(lydut); // lydfunksjonen slaas av } if(teller != minutt) { lydvarsel = 1; // klargjoer for ny lydvarsling } } } // ******************** Subrutine nr 3 ********************* // ************************************************************* // ******************** Subrutine nr 4 ********************* void dosettut() { pinState7 = digitalRead(bPin7); // leser av knapp for utskyving av dosett if(pinState7 == 0) { // knappen er trykket, skyver ut dosett flagg_utlevert = 1; lydvarsel = 1; lys = 1; digitalWrite(13, HIGH); for (pos = 90; pos >= 0; pos -= 1) { myservo.write(pos); delay(15); } for (pos = 0; pos <= 90; pos += 1) { myservo.write(pos); delay(15); } lcd.setCursor(0,1); lcd.print("Ta ut dosetten "); } } // ******************** Subrutine nr 4 ********************* // ************************************************************* // ******************** Subrutine nr 5 ********************* void tennlys() { if(digitalRead(8) == 0) { lys = 1; sluttminutt = 99; digitalWrite(13, HIGH); } // ***** slukk lys etter x minutter ***** if(lys == 1) { // lys paa, teller ned til slukking if(flagg_utlevert != 1) { if(sluttminutt == 99){ sluttminutt = minutt + 3; if(sluttminutt> 59) { // sjekker om det er minuttskift sluttminutt = sluttminutt - 60; } } } if(sluttminutt == minutt){ // teller opp til aa aa slaa av displaylys etter 3 min lys = 0; digitalWrite(13, LOW); sluttminutt = 99; } } } // ******************** Subrutine nr 5 ********************* // ************************************************************* // ******************** Subrutine nr 6 ********************* void tautdosett() { while(digitalRead(6) == 0) { lcd.setCursor(0,1); lcd.print("Dosetten er tatt"); lydvarsel = 0; flagg_utlevert = 2; } } // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX