Display

Projecten die niet passen in bovenstaande onderwerpen
Gebruikers-avatar
Berichten: 13
Geregistreerd: 10 Aug 2017, 20:58

Display

Berichtdoor AnHacker » 28 Aug 2017, 20:39

hallo,

ik heb mijn arduino aangesloten aan een display van 1 cijfer, zie http://osoyoo.com/2014/12/18/display-digit-0-to-9-in-7-seg-nixie-led-tube/, en probeer ervoor te zorgen dat als ik op de knop druk, dat het cijfertje van 1 naar 2 springt, is hij 2 en druk ik op de knop dan (is de bedoeling) gaat hij naar 3 enz. maar het werkt niet, hij blijft op 0 staan. code:
Code: Alles selecteren
#define knop 3
int a=7;
int b=6;
int c=5;
int d=11;
int e=10;
int f=8;
int g=9;
int dp=4;
int buttonstate = 0;
int cijfer = 0;
//display number 1
void loop()
{
if (cijfer == 1)
{
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    clearDisplay();
}
//display number2
if (cijfer == 2)
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(g,HIGH);
  digitalWrite(e,HIGH);
    digitalWrite(d,HIGH);
    clearDisplay();
}
// display number3
if (cijfer == 3)
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(g,HIGH);
  digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    clearDisplay();
}
// display number4
if (cijfer == 4)
{
    digitalWrite(f,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(g,HIGH);
  digitalWrite(c,HIGH);
  clearDisplay();
 
}
// display number5
if (cijfer == 5)
{
    digitalWrite(a,HIGH);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
  digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    clearDisplay();
}
// display number6
if (cijfer == 6)
{
    digitalWrite(a,HIGH);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
  digitalWrite(c,HIGH);
    digitalWrite(d,HIGH); 
    digitalWrite(e,HIGH); 
    clearDisplay();
}
// display number7
if (cijfer == 7)
{   
   digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    clearDisplay();
}
// display number8
if (cijfer == 8)
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(g,HIGH);
  digitalWrite(c,HIGH);
    digitalWrite(d,HIGH); 
    digitalWrite(e,HIGH); 
  digitalWrite(f,HIGH); 
  clearDisplay();
}

if (cijfer == 9)
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(g,HIGH);
  digitalWrite(c,HIGH);
    digitalWrite(d,HIGH); 
  digitalWrite(f,HIGH);
  clearDisplay(); 
}
if (cijfer == 0)
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
  digitalWrite(c,HIGH);
    digitalWrite(d,HIGH); 
    digitalWrite(e,HIGH); 
  digitalWrite(f,HIGH); 
  clearDisplay();
}
 
     
    buttonstate = digitalRead(knop);

    if (buttonstate = HIGH)
    {
      cijfer = +1;
    }

    if (cijfer = 10)
    {
      cijfer = 0;
    }
}
void setup()
{
    int i;
    for(i=4;i<=11;i++)
        pinMode(i,OUTPUT);
}
void clearDisplay(void)
{
    digitalWrite(a,LOW);
    digitalWrite(b,LOW);
    digitalWrite(g,LOW);
  digitalWrite(c,LOW);
    digitalWrite(d,LOW); 
    digitalWrite(e,LOW); 
  digitalWrite(f,LOW); 
}


kan iemand mij helpen :| :?:

alvast bedankt.
Code: Alles selecteren
void loop()
digitalWrite (Eat, HIGH)
digitalWrite (Sleep, HIGH)
digitalWrite (Program, HIGH)

Advertisement

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

Re: Display

Berichtdoor nicoverduin » 28 Aug 2017, 22:11

Je zou eens kunnenproberen om wat meer basiskennis op te doen. En dan zelf proberen te begrijpen wat hier gebeurt.
Docent Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Display

Berichtdoor Koepel » 28 Aug 2017, 22:57

Als je met een if-statement twee dingen wilt vergelijken, gebruik dan '=='. Dat is dus een dubbele '='.

Code: Alles selecteren
    if (buttonstate == HIGH)  // gebruik dubbele '=='
    {
      cijfer = +1;
    }

    if (cijfer == 10)  // gebruik dubbele '=='
    {
      cijfer = 0;
    }


Je wilt niet dat teller heel snel oploopt, zolang je de knop hebt ingedrukt.
Je wilt dus het moment detecteren waarop de knop wordt ingedrukt. Dat is de State-Change-Detection: https://www.arduino.cc/en/Tutorial/StateChangeDetection

Probeer in je sketch ook eens om het inpringen overal goed te zetten.

Bij ieder nummer roep je clearDisplay() aan. Dan verdwijnt het nummer toch weer ?

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

Re: Display

Berichtdoor Gij Kieken » 29 Aug 2017, 18:53

