2 voudige douche timer

Arduino specifieke Software
Berichten: 1
Geregistreerd: 24 Apr 2019, 16:20

2 voudige douche timer

Berichtdoor KlaasKlop » 24 Apr 2019, 16:35

Hallo,

ben bezig met een arduino uno een een douche timer te maken. het is de bedoeling dat eerste timer met instelling van 4 minuten count down na start knop begint terug te tellen naar nul, als binnen die periode een knop in gedrukt wordt betekend het dat na de afloop van de 4 minuten een nieuwe timer start welke 6 minuten extra douche tijd geeft. natuurlijk moet de tijd voor beide timers op het display terug lopen.

nu is het eerste stuk eigenlijk werkend maar het tweede stuk wil niet lukken. op dit moment wil de code niet compileren maar heb hem bijgevoegd. Hopelijk kan iemand mij helpen met deze hobbel.

dus eigenlijk de eerste 4 minuten zijn gratis douchen en daarna kan met extra tijd bijkopen.

Code: Alles selecteren

// segment | Arduino board PIN number

#include <EEPROM.h>
#define G 9
#define F 11
#define A 12
#define B 10
#define E 6
#define D 7
#define C 8
#define DP 5

// Commonn cathodes control
#define GND1 1
#define GND2 2
#define GND3 3
#define GND4 4

// buttons
/*
  Button_start - start/pause timer and in setup mode inreases minutes
  and seconds values
  Button_set - if timer is paused it resets timer to start. Long press
  activates setup mode in which button is for going through minutes, seconds setup
  and leaving setup mode.


*/
#define Button_start A0
#define Button_set A1
#define Button_save A2
#define Button_pay A3

///
#define Buzzer 13
#define LED A4 // or relay insted



int i = 0;
char run = 0; // shows if timer is runnig
int b = 0; //for buttons
int c = 0;
int d = 0; // for buzzer
char set_mode = 0; // shows if timer is in setup mode
char alarm = 0; // if "1" buzzer is on
int buttonState = HIGH;
int pay = 0;



//timer variables

// user setted and "turn on" values
int ADD0 = 01;
int ADD1 = 01;

//int default_Sec=EEPROM.read(0);
//int default_Min=EEPROM.read(5);

int default_Sec = 00;
int default_Min = 4;
int Pay_Sec = 00;
int Pay_Min = 6;

// current values
int Sec;
int Min;

//timer interrupt

ISR(TIMER1_OVF_vect) {
  Sec--; // timer values decreases
  TCNT1 = 0x0BDC;


}


// functions to display digits



void digit0 () {
  // for 0 needed to turn ON F A B C D E segments, so:

  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
};

void digit1 () {


  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
};

void digit2 () {


  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
};

void digit3 () {


  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
};

void digit4 () {


  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
};

void digit5 () {


  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
};

void digit6 () {


  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
};

void digit7 () {


  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
};


void digit8 () {


  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
};

void digit9 () {


  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
};

//function to display digit from inputed int

void showdigit (int digit)

{

  switch (digit) {

    case 0:
      digit0 ();
      break;

    case 1:
      digit1 ();
      break;

    case 2:
      digit2 ();
      break;

    case 3:
      digit3 ();
      break;

    case 4:
      digit4 ();
      break;

    case 5:
      digit5 ();
      break;

    case 6:
      digit6 ();
      break;

    case 7:
      digit7 ();
      break;

    case 8:
      digit8 ();
      break;

    case 9:
      digit9 ();
      break;

    default:

      break;


  };

};

