Arduino schéma - arduino.sk

Hasičská časomiera

Vaše nápady a pomoc s Vašimi projektami
Príspevky: 7
Registrovaný: Štv 02. Júl 2015 23:25:43

Hasičská časomiera

Poslaťod yesso » Štv 02. Júl 2015 23:32:00

Nazdar :)
potreboval by som kuknúť kód, už si neviem dať rady s tým :/
ide o to, že keď sa časomiera spustí, tak sa občas stane, že začne bežať od nejakého zvláštneho čísla a nie od nuly pekne...
neviem čo s tým môže byť, nepozrel by sa niekto múdrejší?
http://ulozto.sk/xMF8zxV5/casomiera-final-ino

EDIT:
Kód: Vybrať všetko
// http://www.youtube.com/watch?v=-3w7FMUC28M

#define PATTERN_COUNT 12                 // pocet symbolov
#define SEGMENT_COUNT 7                  // pocet segmentov
#define DIGIT_COUNT 5                    // pocet displejov

//                                       A  B  C  D  E   F   G
const int segmentPins[SEGMENT_COUNT] = { 6, 7, 8, 9, 10, 11, 12 };
const int digitPins[DIGIT_COUNT] = { A1, A2, A3, A4, A5 };
const int terc1Pin = 2;
const int terc2Pin = 3;
const int startPin = 4;

int startTime = 0;
int terc1Time = 0;
int terc2Time = 0;
int running = 0;

const int digitPatterns[PATTERN_COUNT][SEGMENT_COUNT] = {
  {    HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW    }  , // 0
  {    LOW,  HIGH, HIGH, LOW,  LOW,  LOW,  LOW    }  , // 1
  {    HIGH, HIGH, LOW,  HIGH, HIGH, LOW,  HIGH   }  , // 2
  {    HIGH, HIGH, HIGH, HIGH, LOW,  LOW,  HIGH   }  , // 3
  {    LOW,  HIGH, HIGH, LOW,  LOW,  HIGH, HIGH   }  , // 4
  {    HIGH, LOW,  HIGH, HIGH, LOW,  HIGH, HIGH   }  , // 5
  {    HIGH, LOW,  HIGH, HIGH, HIGH, HIGH, HIGH   }  , // 6
  {    HIGH, HIGH, HIGH, LOW,  LOW,  LOW,  LOW    }  , // 7
  {    HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH   }  , // 8
  {    HIGH, HIGH, HIGH, HIGH, LOW,  HIGH, HIGH   }  , // 9
  {    HIGH, HIGH, LOW,  LOW,  HIGH, HIGH, HIGH   }  , // P
  {    LOW,  LOW,  LOW,  HIGH, HIGH, HIGH, LOW    }  // L
};

void setup() {
  for (int thisPin = 0; thisPin < SEGMENT_COUNT; thisPin++) {
    pinMode(segmentPins[thisPin], OUTPUT);
  }
  for (int thisPin = 0; thisPin < DIGIT_COUNT; thisPin++) {
    pinMode(digitPins[thisPin], OUTPUT);
  }
 
  for (int thisPin = 0; thisPin < SEGMENT_COUNT; thisPin++) {
    pinMode(segmentPins[thisPin], OUTPUT);
  }

  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
 
  running = 0;
  startTime = 0;
  terc1Time = 0;
  terc2Time = 0;
  pinMode(startPin, INPUT);
  pinMode(terc1Pin, INPUT);
  attachInterrupt(0, terc1Down, FALLING);
  pinMode(terc2Pin, INPUT);
  attachInterrupt(1, terc2Down, FALLING);
}

int transformTime(int time){
  if (time > 5999) {//ak je uplynuty cas viac ako minuta
      int tmp = (time / 6000) * 10000;
      time = tmp + (time % 6000);
    } else if(time > 11999){
      int tmp = (time / 12000) * 10000;
      time = tmp + (time % 12000);
    }
    return time;
}