Hey Ann,
Dit is een stukje recht-uit,recht-aan code om een 7-seg display aan te sturen,lees het misschien een tiental keren en probeer zo de code te begrijpen.
De code kan hier en daar zeker wat bij geschroefd worden, maar het is de bedoeling het stapsgewijs op te bouwen.
De code werkt.
Het is niet direct wat jij in gedachten hebt, maar als je een en ander beter begrijpt kun je ze aanpassen naar uw wens.
Code: Alles selecteren
/*
   @  Sketch is written for Arduino Nano and Uno (A0--A5).
   @  Control 7-segment display via relay's.
   @  7-segment display's made of individual Led stripes.
   @  Input is controlled via 10-pos.rotary-switch,common to ground.
   @  All inputs are INPUT_PULLUP resistor to 5v.
   @  Connect Arduino inputs  DI 2..DI 11 to rotary-switch pos.1--10.
   @  Notice that analog pin's can be addressed as OUTPUT(14)--OUTPUT(19).
   @  Led stripes connected in common Anode (common Kathode is also possible).
   @  Sketch is written for common Anode because of relay-card is active low.
   @  0=Led-On, 1=Led-Off
   @  Connect Arduino pin numbers: DI12,A0,A1,A2,A3,A4,A5 to 7-segment display :  a,b,c,d ,e ,f ,g.
   @  In programming skip DI13, because at start_up the bootloader makes pin DI13 flash a few times.
   @  Error mesages, <broken wire [o]>, <short circuit [E]>.
   @  For Leading or Blanking Zero, comment or uncomment specific lines in seven_seg_display array. 
*/
//#define DEBUG    //  Uncomment this line for debug purposes
//  Setup an 2-dimensional array, ten numbers 0-9, 7-segments
byte totalVal = 0;
byte seven_seg_display[12][7]={  //  Setup for common Anode display or Arduino relay-card
//{ 1,1,1,1,1,1,1 }  ,  // 0,  switch off the bits for number 0  (a,b,c,d,e,f,g) comment this line for Blanking Zero
  { 0,0,0,0,0,0,1 }  ,  // 0,  switch off the bits for number 0  (a,b,c,d,e,f,g) comment this line for Leading Zero
  { 1,0,0,1,1,1,1 }  ,  // 1,  switch off the bits for number 1  (a,b,c,d,e,f,g)
  { 0,0,1,0,0,1,0 }  ,  // 2,  switch off the bits for number 2  (a,b,c,d,e,f,g)
  { 0,0,0,0,1,1,0 }  ,  // 3,  switch off the bits for number 3  (a,b,c,d,e,f,g)
  { 1,0,0,1,1,0,0 }  ,  // 4,  switch off the bits for number 4  (a,b,c,d,e,f,g)
  { 0,1,0,0,1,0,0 }  ,  // 5,  switch off the bits for number 5  (a,b,c,d,e,f,g)
  { 0,1,0,0,0,0,0 }  ,  // 6,  switch off the bits for number 6  (a,b,c,d,e,f,g)
  { 0,0,0,1,1,1,1 }  ,  // 7,  switch off the bits for number 7  (a,b,c,d,e,f,g)
  { 0,0,0,0,0,0,0 }  ,  // 8,  switch off the bits for number 8  (a,b,c,d,e,f,g)
  { 0,0,0,0,1,0,0 }  ,  // 9,  switch off the bits for number 9  (a,b,c,d,e,f,g)
  { 1,1,0,0,0,1,0 }  ,  //     error, broken wire   ( o )
  { 0,1,1,0,0,0,0 }  ,  //     error, short circuit ( E ) 
};
/*
byte seven_seg_display[12][7]={  //  Setup for common Kathode display
//{ 0,0,0,0,0,0,0 }  ,  // 0,  highlight the bits for number 0  (a,b,c,d,e,f,g) comment this line for Leading Zero
  { 1,1,1,1,1,1,0 }  ,  // 0,  highlight the bits for number 0  (a,b,c,d,e,f,g) comment this line for Blanking Zero
  { 0,1,1,0,0,0,0 }  ,  // 1,  highlight the bits for number 1  (a,b,c,d,e,f,g)
  { 1,1,0,1,1,0,1 }  ,  // 2,  highlight the bits for number 2  (a,b,c,d,e,f,g)
  { 1,1,1,1,0,0,1 }  ,  // 3,  highlight the bits for number 3  (a,b,c,d,e,f,g)
  { 0,1,1,0,0,1,1 }  ,  // 4,  highlight the bits for number 4  (a,b,c,d,e,f,g)
  { 1,0,1,1,0,1,1 }  ,  // 5,  highlight the bits for number 5  (a,b,c,d,e,f,g)
  { 1,0,1,1,1,1,1 }  ,  // 6,  highlight the bits for number 6  (a,b,c,d,e,f,g)
  { 1,1,1,0,0,0,0 }  ,  // 7,  highlight the bits for number 7  (a,b,c,d,e,f,g)
  { 1,1,1,1,1,1,1 }  ,  // 8,  highlight the bits for number 8  (a,b,c,d,e,f,g)
  { 1,1,1,1,0,1,1 }  ,  // 9,  highlight the bits for number 9  (a,b,c,d,e,f,g)
  { 0,0,1,1,1,0,1 }  ,  //     error, broken wire   ( o )
  { 1,0,0,1,1,1,1 }  ,  //     error, short circuit ( E )
};
*/