void showdigits (int number, char digit_on, char decimal_point)
{

  digitalWrite(GND4, HIGH);
  // e.g. we have "1234"
  showdigit(number / 1000); // segments are set to display "1"
  if (decimal_point & 8) {
    digitalWrite(DP, LOW);
  } else {
    digitalWrite(DP, HIGH);
  };
  if (digit_on & 8) {
    digitalWrite(GND1, LOW); // first digit on,
    digitalWrite(GND2, HIGH); // other off
    digitalWrite(GND3, HIGH);
  }
  delay (2);

  number = number % 1000; // remainder of 1234/1000 is 234
  digitalWrite(GND1, HIGH); // first digit is off
  showdigit(number / 100); //// segments are set to display "2"
  if (decimal_point & 4) {
    digitalWrite(DP, LOW);
  } else {
    digitalWrite(DP, HIGH);
  };
  if (digit_on & 4) {
    digitalWrite(GND2, LOW); // second digit is on
  } delay (2);// and so on....

  number = number % 100;
  digitalWrite(GND2, HIGH);
  showdigit(number / 10);
  if (decimal_point & 2) {
    digitalWrite(DP, LOW);
  } else {
    digitalWrite(DP, HIGH);
  };
  if (digit_on & 2) {
    digitalWrite(GND3, LOW);
  }
  delay (2);

  number = number % 10;
  digitalWrite(GND3, HIGH);
  showdigit(number);
  if (decimal_point & 1) {
    digitalWrite(DP, LOW);
  } else {
    digitalWrite(DP, HIGH);
  };
  if (digit_on & 1) {
    digitalWrite(GND4, LOW);
  }
  delay (2);

};

void setup()

{

  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(DP, OUTPUT);

  pinMode(GND1, OUTPUT);
  pinMode(GND2, OUTPUT);
  pinMode(GND3, OUTPUT);
  pinMode(GND4, OUTPUT);

  pinMode(Button_start, INPUT);
  digitalWrite(Button_start, HIGH); //pull up resistor

  pinMode(Button_set, INPUT);
  digitalWrite(Button_set, HIGH); //pull up resistor

  pinMode(Button_pay, INPUT);
  digitalWrite(Button_pay, HIGH); //pull up resistor

  //pinMode(Buzzer, OUTPUT);
  pinMode(LED, OUTPUT);

  TIMSK1 = 0x01; // enabled global and timer overfHIGH interrupt;
  TCCR1A = 0x00; // normal operation 148 page (mode0);

  TCNT1 = 0x0BDC;

  TCCR1B = 0x00; // stop hardware timer

  // loading default timer values

  Sec = default_Sec ;
  Min = default_Min ;
  ///// tijdelijk om te printen naar seriele poort

};
void save()
{
  EEPROM.write(0, Sec);
  EEPROM.write(5, Min);
};

void betaald()
{
    Sec = Pay_Sec; Min = Pay_Min;
    run = 1;
    TCCR1B = 0x04; // start timer
    if (run) {               //schakel relay in
    digitalWrite(LED, HIGH);
    }
  else if (run = 0) digitalWrite(LED, LOW);
  else if ((Min == 0) && (Sec == 0) && run) {
    run = 0;
    TCCR1B = 0x00; //stop timer
  }
}
  void loop ()

  {
    EEPROM.write(0, Sec);
    EEPROM.write(5, Min);
  };

 
    /////////////////als button is ingedrukt dan save /////////////
    if (!digitalRead(Button_save) && !b) {
      save();

    }

    //////////// button_start//////////
    if (!digitalRead(Button_start) && !b) {

      if (!set_mode) {
        if (run) {
          TCCR1B = 0x00;
          run = 0;
        } else {
          TCCR1B = 0x04;
          run = 1;
        }
      }

      if (set_mode == 1) {
        Min++;
      }

      if (set_mode == 2) {
        Sec++;
      }

      if (set_mode) {
        b = 25;
      } else b = 100;

    };

    if (!digitalRead(Button_start) && b == 1) {

    };

    if (!b == 0) b--;

    //////////// button_set/////////
    if (!digitalRead(Button_set) && !c) {

      if (!run && !set_mode) {
        Min = default_Min;
        Sec = default_Sec;
      }

      if (set_mode > 0) set_mode++;

      if (set_mode == 3) {
        set_mode = 0; default_Sec = Sec ;
        default_Min = Min;
      }

      c = 100;
    };

    if (!digitalRead(Button_set) && c == 1 && !run) {

      set_mode = 1;

      c = 100;

    };

    if (!c == 0) c--;

    // read the state of the pushbutton Button_payvalue:
    if (buttonState = HIGH) buttonState = digitalRead(Button_pay);
    {
      if (buttonState = LOW)
        pay = 1;
      else
        pay = 0;
    }

    ////////////////////////////

    if (set_mode) {
      if (Sec == 60) {
        Sec = 00;
      }

      if (Min == 100) {
        Min = 0;
      }
    }

    else {

      if (Sec == -1) {
        Min--;
        Sec = 59;
      }

    }

    //decimal point indication control

    if (!set_mode) {

      if (!(Sec % 2)) {
        showdigits (Min * 100 + Sec, 0x0F, 0x04);  //0X00
      }

      else {
        showdigits (Min * 100 + Sec, 0x0F, 0x00);
      }; //0000

    } else {

      if (set_mode == 1) {

        showdigits (Min * 100 + Sec, 0x0F, 0x0C); //XX00
      } else {

        showdigits (Min * 100 + Sec, 0x0F, 0x03);
      } //00XX

    }



    if ((Min == 0) && (Sec == 0) && run) {
      run = 0;
      TCCR1B = 0x00; //stop timer

    }

    else if (run) { // to do while timer is running; e.g. control relay
      digitalWrite(LED, HIGH);
    }

    else if (run = 0) digitalWrite(LED, LOW);
    else if ((Min == 0) && (Sec == 0) && run) {
      run = 0;
      TCCR1B = 0x00; //stop timer
    }
    else
   
    if (pay=1) {
      betaald()
    }

      //// to do after count down is finished

      alarm = 1;
    buttonState = HIGH;
    d = 5000; /// wachten in millisecondes 1 sec = 1000 millisecondes

    // Alarm part
    if (alarm) {
      if (!(d % 10)) { // sound 500/100= 5 times ;
        tone(Buzzer, 800, 200);
      }
      d--;
      if (d == 0) {
        alarm = 0; Sec = default_Sec ;
        Min = default_Min ; // After alarm is off, timer goes to start
      }
    }

  };

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: 2 voudige douche timer

Berichtdoor Koepel » 24 Apr 2019, 18:57

Hallo, welkom op dit forum.

Bij de foutmeldingen is de eerste foutmelding de belangrijkste.

Het heeft de voorkeur om een pin als volgt te definiëren:
Code: Alles selecteren
const int pinG = 9;

Kun je dat bij allemaal doen ?

Er is een macro die F() heet. Je mag daarom de 'F' niet zelf definieren.

Een functie hoef je niet af te sluiten met ';'. Ook een if-statement en switch-case-statement hebben geen ';' achteraan.

Druk eens op Ctrl+T of kies in het menu "Automatische opmaak". De tekst layout (het inspringen, het gebruik van haakjes, enzovoorts) is erg belangrijk. Als de tekst layout van de code een rommeltje is, dan zal de werking ook wel een rommeltje zijn.

Je sluit de Arduino loop() na twee regels alweer af. Daarna komt nog code, die zomaar in de lucht hangt.

Door Timer1 te gebruiken is de code niet erg compatible meer. Je hebt toch intussen wel gelezen dat bijna alle timing met millis() wordt gedaan ?

Kun je een schema geven ? Je mag ook iets tekenen op een stukje papier.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 2 voudige douche timer

Berichtdoor shooter » 26 Apr 2019, 13:24

kan echt veel simpeler, zet deie switch in elkaar
maak er een byte van al die HIGH en LOWS.
dan heb je aan drie regels genoeg.
kijk eens naar een millis() timer.
paul deelen
shooter@home.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 17 gasten