void terc1Down(){
  if(running != 0){  // ak uz bola spustena casomiera
    if(terc1Time == 0){  //ak este nebol zhodeny terc 1
      terc1Time = (millis() - startTime)/10;
      if (terc1Time > 5999) {
        int tmp1 = (terc1Time / 6000) * 10000;
        terc1Time = tmp1 + (terc1Time % 6000);
      }
    }
  }
}

void terc2Down(){
  if(running != 0){
    if(terc2Time == 0){
      terc2Time = (millis() - startTime)/10;
      if (terc2Time > 5999) {
        int tmp2 = (terc2Time / 6000) * 10000;
        terc2Time = tmp2 + (terc2Time % 6000);
      }
    }
  }
}

// Turns all the digits off
void allDigitsOff() {
  for (int thisPin = 0; thisPin < DIGIT_COUNT; thisPin++) {
    digitalWrite(digitPins[thisPin], HIGH);
  }
}

// This turns on a specific digit and will display the number that was set using setPattern()
// This function expects that all digits are off, which would be the case if you ran setPattern() first.
void digitOn(int digitNum) {
  digitalWrite(digitPins[digitNum-1], LOW);
  delay(2);
}

// This is the function that sets the number to show on the next digit that gets turned on by digitOn()
void setPattern(int pattern) {
  allDigitsOff(); // Make sure all the digits are turned off while we do this, or the last digit will look funny while we modify the pattern

  for (int thisPin = 0; thisPin < SEGMENT_COUNT; thisPin++) { // Loop through all the segment pins and set them to the pattern that corresponds to the digit in the digitPattern array
    digitalWrite(segmentPins[thisPin], digitPatterns[pattern][thisPin]);
  }
}

// This function takes a number and splits it up into separate digits then shows each digit in the right place.
void showNumber(int currentNumber) {
  // Loop through all the digits of this number and extract the last digit each time
  for (int currentDigit = DIGIT_COUNT; currentDigit > 0; currentDigit--) {
    // To get the number in the ones place, do a mod ten.
    int number = currentNumber % 10;
    // Now chop off the last digit so the digit in the tens place now becomes the digit on the ones places for the next iteration of the loop
    currentNumber /= 10;
    // Now set the pattern to the digit we just got
    setPattern(number);
    // Now turn on the digit in the right place
    digitOn(currentDigit);
  }
}

/* vypise pismeno L alebo P na stredny displej*/
void showLP(int lp){
  if(lp == 10){
    setPattern(10);
    digitOn(3);
  } else {
    setPattern(11);
    digitOn(3);
  }
}

void vypisLavy(int cas){
  /*****************************************************
   * vypise L (lavy terc) na 1sec
   */
   digitalWrite(13,LOW);
  int elapsedTime = 0;
  int vypTime = millis();
  while(true){
    elapsedTime = millis() - vypTime;
    showLP(11);
    if(elapsedTime > 1000) break;
  }
  /*****************************************************
   * vypise cas laveho terca na dany cas
   */
   digitalWrite(13,HIGH);
  vypTime = millis();
  while(true){
    elapsedTime = millis() - vypTime;
    showNumber(terc1Time);
    if(elapsedTime > cas) break;
  }
}

void vypisPravy(int cas){
  digitalWrite(13,LOW);  // vypne dvojbodky
  int elapsedTime = 0;
  int vypTime = millis();
  while(true){  //na 1s zobrazi pismeno P (pravy terc)
    elapsedTime = millis() - vypTime;
    showLP(10);
    if(elapsedTime > 1000) break;
  }
  digitalWrite(13,HIGH);
   
  /* vvypise cas praveho terca na dany cas*/
  vypTime = millis();
  while(true){
    elapsedTime = millis() - vypTime;
    showNumber(terc2Time);
    if(elapsedTime > cas) break;
  }
}

void loop() {
  /* caka na spustenie (signal LOW na pine startPin)*/
  while(true){
    showNumber(0);
    if(digitalRead(startPin)==LOW){
      startTime = millis();
      running = 1;
    }
    break;
  }

  /* zacne zobrazovat beziaci cas*/
  while(true){
    int currentNumber = (millis() - startTime)/10;
    if (currentNumber > 6000) {//ak je uplynuty cas viac ako minuta
      int tmp = (currentNumber / 6000) * 10000;
      currentNumber = tmp + (currentNumber % 6000);
    }
    showNumber(currentNumber);
    if((terc1Time!=0) && (terc2Time!=0)) break;
  }
 
  /* pocka chvilku na vypisovanie*/
  running = 0;
  int temp = millis();
  while(true){
      allDigitsOff();
      if((millis() - temp) > 200) break;
    }
  if(terc1Time > terc2Time) {vypisLavy(4000); vypisPravy(3000);} else vypisPravy(4000);
 
  /* kym sa neresetne program, tak vypisuje asy laveho a praveho terca*/
  while(true){
    vypisLavy(3000);
    vypisPravy(3000);
  }
}




Naposledy upravil yesso dňa Pon 06. Júl 2015 22:09:33, celkovo upravené 1

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: Hasičská časomiera

Poslaťod posjirka » Pia 03. Júl 2015 21:03:01

1. kod prosím vkladej přímo do textu máme tady tag Code
2. používáš startTime jako int , ta ti za 32 sekund přeteče, protože funkce millis je ve formátu unsing long.
To bude asi zdroj problému

Príspevky: 7
Registrovaný: Štv 02. Júl 2015 23:25:43

Re: Hasičská časomiera

Poslaťod yesso » Ned 05. Júl 2015 22:14:58

vďaka za odpoveď :) ten tag som nejako prehliadol :D
no a vyskúšam a ozvem sa, či pomohlo...

Príspevky: 7
Registrovaný: Štv 02. Júl 2015 23:25:43

Re: Hasičská časomiera

Poslaťod yesso » Pon 06. Júl 2015 20:07:02

no, dal som tam ten unsigned long, ale aj tak nepomohlo...
ako vravíš po 32 sekundách keď to spustím, tak mi to začne počítať od 1:05:XX :/

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: Hasičská časomiera

Poslaťod posjirka » Pon 06. Júl 2015 21:47:05

jaké používáš prostředí? Já mám verzi Arduino 1.0.5-r2 a hned po spuštění kodu mi vyhlásil chybu v

const int digitPins[DIGIT_COUNT] = { A1, A2, A3, A4, A5 };

jestli můžu tak ten tvůj kod dám do Code ať se na to může podívat víc lidí.

Príspevky: 7
Registrovaný: Štv 02. Júl 2015 23:25:43

Re: Hasičská časomiera

Poslaťod yesso » Pon 06. Júl 2015 22:12:46

no ja mám Arduino ERW 1.0.5 a nepíše mi nič také...

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: Hasičská časomiera

Poslaťod posjirka » Pon 06. Júl 2015 22:31:22

tak jsem to dal do arduina a dopsal pár ladících řádků.
Máš tam pár drobných chybiček a asi bez příslušného HW nejsem schopen to odladit.
Budeš to muset připojit na USB a nechat si postupně posílat některé klíčové proměnné na Serial Monitor jinak to do kupy nedáš.
Mě to například spínalo start samo po 2 sekundách a chyba byla ve špatně posazném příkazu break s hlavní čekací smyčce.
Moje změny jsou označeny // -------------------------------------------------------------- jirka

Tady je originál tvého kodu:
Kód: Vybrať všetko
// http://www.youtube.com/watch?v=-3w7FMUC28M

#define PATTERN_COUNT 12                 // pocet symbolov
#define SEGMENT_COUNT 7                  // pocet segmentov
#define DIGIT_COUNT 5                    // pocet displejov

//                                       A  B  C  D  E   F   G
const int segmentPins[SEGMENT_COUNT] = { 6, 7, 8, 9, 10, 11, 12 };
const int digitPins[DIGIT_COUNT] = { A1, A2, A3, A4, A5 };
const int terc1Pin = 2;
const int terc2Pin = 3;
const int startPin = 4;

int startTime = 0;
int terc1Time = 0;
int terc2Time = 0;
int running = 0;

const int digitPatterns[PATTERN_COUNT][SEGMENT_COUNT] = {
  {    HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW    }  , // 0
  {    LOW,  HIGH, HIGH, LOW,  LOW,  LOW,  LOW    }  , // 1
  {    HIGH, HIGH, LOW,  HIGH, HIGH, LOW,  HIGH   }  , // 2
  {    HIGH, HIGH, HIGH, HIGH, LOW,  LOW,  HIGH   }  , // 3
  {    LOW,  HIGH, HIGH, LOW,  LOW,  HIGH, HIGH   }  , // 4
  {    HIGH, LOW,  HIGH, HIGH, LOW,  HIGH, HIGH   }  , // 5
  {    HIGH, LOW,  HIGH, HIGH, HIGH, HIGH, HIGH   }  , // 6
  {    HIGH, HIGH, HIGH, LOW,  LOW,  LOW,  LOW    }  , // 7
  {    HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH   }  , // 8
  {    HIGH, HIGH, HIGH, HIGH, LOW,  HIGH, HIGH   }  , // 9
  {    HIGH, HIGH, LOW,  LOW,  HIGH, HIGH, HIGH   }  , // P
  {    LOW,  LOW,  LOW,  HIGH, HIGH, HIGH, LOW    }  // L
};

void setup() {
  for (int thisPin = 0; thisPin < SEGMENT_COUNT; thisPin++) {
    pinMode(segmentPins[thisPin], OUTPUT);
  }
  for (int thisPin = 0; thisPin < DIGIT_COUNT; thisPin++) {
    pinMode(digitPins[thisPin], OUTPUT);
  }
 
  for (int thisPin = 0; thisPin < SEGMENT_COUNT; thisPin++) {
    pinMode(segmentPins[thisPin], OUTPUT);
  }

  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
 
  running = 0;
  startTime = 0;
  terc1Time = 0;
  terc2Time = 0;
  pinMode(startPin, INPUT);
  pinMode(terc1Pin, INPUT);
  attachInterrupt(0, terc1Down, FALLING);
  pinMode(terc2Pin, INPUT);
  attachInterrupt(1, terc2Down, FALLING);
}

int transformTime(int time){
  if (time > 5999) {//ak je uplynuty cas viac ako minuta
      int tmp = (time / 6000) * 10000;
      time = tmp + (time % 6000);
    } else if(time > 11999){
      int tmp = (time / 12000) * 10000;
      time = tmp + (time % 12000);
    }
    return time;
}

void terc1Down(){
  if(running != 0){  // ak uz bola spustena casomiera
    if(terc1Time == 0){  //ak este nebol zhodeny terc 1
      terc1Time = (millis() - startTime)/10;
      if (terc1Time > 5999) {
        int tmp1 = (terc1Time / 6000) * 10000;
        terc1Time = tmp1 + (terc1Time % 6000);
      }
    }
  }
}

void terc2Down(){
  if(running != 0){
    if(terc2Time == 0){
      terc2Time = (millis() - startTime)/10;
      if (terc2Time > 5999) {
        int tmp2 = (terc2Time / 6000) * 10000;
        terc2Time = tmp2 + (terc2Time % 6000);
      }
    }
  }
}

// Turns all the digits off
void allDigitsOff() {
  for (int thisPin = 0; thisPin < DIGIT_COUNT; thisPin++) {
    digitalWrite(digitPins[thisPin], HIGH);
  }
}

// This turns on a specific digit and will display the number that was set using setPattern()
// This function expects that all digits are off, which would be the case if you ran setPattern() first.
void digitOn(int digitNum) {
  digitalWrite(digitPins[digitNum-1], LOW);
  delay(2);
}

// This is the function that sets the number to show on the next digit that gets turned on by digitOn()
void setPattern(int pattern) {
  allDigitsOff(); // Make sure all the digits are turned off while we do this, or the last digit will look funny while we modify the pattern

  for (int thisPin = 0; thisPin < SEGMENT_COUNT; thisPin++) { // Loop through all the segment pins and set them to the pattern that corresponds to the digit in the digitPattern array
    digitalWrite(segmentPins[thisPin], digitPatterns[pattern][thisPin]);
  }
}

// This function takes a number and splits it up into separate digits then shows each digit in the right place.
void showNumber(int currentNumber) {
  // Loop through all the digits of this number and extract the last digit each time
  for (int currentDigit = DIGIT_COUNT; currentDigit > 0; currentDigit--) {
    // To get the number in the ones place, do a mod ten.
    int number = currentNumber % 10;
    // Now chop off the last digit so the digit in the tens place now becomes the digit on the ones places for the next iteration of the loop
    currentNumber /= 10;
    // Now set the pattern to the digit we just got
    setPattern(number);
    // Now turn on the digit in the right place
    digitOn(currentDigit);
  }
}

/* vypise pismeno L alebo P na stredny displej*/
void showLP(int lp){
  if(lp == 10){
    setPattern(10);
    digitOn(3);
  } else {
    setPattern(11);
    digitOn(3);
  }
}

void vypisLavy(int cas){
  /*****************************************************
   * vypise L (lavy terc) na 1sec
   */
   digitalWrite(13,LOW);
  int elapsedTime = 0;
  int vypTime = millis();
  while(true){
    elapsedTime = millis() - vypTime;
    showLP(11);
    if(elapsedTime > 1000) break;
  }
  /*****************************************************
   * vypise cas laveho terca na dany cas
   */
   digitalWrite(13,HIGH);
  vypTime = millis();
  while(true){
    elapsedTime = millis() - vypTime;
    showNumber(terc1Time);
    if(elapsedTime > cas) break;
  }
}

void vypisPravy(int cas){
  digitalWrite(13,LOW);  // vypne dvojbodky
  int elapsedTime = 0;
  int vypTime = millis();
  while(true){  //na 1s zobrazi pismeno P (pravy terc)
    elapsedTime = millis() - vypTime;
    showLP(10);
    if(elapsedTime > 1000) break;
  }
  digitalWrite(13,HIGH);
   
  /* vvypise cas praveho terca na dany cas*/
  vypTime = millis();
  while(true){
    elapsedTime = millis() - vypTime;
    showNumber(terc2Time);
    if(elapsedTime > cas) break;
  }
}

void loop() {
  /* caka na spustenie (signal LOW na pine startPin)*/
  while(true){
    showNumber(0);
    if(digitalRead(startPin)==LOW){
      startTime = millis();
      running = 1;
    }
    break;
  }

  /* zacne zobrazovat beziaci cas*/
  while(true){
    int currentNumber = (millis() - startTime)/10;
    if (currentNumber > 6000) {//ak je uplynuty cas viac ako minuta
      int tmp = (currentNumber / 6000) * 10000;
      currentNumber = tmp + (currentNumber % 6000);
    }
    showNumber(currentNumber);
    if((terc1Time!=0) && (terc2Time!=0)) break;
  }
 
  /* pocka chvilku na vypisovanie*/
  running = 0;
  int temp = millis();
  while(true){
      allDigitsOff();
      if((millis() - temp) > 200) break;
    }
  if(terc1Time > terc2Time) {vypisLavy(4000); vypisPravy(3000);} else vypisPravy(4000);
 
  /* kym sa neresetne program, tak vypisuje asy laveho a praveho terca*/
  while(true){
    vypisLavy(3000);
    vypisPravy(3000);
  }
}






a tady mnou upraveny:
Kód: Vybrať všetko
// http://www.youtube.com/watch?v=-3w7FMUC28M

#define PATTERN_COUNT 12                 // pocet symbolov
#define SEGMENT_COUNT 7                  // pocet segmentov
#define DIGIT_COUNT 5                    // pocet displejov

//                                       A  B  C  D  E   F   G
const int segmentPins[SEGMENT_COUNT] = { 6, 7, 8, 9, 10, 11, 12 };
const int digitPins[DIGIT_COUNT] = { 15, 16, 17, 18, 19 }; // -------------------------------------------------------------- jirka
const int terc1Pin = 2;
const int terc2Pin = 3;
const int startPin = 4;

long startTime = 0;
long terc1Time = 0;
long terc2Time = 0;
int running = 0;

const int digitPatterns[PATTERN_COUNT][SEGMENT_COUNT] = {
  {    HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW    }  , // 0
  {    LOW,  HIGH, HIGH, LOW,  LOW,  LOW,  LOW    }  , // 1
  {    HIGH, HIGH, LOW,  HIGH, HIGH, LOW,  HIGH   }  , // 2
  {    HIGH, HIGH, HIGH, HIGH, LOW,  LOW,  HIGH   }  , // 3
  {    LOW,  HIGH, HIGH, LOW,  LOW,  HIGH, HIGH   }  , // 4
  {    HIGH, LOW,  HIGH, HIGH, LOW,  HIGH, HIGH   }  , // 5
  {    HIGH, LOW,  HIGH, HIGH, HIGH, HIGH, HIGH   }  , // 6
  {    HIGH, HIGH, HIGH, LOW,  LOW,  LOW,  LOW    }  , // 7
  {    HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH   }  , // 8
  {    HIGH, HIGH, HIGH, HIGH, LOW,  HIGH, HIGH   }  , // 9
  {    HIGH, HIGH, LOW,  LOW,  HIGH, HIGH, HIGH   }  , // P
  {    LOW,  LOW,  LOW,  HIGH, HIGH, HIGH, LOW    }  // L
};

void setup() {
  Serial.begin(9600); // -------------------------------------------------------------- jirka
  for (int thisPin = 0; thisPin < SEGMENT_COUNT; thisPin++) {
    pinMode(segmentPins[thisPin], OUTPUT);
  }
  for (int thisPin = 0; thisPin < DIGIT_COUNT; thisPin++) {
    pinMode(digitPins[thisPin], OUTPUT);
  }
 
  for (int thisPin = 0; thisPin < SEGMENT_COUNT; thisPin++) {
    pinMode(segmentPins[thisPin], OUTPUT);
  }

  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
 
  running = 0;
  startTime = 0;
  terc1Time = 0;
  terc2Time = 0;
  pinMode(startPin, INPUT_PULLUP);// -------------------------------------------------------------- jirka
  pinMode(terc1Pin, INPUT_PULLUP);// -------------------------------------------------------------- jirka
  attachInterrupt(0, terc1Down, FALLING);
  pinMode(terc2Pin, INPUT_PULLUP);// -------------------------------------------------------------- jirka
  attachInterrupt(1, terc2Down, FALLING);
}

int transformTime(int time){
  if (time > 5999) {//ak je uplynuty cas viac ako minuta
      int tmp = (time / 6000) * 10000;
      time = tmp + (time % 6000);
    } else if(time > 11999){
      int tmp = (time / 12000) * 10000;
      time = tmp + (time % 12000);
    }
    return time;
}

void terc1Down(){
  if(running != 0){  // ak uz bola spustena casomiera
    if(terc1Time == 0){  //ak este nebol zhodeny terc 1
      terc1Time = (millis() - startTime)/10;
      if (terc1Time > 5999) {
        int tmp1 = (terc1Time / 6000) * 10000;
        terc1Time = tmp1 + (terc1Time % 6000);
      }
    }
  }
}

void terc2Down(){
  if(running != 0){
    if(terc2Time == 0){
      terc2Time = (millis() - startTime)/10;
      if (terc2Time > 5999) {
        int tmp2 = (terc2Time / 6000) * 10000;
        terc2Time = tmp2 + (terc2Time % 6000);
      }
    }
  }
}

// Turns all the digits off
void allDigitsOff() {
  for (int thisPin = 0; thisPin < DIGIT_COUNT; thisPin++) {
    digitalWrite(digitPins[thisPin], HIGH);
  }
}

// This turns on a specific digit and will display the number that was set using setPattern()
// This function expects that all digits are off, which would be the case if you ran setPattern() first.
void digitOn(int digitNum) {
  digitalWrite(digitPins[digitNum-1], LOW);
  delay(2);
}

// This is the function that sets the number to show on the next digit that gets turned on by digitOn()
void setPattern(int pattern) {
  allDigitsOff(); // Make sure all the digits are turned off while we do this, or the last digit will look funny while we modify the pattern

  for (int thisPin = 0; thisPin < SEGMENT_COUNT; thisPin++) { // Loop through all the segment pins and set them to the pattern that corresponds to the digit in the digitPattern array
    digitalWrite(segmentPins[thisPin], digitPatterns[pattern][thisPin]);
  }
}

// This function takes a number and splits it up into separate digits then shows each digit in the right place.
void showNumber(int currentNumber) {
  // Loop through all the digits of this number and extract the last digit each time
  for (int currentDigit = DIGIT_COUNT; currentDigit > 0; currentDigit--) {
    // To get the number in the ones place, do a mod ten.
    int number = currentNumber % 10;
    // Now chop off the last digit so the digit in the tens place now becomes the digit on the ones places for the next iteration of the loop
    currentNumber /= 10;
    // Now set the pattern to the digit we just got
    setPattern(number);
    Serial.print(number); // -------------------------------------------------------------- jirka
    // Now turn on the digit in the right place
    digitOn(currentDigit);
  }
  Serial.println("-"); // -------------------------------------------------------------- jirka
}

/* vypise pismeno L alebo P na stredny displej*/
void showLP(int lp){
  if(lp == 10){
    setPattern(10);
    digitOn(3);
  } else {
    setPattern(11);
    digitOn(3);
  }
}

void vypisLavy(int cas){
  /*****************************************************
   * vypise L (lavy terc) na 1sec
   */
   digitalWrite(13,LOW);
  int elapsedTime = 0;
  int vypTime = millis();
  while(true){
    elapsedTime = millis() - vypTime;
    showLP(11);
    if(elapsedTime > 1000) break;
  }
  /*****************************************************
   * vypise cas laveho terca na dany cas
   */
   digitalWrite(13,HIGH);
  vypTime = millis();
  while(true){
    elapsedTime = millis() - vypTime;
    showNumber(terc1Time);
    if(elapsedTime > cas) break;
  }
}

void vypisPravy(int cas){
  digitalWrite(13,LOW);  // vypne dvojbodky
  int elapsedTime = 0;
  int vypTime = millis();
  while(true){  //na 1s zobrazi pismeno P (pravy terc)
    elapsedTime = millis() - vypTime;
    showLP(10);
    if(elapsedTime > 1000) break;
  }
  digitalWrite(13,HIGH);
   
  /* vvypise cas praveho terca na dany cas*/
  vypTime = millis();
  while(true){
    elapsedTime = millis() - vypTime;
    showNumber(terc2Time);
    if(elapsedTime > cas) break;
  }
}

void loop() {
  /* caka na spustenie (signal LOW na pine startPin)*/
  Serial.println("cekam na start"); // -------------------------------------------------------------- jirka
  Serial.print("startPin "); // -------------------------------------------------------------- jirka
  Serial.println(digitalRead(startPin)); // -------------------------------------------------------------- jirka
  while(true){
    showNumber(0);
    if(digitalRead(startPin)==LOW){
      startTime = millis();
      running = 1;
      break;// oprava, puvodne byl o 2 radky niz-------------------------------------------------------------- jirka
    }
  // break; // opravna chybna pozice patri o 2 radky vys-------------------------------------------------------------- jirka
  }

  /* zacne zobrazovat beziaci cas*/
  while(true){
    int currentNumber = (millis() - startTime)/10;
    if (currentNumber > 6000) {//ak je uplynuty cas viac ako minuta
      int tmp = (currentNumber / 6000) * 10000;
      currentNumber = tmp + (currentNumber % 6000);
      break;
    }
    showNumber(currentNumber);
    // Serial.println(currentNumber); // -------------------------------------------------------------- jirka
    if((terc1Time!=0) && (terc2Time!=0)) break;
  }
  Serial.println("stop"); // -------------------------------------------------------------- jirka
  /* pocka chvilku na vypisovanie*/
  running = 0;
  int temp = millis();
  while(true){
      allDigitsOff();
      if((millis() - temp) > 200) break;
    }
  if(terc1Time > terc2Time) {vypisLavy(4000); vypisPravy(3000);} else vypisPravy(4000);
 
  /* kym sa neresetne program, tak vypisuje asy laveho a praveho terca*/
  while(true){
    vypisLavy(3000);
    vypisPravy(3000);
  }
}





Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: Hasičská časomiera