void setup(){                   
//  Setup Arduino pin configuration
  pinMode(2,INPUT);      //  Dec input 0   
  pinMode(3,INPUT);      //  Dec input 1
  pinMode(4,INPUT);      //  Dec input 2
  pinMode(5,INPUT);      //  Dec input 3
  pinMode(6,INPUT);      //  Dec input 4
  pinMode(7,INPUT);      //  Dec input 5   
  pinMode(8,INPUT);      //  Dec input 6   
  pinMode(9,INPUT);      //  Dec input 7   
  pinMode(10,INPUT);     //  Dec input 8   
  pinMode(11,INPUT);     //  Dec input 9
//  Set INTERNAL_PULLUP for all inputs
  pinMode(2, INPUT_PULLUP);     //  Dec input 0   
  pinMode(3, INPUT_PULLUP);     //  Dec input 1
  pinMode(4, INPUT_PULLUP);     //  Dec input 2
  pinMode(5, INPUT_PULLUP);     //  Dec input 3
  pinMode(6, INPUT_PULLUP);     //  Dec input 4
  pinMode(7, INPUT_PULLUP);     //  Dec input 5   
  pinMode(8, INPUT_PULLUP);     //  Dec input 6   
  pinMode(9, INPUT_PULLUP);     //  Dec input 7   
  pinMode(10,INPUT_PULLUP);     //  Dec input 8   
  pinMode(11,INPUT_PULLUP);     //  Dec input 9
//  Configure the outputs
  pinMode(12,OUTPUT);    //  Display segment a       
  pinMode(A0,OUTPUT);    //  Display segment b   
  pinMode(A1,OUTPUT);    //  Display segment c   
  pinMode(A2,OUTPUT);    //  Display segment d   
  pinMode(A3,OUTPUT);    //  Display segment e   
  pinMode(A4,OUTPUT);    //  Display segment f     
  pinMode(A5,OUTPUT);    //  Display segment g
 
//  Only runs one time for test purpose 
    for(byte downCount = 10; downCount > 0; downCount --){
    delay(1000);
    sevenSeg_write(downCount-1);
  }
delay(1000);            //  Give the system time to stabilize
}

void sevenSeg_write(byte digit){
  byte pin=12;          //  Display segments, segDisplay(0)=a,..., segDisplay(6)=g
  for(byte segDisplay = 0; segDisplay < 7; segDisplay ++){
    digitalWrite(pin, seven_seg_display[digit][segDisplay]);
    pin ++;
    if( pin == 13 ) {pin ++;}  //  Skip pin13 because the bootloader makes it flash
  }
}

byte readSwitch(){    //  Function to read the state of the Inputs
    totalVal = 0;     //  If all Inputs are High,(broken wire)display ( o )
    if (digitalRead(2 ) == HIGH) {totalVal += 1;}  //Dec input 0
    if (digitalRead(3 ) == HIGH) {totalVal += 1;}  //Dec input 1
    if (digitalRead(4 ) == HIGH) {totalVal += 1;}  //Dec input 2
    if (digitalRead(5 ) == HIGH) {totalVal += 1;}  //Dec input 3
    if (digitalRead(6 ) == HIGH) {totalVal += 1;}  //Dec input 4
    if (digitalRead(7 ) == HIGH) {totalVal += 1;}  //Dec input 5
    if (digitalRead(8 ) == HIGH) {totalVal += 1;}  //Dec input 6
    if (digitalRead(9 ) == HIGH) {totalVal += 1;}  //Dec input 7 
    if (digitalRead(10) == HIGH) {totalVal += 1;}  //Dec input 8
    if (digitalRead(11) == HIGH) {totalVal += 1;}  //Dec input 9
  return totalVal;    //  If totalVal < 9 ,Short circuit display ( E )
}

void loop(){
  for (byte i = 2; i < 12; i ++){
      if (digitalRead(i) == LOW){
      sevenSeg_write(i-2);
    }
  }
  readSwitch();
  #ifdef DEBUG
    Serial.println(totalVal);   
  #endif 
  if (totalVal > 9) {      //  Check for broken wire
      sevenSeg_write(10);
  }
  if (totalVal < 9) {      //  Check for short circuit
      sevenSeg_write(11);
  }
  delay(1000);
}


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

Re: Display

Berichtdoor shooter » 30 Aug 2017, 10:28

allereerst even de opbouw, zet setup boven de loop dat leest wat fijner.
zet al die if statements in een aparte functie, dan wordt de loop een stuk simpeler.
daarna kun je al die if dingen vervangen door een case, dat leest lekker simpel.
wel telkens een break ertussen zetten (zie de reference )
verder zet je er telkens een aantal aan en direct zet je alles weer uit, zonder delay of wachten.
(je kunt gewoon alle pinnen sturen dan blijven ze staan, of vlak voor je de pinnen aan zet eerst even clearen.
dan kun je ook nog andere dingen doen, want het display blijft dan gewoon aanstaan.
paul deelen
shooter@home.nl

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten