timer naar 4digit display

algemene C code
Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: timer naar 4digit display

Berichtdoor shooter » 23 Jan 2016, 11:44

maak een foto of een tekening van hoe het nu allemaal hardware in elkaar steekt.
Ga terug naar de basis, want anders wordt het allemaal te ingewikkeld, schrijf er eens een paar Serial.prints in zodat je op de monitor kunt zien wat je doet.
paul deelen
shooter@home.nl

Advertisement

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: timer naar 4digit display

Berichtdoor christiaan » 23 Jan 2016, 11:51

Een andere library, en andere code. Zelfde pinnen, en deze doet het wel...

Code: Alles selecteren
#include <Arduino.h>
#include <TM1637Display.h>

// Module connection pins (Digital Pins)
#define CLK 43
#define DIO 45

// The amount of time (in milliseconds) between tests
#define TEST_DELAY   2000

const uint8_t SEG_DONE[] = {
   SEG_B | SEG_C | SEG_D | SEG_E | SEG_G,           // d
   SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,   // O
   SEG_C | SEG_E | SEG_G,                           // n
   SEG_A | SEG_D | SEG_E | SEG_F | SEG_G            // E
   };

TM1637Display display(CLK, DIO);

void setup()
{
}

void loop()
{
  int k;
  uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
  display.setBrightness(0x0f);
 
  // All segments on
  display.setSegments(data);
  delay(TEST_DELAY);
 
  // Selectively set different digits
  data[0] = 0b01001001;
  data[1] = display.encodeDigit(1);
  data[2] = display.encodeDigit(2);
  data[3] = display.encodeDigit(3);
 
  for(k = 3; k >= 0; k--) {
   display.setSegments(data, 1, k);
   delay(TEST_DELAY);
   }
   
  display.setSegments(data+2, 2, 2);
  delay(TEST_DELAY);
 
  display.setSegments(data+2, 2, 1);
  delay(TEST_DELAY);
 
  display.setSegments(data+1, 3, 1);
  delay(TEST_DELAY);
 
 
  // Show decimal numbers with/without leading zeros
  bool lz = false;
  for (uint8_t z = 0; z < 2; z++) {
   for(k = 0; k < 10000; k += k*4 + 7) {
      display.showNumberDec(k, lz);
      delay(TEST_DELAY);
   }
   lz = true;
  }
 
  // Show decimal number whose length is smaller than 4
  for(k = 0; k < 4; k++)
   data[k] = 0;
  display.setSegments(data);
 
  display.showNumberDec(153, false, 3, 1);
  delay(TEST_DELAY);
  display.showNumberDec(22, false, 2, 2);
  delay(TEST_DELAY);
  display.showNumberDec(0, true, 1, 3);
  delay(TEST_DELAY);
  display.showNumberDec(0, true, 1, 2);
  delay(TEST_DELAY);
  display.showNumberDec(0, true, 1, 1);
  delay(TEST_DELAY);
  display.showNumberDec(0, true, 1, 0);
  delay(TEST_DELAY);

  // Brightness Test
  for(k = 0; k < 4; k++)
   data[k] = 0xff;
  for(k = 0; k < 16; k++) {
    display.setBrightness(k);
    display.setSegments(data);
    delay(TEST_DELAY);
  }
   
  // Done!
  display.setSegments(SEG_DONE);
 
  while(1);
}

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: timer naar 4digit display

Berichtdoor Gij Kieken » 24 Jan 2016, 13:31

Hey, Christiaan
Ik heb ook wat ge-experimenteerd met het diplay TM1337 en heb de volgende code gemaakt.
Het is een count-down timer geworden met accumulatie en vrijgave(start timer) geworden.
Mijn libraries komen van de arduino cc site.
De code is allicht vatbaar voor verbetering maar het werkt.
Misschien heb je er ook iets aan?

cpp code
/*
Munter voor strijkrol
microSwitch to Digital Pin 2 ,hardware debounce schakelen naar gnd met Pull-up weerstand
enableTimer to Digital Pin 6 ,hardware debounce schakelen naar gnd met Pull-up weerstand
Start heater relais to Digital Pin 12,relais active LOW with opto-coupler
*/
#include "Timer.h"
#include <TM1637Display.h>
#define CLK 4 //7-segment display clock
#define DIO 5 //7-segment display IO
TM1637Display display(CLK, DIO); //set up the 4-digit display

Timer t;
int tickEvent;

const byte microSwitch = 2; //microSwitch pin number
const byte enableTimer = 6; //start timer pin 6
const byte heater = 12; //output relay for heater active Low
byte enableState = HIGH; //variable for reading input 6
boolean startTiming = false;
volatile unsigned int coinTime = 0; //1coin = 4min

void setup()
{
display.setBrightness(0x0a); //set the brightness
display.showNumberDec(coinTime);
pinMode(microSwitch, INPUT);
pinMode(enableTimer,INPUT);
pinMode(heater, OUTPUT);
digitalWrite(heater,HIGH); //heater in standby mode
delay(500); //give some time for debounce
attachInterrupt(0, coinAcceptor, FALLING);
}
void loop()
{
enableState = digitalRead(enableTimer);
display.showNumberDec(coinTime);
if (coinTime > 0)
{
digitalWrite(heater,LOW); //switch the heater On
}
else
{
digitalWrite(heater,HIGH);//switch the heater Off
}

if (enableState == LOW && startTiming == false)
{
startTiming = true;
tickEvent = t.every(60000, oneMinutetimer);
}
else if (enableState == HIGH && startTiming == true) //to make sure enable is kept LOW
{
startTiming = false;
t.stop(tickEvent);
}
t.update();
}

void oneMinutetimer()
{
if (coinTime == 0)
{
startTiming = false;
t.stop(tickEvent);
return;
}
coinTime = coinTime-1;
}

void coinAcceptor()
{
delayMicroseconds(20000); //some extra software debounce
if (digitalRead (microSwitch) == LOW)
{
coinTime = coinTime+4;
}
else return;
}

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: timer naar 4digit display

Berichtdoor christiaan » 24 Jan 2016, 21:32

is er niet ergens een goed timer script te vinden zonder de extra dingen die voor mij overbodig zijn.
Ik waardeer sowieso je hulp met bovenstaande code, alleen ik moet heel veel dingen eruit halen omdat dat voor mij niet relevant is, en dat er op die pinnen iets anders aangesloten zit.
Ik zoek dus een timer die ik in de sketch kan programmeren voor een bepaalde tijd, en die op 00:00 FAIL of BOOM aangeeft op het display... Zelf heb ik niks gevonden nog.

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: timer naar 4digit display

Berichtdoor Gij Kieken » 24 Jan 2016, 21:40

Met dit display kun je toch de afzonderlijke segmenten naar keuze doen oplichten.
De code ervoor staat reeds in de voorbeelden van het display.
De letter M is natuurlijk andere koek, het is niet alfanumeriek.

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: timer naar 4digit display

Berichtdoor christiaan » 25 Jan 2016, 21:22

Onderstaande code werkt voor mij redelijk goed, maar geeft zijn output alleen naar de seriële monitor... Kan iemand mij helpen om het om te zetten naar het display?

Code: Alles selecteren
#include<CountUpDownTimer.h>

CountUpDownTimer T(DOWN);
void setup()
{
  Serial.begin(115200);
  //T.SetTimer(1,0,0);
  T.SetTimer(10);
  T.StartTimer();
}

void loop()
{
  T.Timer(); // run the timer
 
  if (T.TimeHasChanged() ) // this prevents the time from being constantly shown.
  {
    //Serial.print(T.ShowHours());
    //Serial.print(":");
    Serial.print(T.ShowMinutes());
    Serial.print(":");
    Serial.println(T.ShowSeconds());
    //Serial.print(":");
    //Serial.print(T.ShowMilliSeconds());
    //Serial.print(":");
    //Serial.println(T.ShowMicroSeconds());
    // This DOES NOT format the time to 0:0x when seconds is less than 10.
    // if you need to format the time to standard format, use the sprintf() function.
  }
 
//  if(digitalRead(2) == LOW)
//    T.PauseTimer();
//  else
//    T.ResumeTimer();
}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: timer naar 4digit display

Berichtdoor nicoverduin » 26 Jan 2016, 08:56

Als je nu eerst een tutorial doet met een display (I2C of gewoon), dan leer je het display te gebruiken.
Als je daarna uitzoekt hoe de waardes uit de CountUpDown timer worden teruggegeven (int, char, byte, uint8_t oid) dan kun je beide inmiddels opgebouwde vaardigheden combineren. Immers je hebt geleerd iets op het display te zetten EN je weet wat voor variabelen je terugkrijg uit de timer.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: timer naar 4digit display

Berichtdoor christiaan » 27 Jan 2016, 14:00

Ik heb mijn timer werkend, en display werkt daar dus nu ook mee, echter heb krijg ik de : in het midden niet actief met deze bibliotheek: TM1637Display.h
Er staat wel een code in een pdf manual maar daarmee knippert de 2e digit van links mee, of wijzigt hij steeds de waarde van het 2e digit van links in een 2.
Code: Alles selecteren
uint8_t segto;
int value = 1244;
segto = 0x80 | display.encodeDigit((value / 100)%10);
display.setSegments(&segto, 1, 1);


Kan iemand mij helpen om de colon aan te krijgen??

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: timer naar 4digit display

Berichtdoor nicoverduin » 27 Jan 2016, 15:15

Altijd je laatste code er gewoon bij zetten. 4 regeltjes neerzetten gaat het niet oplossen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: timer naar 4digit display

Berichtdoor christiaan » 27 Jan 2016, 15:20

Die 4 regeltjes was waar het om gaat. Maar hierbij de hele code:
cpp code
#include<CountUpDownTimer.h>
#include "pitches.h"

CountUpDownTimer T(DOWN);
#include <Arduino.h>
#include <TM1637Display.h>
// Module connection pins (Digital Pins)
#define CLK 43
#define DIO 45
TM1637Display display(CLK, DIO);

int inPin = 8; // pushbutton connected to digital pin 7
int buttonState = 0; // variable for reading the pushbutton status
int piezoPin = 47;
int ledRedLeft = 22;
int ledRedRight = 25;

int hoursT;
int minutesT;
int secondsT;



void setup()
{
Serial.begin(115200);
pinMode(inPin, INPUT_PULLUP); // sets the digital pin 7 as input
pinMode(ledRedLeft, OUTPUT);
pinMode(ledRedRight, OUTPUT);
display.setBrightness(0x0f);
pinMode(2, INPUT_PULLUP);
digitalWrite(ledRedLeft, LOW);
digitalWrite(ledRedRight, LOW);
//T.SetTimer(1,30,0); // Timer voor de Escape room
T.SetTimer(0,0,10);
T.StartTimer();
}

void loop()
{
T.Timer(); // run the timer
uint8_t fail[] = { 0b01110001,0b01110111,0b00000110,0b00111000 };

if (T.TimeHasChanged() ) // this prevents the time from being constantly shown.
{

tone(piezoPin, 5000, 50);



display.showNumberDec(T.ShowMinutes(), true, 2, 0);
display.showNumberDec(T.ShowSeconds(), true, 2, 2);
Serial.print(T.ShowHours());
Serial.print(":");
Serial.print(T.ShowMinutes());
Serial.print(":");
Serial.println(T.ShowSeconds());

// read the state of the pushbutton value:
buttonState = digitalRead(inPin);

// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (!buttonState == HIGH) {
// turn LED on:
Serial.println("Connected");
T.ResumeTimer();
} else {
// turn LED off:
Serial.println("Disconnected");
//T.PauseTimer();
}
hoursT = T.ShowHours();
minutesT = T.ShowMinutes();
secondsT = T.ShowSeconds();
if (hoursT == 0 && minutesT == 0 && secondsT == 0) {
T.StopTimer();
delay(500);
Serial.println("BOOM");
digitalWrite(ledRedLeft, HIGH);
digitalWrite(ledRedRight, HIGH);
//display.setSegments(fail);
melodyFailPlay();
//display.showNumberDec(1234, true, 4, 0);
}

} // End of T.TimeHasChanged

}



void melodyFailPlay() {
tone(piezoPin, 262);
delay(250);
tone(piezoPin, 196);
delay(500);
noTone(piezoPin);
}

VorigeVolgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 34 gasten