Poslaťod budvar10 » Uto 07. Júl 2015 7:40:23

Nejako som neštudoval o čo beží, ale aj tak mám pripomienku. Tá tabuľka digitPatterns s int je trochu luxus, byte resp int8_t by stačil. Ja by som dokonca šiel na bitovú úroveň. Samozrejme je možné, že bude väčšia réžia programu pri bitoch.
Naposledy upravil budvar10 dňa Str 08. Júl 2015 9:01:25, celkovo upravené 1

Príspevky: 7
Registrovaný: Štv 02. Júl 2015 23:25:43

Re: Hasičská časomiera

Poslaťod yesso » Uto 07. Júl 2015 20:19:46

sorry, možno som zabudol pár dôležitých detailov... :D
1. je to Arduino NANO v3 (preto mám použité analógové piny)
2. serial mi nejako nefunguje, to bolo prvé, čo som chcel skúsiť
3. celkovo to arduino nejako divne funguje, lebo keď ho pripnem len cez USB, tak mi ho NTB ani nedetekuje, až keď do ARD privediem aj prúd normálne

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: Hasičská časomiera

Poslaťod posjirka » Str 08. Júl 2015 21:20:02

jestli spouštítš arduino i s LDE dispalyem tak ten ti to neutáhne proudově a proto potřebuje externí zdroj, ale ani ten není dostatečný a apk ti to může blbnout. Neviděl jsem schéma tak střílím od pasu. Zkus pustit samotné arduino bez rozšíření ...
Pak můžeš zkusit přehrát bootloader nebo koupit jiné arduino. jinak NANO je postaveno na Arduino Leonardo, které není až tak plně kompatibilní ze sředoboděm vesméru Arduinem UNO.
Lepší varianta je MEGA 2560 nebo jak tu bylo už několikrát prezentované UNO s ATMEGA1280, teď nenvím kdo ho vyráběl, ale nebylo to cenově špatný.

Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: Hasičská časomiera

Poslaťod budvar10 » Štv 09. Júl 2015 8:45:31

@posjirka
Lepší varianta je MEGA 2560 nebo jak tu bylo už několikrát prezentované UNO s ATMEGA1280, teď nenvím kdo ho vyráběl, ale nebylo to cenově špatný.

Nemyslíš náhodou toto ? http://arduino.sk/viewtopic.php?f=3&t=135&sid=0db65c133b462980ade0871c4e1013d2
Tam je 1284P. Mimochodom 34EUR, ak by bol záujem. :)

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: Hasičská časomiera

Poslaťod posjirka » Štv 09. Júl 2015 13:05:27

budvar10 píše:@posjirka
Lepší varianta je MEGA 2560 nebo jak tu bylo už několikrát prezentované UNO s ATMEGA1280, teď nenvím kdo ho vyráběl, ale nebylo to cenově špatný.

Nemyslíš náhodou toto ? http://arduino.sk/viewtopic.php?f=3&t=135&sid=502cf9dec9f62311e7518fbd15ca561b
Tam je 1284P. Mimochodom 34EUR, ak by bol záujem. :)

já jsem si říkal, že jsi nejspíš autor ty, ale fakt se mi to nechtělo hledat ... myslím, že pro tyto účely absolutně dostačující včetně použitých pinů, máš jich tam dostatek :)

Príspevky: 7
Registrovaný: Štv 02. Júl 2015 23:25:43

Re: Hasičská časomiera

Poslaťod yesso » Ned 13. Dec 2015 20:23:38

No už som to vyriešil :D
pravdepodobne bola chyba v alokácii premennej v cykle a že po nejakom čase už nemal alokovať akú... alebo bolo chybné NANO :D
upravil som program, dal nového švába a funguje bez problémov :)

Späť na Projekty vo fáze vývoja