Draadloos stoplicht met Arduino nRF24L01+

Pagina: 1
Acties:

  • verbraakje
  • Registratie: Februari 2006
  • Laatst online: 24-09 21:46
Beste Tweakers,

Met mijn nieuwe code heb ik (voor zo ver ik het kan) commentaar bij geschreven. Ik heb de code voor de helft werkend.

Wat maak ik?
Een draadloos stoplicht. TX verzend berichtjes naar de RX om de kleur te veranderen.

Wat werkt er?
De TX verzend een bericht en de RX ontvangt dit bericht netjes en voert het daarbij behorende inhoud uit.

Wat werkt er niet?
Als ik de delay in de RX code zet werkt het stoplicht naar behoren. Het is echter de bedoeling om meerdere nodes toe te voegen. na enkele minuten lopen de stoplichten niet meer gelijk. Nu wilde ik de delay in de TX node plaatsen. Maar verzend de TX geen berichten meer? iemand een idee wat ik niet goed doe? Voor mijn gevoel ben ik dicht bij een oplossing maar ik krijg hem niet gevonden

Alvast bedankt.


TX
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*
Code For Wireless traffic light Transceiver. 
Head node sends signal to 3 other nodes in a star network



*/
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
int msg[1]; // Send over package message 
RF24 radio(9,10);       // Set up nRF24L01 radio on SPI bus plus pins 9 & 10 
const uint64_t pipe = 0xE8E8F0F0E1LL; // Radio pipe addresses for the 2 nodes to communicate.

int red = 5; // LED red on pin 7 
int orange = 4; // LED orange on pin 6 
int green = 3; // LED green on pin 5

void setup(void){ //Setup and configure rf radio
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(pipe);  // Open pipe to other nodes for communication
 
  pinMode (red, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (orange, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (green, OUTPUT);} // Pinmode for LED OUTPUT
 
void loop(void){
  digitalWrite(red, HIGH); //starting red HIGH
  if (digitalRead(red) == HIGH)delay(1000);{{ // If red is HIGH Send Message 001 for 1 second
  msg[0] = 001; 
  radio.write(msg, 1);} //write msg 

  digitalWrite(orange, HIGH); //starting red HIGH
  if (digitalRead(orange) == HIGH)delay(1000);{ // If orange is HIGH Send Message 002 for 1 second
  msg[0] = 002; //
  radio.write(msg, 1);} //write msg 


  digitalWrite(green, HIGH); //starting red HIGH
  if (digitalRead(green) == HIGH)delay(1000);{ // If red is HIGH Send Message 003 for 1 second
  msg[0] = 003;
  radio.write(msg, 1); //write msg 

}  
}}

RX code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
Code For Wireless traffic light Receiver. 
Head node sends signal to 3 other nodes in a star network

*/

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
int msg[1]; // Send over package message 
RF24 radio(9,10);       // Set up nRF24L01 radio on SPI bus plus pins 9 & 10 
const uint64_t pipe = 0xE8E8F0F0E1LL; // Radio pipe addresses for the 2 nodes to communicate.

int red = 5; // LED red on pin 7 
int orange = 4; // LED orange on pin 6 
int green = 3; // LED green on pin 5

void setup(void){ //Setup and configure rf radio
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(1,pipe); //Open pipe to base node for communication 
  radio.startListening(); //Starting to listen to base node 
  delay(40);
  
  pinMode (red, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (orange, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (green, OUTPUT);} // Pinmode for LED OUTPUT
 
void loop(void){
  if (radio.available()){ // if Radio available start Communication 
    bool done = false;    
    while (!done){ 
      done = radio.read(msg, 1);  // if done read msg     
      Serial.println(msg[0]); // print msg 
      if (msg[0] == 001){delay(10); // if msg 0 is 001 light red will start 
      digitalWrite(red, HIGH);
      digitalWrite(orange, LOW);
      digitalWrite(green, LOW);
 //     delay(1000);}
      if (msg[0] == 002){delay(10);// if msg 0 is 002 light orange will start
      digitalWrite(red, LOW);
      digitalWrite(orange, HIGH);
      digitalWrite(green, LOW);
 //     delay(1000);}
      if (msg[0] == 003){delay(10);// if msg 0 is 001 light red will start
      digitalWrite(red, LOW);
      digitalWrite(orange, LOW);
      digitalWrite(green, HIGH);
//      delay(1000);}
}}
 
 
 
  else{Serial.println("No radio available");}}

Veiligheid staat voor op http://www.juniorverkeerslichten.nl


  • omgwtfbbq
  • Registratie: Juli 2007
  • Laatst online: 19:52
if (digitalRead(red) == HIGH)delay(1000);{{ // If red is HIGH Send Message 001 for 1 second
msg[0] = 001;
radio.write(msg, 1);} //write msg

Ik vind dit een gekke constructie. Even vragen of het doet wat jij denkt dat het doet:
Als ik dit lees, zie ik: Zodra digitalRead op rood HIGH is, wacht dan 1 seconde. *daarna* verstuur ik het bericht. als die rood niet HIGH is, verstuur het bericht dan direct.

Ook zijn die twee {{ na de delay gek, voor mijn gevoel..

[ Voor 6% gewijzigd door omgwtfbbq op 27-11-2014 10:59 ]


  • klaboem
  • Registratie: April 2010
  • Laatst online: 22-08 11:39
In plaats van een delay kun je deze code gebruiken:
declareren:
C:
1
2
long time2 = millis();
long interval2 = 150;

En in je loop opnemen:
C:
1
2
3
4
5
{
 unsigned long m2 = millis();
 if (m2 - time2 >= interval1)
 {
  time2 = m2;

  • verbraakje
  • Registratie: Februari 2006
  • Laatst online: 24-09 21:46
Kijk hier heb ik wat aan! ik ga er vanavond meteen mee aan de gang. Ik laat het weten of het gelukt is!
Ik ben nieuw met arduino vandaar dat het misschien niet de meest logische manier is om dit te doen. Maar als het werkt ben ik blij.

Veiligheid staat voor op http://www.juniorverkeerslichten.nl


Acties:
  • 0 Henk 'm!

  • verbraakje
  • Registratie: Februari 2006
  • Laatst online: 24-09 21:46
Nou ik kom er niet aan uit. Als iemand voor een cadeau bon van ebay (15 $) mijn code kan fixen stuur me dan een pb.

Veiligheid staat voor op http://www.juniorverkeerslichten.nl


Acties:
  • 0 Henk 'm!

  • Dogooder
  • Registratie: April 2004
  • Laatst online: 23:48

Dogooder

dus...

Voordat je met cadeaubonnen gaat strooien zodat iemand anders het fixed zou ik eerst zelf eens goed er doorheen lopen. Begin is met je code opschonen:
- geen twee instructies op 1 regel.
- al je {} netjes geordent.
typ je if en else statements (ook al hoeft het niet) netjes uit met de juiste indents
C:
1
2
3
4
5
6
7
8
9
If(A>B)
{
     delay(1000);
     radio.write(msg,1);
}
else
{
    radio.write(msg_2,1);
}


Daarna kan je je code weer posten en kunnen we kijken waarom het niet doet wat het moet doen. Nu is het een chaos, zeker omdat je regels commetaar maakt met } erin. De code kan dan wat onvoorspelbaar worden.

[ Voor 20% gewijzigd door Dogooder op 28-11-2014 15:54 ]


Acties:
  • 0 Henk 'm!

  • heggico
  • Registratie: Augustus 2011
  • Laatst online: 06-10 12:20
Eens met Dogooder, iemand een cadeaubon sturen voor je code te fixen leer je zelf niets van.

Ik zou beginnen met wat dogooder zegt. Je hebt namelijk een aantal vreemde constructies:

code:
1
2
  digitalWrite(red, HIGH); //starting red HIGH
  if (digitalRead(red) == HIGH)


Die if kun je gewoon weglaten, die is altijd true. Je zet het zelf naar High en direct daarna kijk je of hij High is. Overigens is het enigste wat die if doet je delay erbij zetten, dus als ie false zou geven gaat ie nog steeds door, maar nu zonder delay.

Daarna heb je bij de RX dit staan:
code:
1
//     delay(1000);}

Die } heb je dus ook in je comment staan, dus krijg je nu een if in een if in een if. Dat kan geen kwaad als je weet wat je doet, maar in dit geval betwijfel ik het. Sterker nog, hij kijkt nu pas of het bericht je 002 is als het bericht 001 is, omdat hij in dat ifje moet komen om bij de 2de check te komen. In dit soort gevallen is het misschien beter om een switch te gebruiken:
http://arduino.cc/en/Reference/SwitchCase

Dus iets als:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch (msg[0]) 
{
    case 001:
    //ledje rood aan
    break;
    case 002:
    //ledje oranje aan
    break;
    case 003:
    //ledje groen aan
    break;
    default: 
    //het bericht is iets anders, dan komt hij hierin
}


Maar zoals ik hier bovenaan al zei (en Dogooder) begin eens met je code overzichtelijk te maken. Dan zie je veel eerder waar fouten zitten.

Acties:
  • 0 Henk 'm!

  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 22:23
Een goede editor is ook wel fijn bij het coden. Voor Arduino spul gebruikte ik vaak http://www.sublimetext.com
Dat kun je de indents (inspringing) ook makkelijk doen met tab etc. Grootste voordeel is de syntax highlighting (kleurtjes). De standaard Arduino editor heeft niet zoveel kleuren en is dus minder overzichtelijk.

Acties:
  • 0 Henk 'm!

  • verbraakje
  • Registratie: Februari 2006
  • Laatst online: 24-09 21:46
Ok ik ga nog poging wagen. Ik heb inderdaad geen idee wat ik aan het doen ben. Heb natuurlijk wel een stuk of 30 tutorials gemaakt maar echt zelf schrijven lukt me nog niet. Ik heb wel wat ervaring met HTML en klein beetje Java. Opzich vond ik dat ik al een aardig stuk ben gekomen en vanmiddag raakte ik misschien iets te gefrusteerd. Voor mijn gevoel moet ik nu alleen de delay nog toevoegen in de TX maar code. Echter als ik dat doe krijg ik dan geen signaal meer in de RX

@ThinkPad,
Ik heb sublimetext gedownload maar nog niet geinstalleerd. Ziet er handig uit. (waarschijnlijk ga ik het na dit project gebruiken)

@heggico
Ik heb die If nu weg gelaten in de TX. De code werkt inderdaad nog steeds naar behoren. (De RX ontvangt de berichtjes.) Dit is zonder delay in de TX code. (met delay werkt de code niet.) Die switch methode kende ik nog niet. Misschien dat ik daar eerst een tutorial mee moet gaan doen.

@Dogooder
Ik heb geprobeerd mijn code zo ver mogelijk op te ruimen. Maar doordaat ik niet precies weet wat ik weg kan halen is dit soms lastig. Ik heb nu het hele if gedeelde uit de TX gehaald


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
Code For Wireless traffic light Transceiver. 
Head node sends signal to 3 other nodes in a star network



*/
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

int msg[1]; // Send over package message 
RF24 radio(9,10);       // Set up nRF24L01 radio on SPI bus plus pins 9 & 10 
const uint64_t pipe = 0xE8E8F0F0E1LL; // Radio pipe addresses for the 2 nodes to communicate.

int red = 5; // LED red on pin 7 
int orange = 4; // LED orange on pin 6 
int green = 3; // LED green on pin 5

void setup(void)//Setup and configure rf radio
{
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(pipe);  // Open pipe to other nodes for communication
 
  pinMode (red, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (orange, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (green, OUTPUT); // Pinmode for LED OUTPUT
}


 
void loop(void){
   {
      digitalWrite(red, HIGH); // LED red HIGH
      msg[0] = 001;      // send message 001 
      radio.write(msg, 1);

   }
   {
      digitalWrite(orange, HIGH); //starting red HIGH
      msg[0] = 002; 
      radio.write(msg, 1);

   }
   {
      digitalWrite(green, HIGH); //starting red HIGH
      msg[0] = 003;
      radio.write(msg, 1); 

   }

}


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
Code For Wireless traffic light Receiver. 
Head node sends signal to 3 other nodes in a star network

*/

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

int msg[1]; // Send over package message 

RF24 radio(9,10);       // Set up nRF24L01 radio on SPI bus plus pins 9 & 10 
const uint64_t pipe = 0xE8E8F0F0E1LL; // Radio pipe addresses for the 2 nodes to communicate.

int red = 5; // LED red on pin 5 
int orange = 4; // LED orange on pin 4
int green = 3; // LED green on pin 3 

void setup(void) //Setup and configure rf radio
{ 
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(1,pipe); //Open pipe to base node for communication 
  radio.startListening(); //Starting to listen to base node 

  pinMode (red, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (orange, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (green, OUTPUT); // Pinmode for LED OUTPUT
  
}

void loop(void)
{
  if (radio.available())// if Radio available start Communication 
    { 
    bool done = false;    
    while (!done)
      { 
       done = radio.read(msg, 1);  // if done read msg     
        Serial.println(msg[0]); // print msg 
        
        if (msg[0] == 001)        // if msg 0 is 001 light red will start 
      {
        digitalWrite(red, HIGH);
        digitalWrite(orange, LOW);
        digitalWrite(green, LOW);
      }
        else
      {
        Serial.println("No radio available");
      }
        
        if (msg[0] == 002)// if msg 0 is 002 light orange will start
      {
        digitalWrite(red, LOW);
        digitalWrite(orange, HIGH);
        digitalWrite(green, LOW);
      }
        else
      {
        Serial.println("No radio available");
      }
      
        if (msg[0] == 003)// if msg 0 is 003 light red will start
          {
            digitalWrite(red, LOW);
            digitalWrite(orange, LOW);
            digitalWrite(green, HIGH);
          }
            else
          {
            Serial.println("No radio available");
        }
      }  // waar deze vandaan komen? 
    }   // waar deze vandaan komen? 
  }     // waar deze vandaan komen?

[ Voor 64% gewijzigd door verbraakje op 28-11-2014 20:17 ]

Veiligheid staat voor op http://www.juniorverkeerslichten.nl


Acties:
  • 0 Henk 'm!

  • 3xhaas
  • Registratie: Februari 2002
  • Laatst online: 26-09-2024
Receiver gedeelte iets opgeschoont voor je.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void loop(void)
{
  bool done = false;    //variabelen het best(netter) aan begin van functie declareren
  if (radio.available())// if Radio available start Communication 
  {
    while (!done)
    {
       done = radio.read(msg, 1);  // if done read msg     
       Serial.println(msg[0]); // print msg 
        
       if (msg[0] == 001)        // if msg 0 is 001 light red will start 
       {
          digitalWrite(red, HIGH);
          digitalWrite(orange, LOW);
          digitalWrite(green, LOW);
       }
       else if (msg[0] == 002)// if msg 0 is 002 light orange will start
       {
          digitalWrite(red, LOW);
          digitalWrite(orange, HIGH);
          digitalWrite(green, LOW);
       }
       else if (msg[0] == 003)// if msg 0 is 003 light red will start
       {
          digitalWrite(red, LOW);
          digitalWrite(orange, LOW);
          digitalWrite(green, HIGH);
       }
       else
       {
          Serial.println("No radio available");
       }
       //delay bv hier invoeren
    }//while
  }//if
}//loop


of anders
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void loop(void)
{
  bool done = false;    //variabelen het best(netter) aan begin van functie declareren
  if (radio.available())// if Radio available start Communication 
  {
    while (!done)
    {
       done = radio.read(msg, 1);  // if done read msg     
       Serial.println(msg[0]); // print msg 

       // er mag maar 1 branden volgens denk ik?
       digitalWrite(red, LOW);
       digitalWrite(orange, LOW);
       digitalWrite(green, LOW);
       if (msg[0] == 001)        // if msg 0 is 001 light red will start 
       {
          digitalWrite(red, HIGH);
       }
       else if (msg[0] == 002)// if msg 0 is 002 light orange will start
       {
          digitalWrite(orange, HIGH);
       }
       else if (msg[0] == 003)// if msg 0 is 003 light red will start
       {
          digitalWrite(green, HIGH);
       }
       else
       {
          Serial.println("No radio available");
       }
       //delay bv hier invoeren
    }//while
  }//if
}//loop


Het is mij niet duidelijk of er continue waarden worden verzonden. En zo ja of bij een rood stoplicht dan steeds 1 wordt verstuurd of eenmaal 1 en daarna bv 0.
Daarnaast waarom zou je een delay in je ontvangst gedeelte willen. Je wilt toch dat die zich zo snel mogelijk aan de nieuwe situatie aanpast?
Een delay of variant daarvan kun je dan beter in de zender zetten. Het mooiste lijkt mij om dat met een timer te doen die gewoon de msg waarde ophoogt.

Ik programmeer normaliter geen arduino's maar PIC's met CCS dus vergeef me als de timer routine niet 100% klopt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
Code For Wireless traffic light Transceiver. 
Head node sends signal to 3 other nodes in a star network



*/
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

int msg[1]; // Send over package message 

#INT_T1 //interrupt routine timer
{
  msg[0]++;
  set_timer1(0); //waarde aanpassen om juiste timing te krijgen
  if(msg[0] > 3)
  {
    msg[0] = 1;
  }
}



RF24 radio(9,10);       // Set up nRF24L01 radio on SPI bus plus pins 9 & 10 
const uint64_t pipe = 0xE8E8F0F0E1LL; // Radio pipe addresses for the 2 nodes to communicate.

int red = 5; // LED red on pin 7 
int orange = 4; // LED orange on pin 6 
int green = 3; // LED green on pin 5

void setup(void)//Setup and configure rf radio
{
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(pipe);  // Open pipe to other nodes for communication
 
  pinMode (red, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (orange, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (green, OUTPUT); // Pinmode for LED OUTPUT

  setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
  set_timer1(0); //waarde aanpassen om juiste timing te krijgen
  enable_interrupts(GLOBAL);
  enable_interrupts(INT_T1);
}

void loop(void)
{
  digitalWrite(red, LOW);       // LED red LOW
  digitalWrite(orange, LOW);    // LED orange LOW
  digitalWrite(green, LOW);     // LED green LOW
  if(msg[0] == 1)   
  {
    digitalWrite(red, HIGH);    // LED red HIGH
  }
  else if(msg[0] == 2)   
  {
    digitalWrite(orange, HIGH); // LED orange HIGH
  }
  else if(msg[0] == 3)   
  {
    digitalWrite(green, HIGH);  // LED green HIGH
  }
  radio.write(msg, 1);
}


Succes

Acties:
  • 0 Henk 'm!

  • verbraakje
  • Registratie: Februari 2006
  • Laatst online: 24-09 21:46
3xhaas bedankt voor je reactie en het opschonen van mijn code.
Het was inderdaad mijn bedoeling om de Delay / timer in de zender te zetten. Dit is dan ook meteen het probleem dat ik dat niet voor mekaar krijg. Als ik de delay/timer in de ontvanger zet werkt mijn code gewoon. maar hierdoor lopen de verschillende boardjes uiteindelijk niet meer syngroom.

Ik had als idee dat de zender per situatie een constante waarde word verzonden tot dat de timer naar de volgende waarde gaat. Dit omdat er misschien pakketjes niet kunnen aankomen door wat voor reden dan ook.

bij jou transmitter code krijg ik momenteel echter nog een fout melding in het #INT_T1 gedeelte. Waarschijnlijk zal ik dus een andere timer methode moeten gebruiken?
Afbeeldingslocatie: http://i59.tinypic.com/22lx6a.png

Super bedankt tot nu!

Veiligheid staat voor op http://www.juniorverkeerslichten.nl


Acties:
  • 0 Henk 'm!

  • Dogooder
  • Registratie: April 2004
  • Laatst online: 23:48

Dogooder

dus...

Je Timer interrupt routine heeft iets meer informatie nodig om correct te werken. Het voorbeeld van 3xhaas is slechts functioneel.
Kijk anders naar de TimerOne library.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
 *  Timer1 library example
 *  June 2008 | jesse dot tane at gmail dot com
 */
 
#include "TimerOne.h"
 
void setup()
{
  Timer1.initialize(1000000);         // initialize timer1, and set a 1 second period
         
  Timer1.attachInterrupt(callback);  // attaches callback() as a timer overflow interrupt
}
 
void callback()
{
  msg[0]++;
  if(msg[0] > 3)
  {
    msg[0] = 1;
  }
}
 
void loop()
{
  // your program here...
}


Bovenstaande even snel copy-pasted, verdiep je er even in :P

Acties:
  • 0 Henk 'm!

  • verbraakje
  • Registratie: Februari 2006
  • Laatst online: 24-09 21:46
Hoi Dogooder,

Bedankt voor je reactie. Ik ga me hierin verder verdiepen. Het word (gelukkig) allemaal iets duidelijker. Maar het helpt als je weet wat je moet zoeken;)

Momenteel de sketz aangepast en de leds op de Tranceiver lopen netjes (nog met 1 vaste tijd sprong).
Nu ontvang ik allemaal random nummers op de Receiver (eigenlijk vooral 255?) De nRF24L01 zit op pin 9 en 10. Ik vroeg me na het lezen van een artikel op arduino.cc of dit wel mogelijk was.link

setPeriod(period) kan ik niet gebruiken omdat de timer langer moet zijn dan 8 seconden.


Volgens mij heb ik het werkend _/-\o_

Alleen nu nog 2 verschillende delay tijden. hopelijk is dat mogelijk?

Ik zou willen dat hij 10 seconden op oranje komt te staan en 30 seconden op rood/groen


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 /*
Code For Wireless traffic light Transceiver. 
Head node sends signal to 3 other nodes in a star network



*/
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "TimerOne.h" 

int msg[1]; // Send over package message 
RF24 radio(9,10);       // Set up nRF24L01 radio on SPI bus plus pins 9 & 10 
const uint64_t pipe = 0xE8E8F0F0E1LL; // Radio pipe addresses for the 2 nodes to communicate.

int red = 5; // LED red on pin 7 
int orange = 4; // LED orange on pin 6 
int green = 3; // LED green on pin 5

void setup(void)//Setup and configure rf radio
{
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(pipe);  // Open pipe to other nodes for communication
 
  pinMode (red, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (orange, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (green, OUTPUT); // Pinmode for LED OUTPUT
  
// Timer1 
  Timer1.initialize(1000000);         // initialize timer1, and set a 1 second period   
  Timer1.attachInterrupt(callback);  // attaches callback() as a timer overflow interrupt
  
}


void callback()
{
  msg[0]++;
  if(msg[0] > 3)
  {
    msg[0] = 1;
  }
}
 
void loop(void)
{
  digitalWrite(red, LOW);       // LED red LOW
  digitalWrite(orange, LOW);    // LED orange LOW
  digitalWrite(green, LOW);     // LED green LOW
  if(msg[0] == 1)   
  {
    digitalWrite(red, HIGH);    // LED red HIGH
  }
  else if(msg[0] == 2)   
  {
    digitalWrite(orange, HIGH); // LED orange HIGH
  }
  else if(msg[0] == 3)   
  {
    digitalWrite(green, HIGH);  // LED green HIGH
  }
  radio.write(msg, 1);
}

[ Voor 103% gewijzigd door verbraakje op 02-12-2014 15:55 ]

Veiligheid staat voor op http://www.juniorverkeerslichten.nl


Acties:
  • 0 Henk 'm!

  • 3xhaas
  • Registratie: Februari 2002
  • Laatst online: 26-09-2024
Je kunt timer values veranderen, maar je kunt ook ipv 3 waarden voor msg[0] er 7 gebruiken. Bij de eerste 3 staat op groen de 4e op oranje en de laatste 3 op rood of andersom natuurlijk. Precies wat je wilt.

Acties:
  • 0 Henk 'm!

  • verbraakje
  • Registratie: Februari 2006
  • Laatst online: 24-09 21:46
3xhaas je hebt gelijk helemaal niet aan gedacht! Ik zal in de loop van de tijd een foto posten van het prototype!

Veiligheid staat voor op http://www.juniorverkeerslichten.nl


Acties:
  • 0 Henk 'm!

  • verbraakje
  • Registratie: Februari 2006
  • Laatst online: 24-09 21:46
Toch nog even een update

Ik wil iedereen bedankten die mij heeft geholpen. _/-\o_
In het filmpje hieronder zie je het resultaat (het is een eerste prototype.)

Veiligheid staat voor op http://www.juniorverkeerslichten.nl


  • verbraakje
  • Registratie: Februari 2006
  • Laatst online: 24-09 21:46
Beste Tweakers,

Ik ben al weer een eindje opweg met mijn stoplichten. Nu lijkt het me echter leuk/handig om twee verschillende timers toe te voegen. Nu heb ik wat research gedaan maar kom er niet helemaal uit.

Ik gebruik momenteel Timer1 om de tijd in te stellen van de verschillende msg. Dit werkt perfect en de code blijft mooi op tijd lopen. Nu heb ik eigenlijk niets terug gevonden hoe ik een tweede timer kan toevoegen en deze met een druk op een knop kan activeren?

Een andere optie zou zijn om de callback te veranderen zodat deze eerst bijvoorbeeld msg 1t/m8 weg stuurt en wanneer de knop word ingedrukt msg 9/20 word weg gestuurd.

De laatste optie die ik in gedachten had was de hardware manier en dat houdt in dat ik een tweede arduino gebruik met een andere timer (deze optie lijkt me nogal omslachtig maar haalbaar)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
Code For Wireless traffic light Transceiver. 
Head node sends signal to 3 other nodes in a star network



*/
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "TimerOne.h" 

int msg[1]; // Send over package message 
RF24 radio(9,10);       // Set up nRF24L01 radio on SPI bus plus pins 9 & 10 
const uint64_t pipe = 0xE8E8F0F0E1LL; // Radio pipe addresses for the 2 nodes to communicate.

int red1 = 8; // LED red on pin 7 
int orange1 = 7; // LED orange on pin 6 
int green1 = 6; // LED green on pin 5
int red2 = 5; // LED red on pin 7 
int orange2 = 4; // LED orange on pin 6 
int green2 = 3; // LED green on pin 5

void setup(void)//Setup and configure rf radio
{
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(pipe);  // Open pipe to other nodes for communication
 
  pinMode (red1, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (orange1, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (green1, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (red2, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (orange2, OUTPUT); // Pinmode for LED OUTPUT
  pinMode (green2, OUTPUT); // Pinmode for LED OUTPUT
  
// Timer1 
  Timer1.initialize(10000000);         // initialize timer1, and set a 1 second period   
  Timer1.attachInterrupt(callback);  // attaches callback() as a timer overflow interrupt
  
}


void callback()
{
  msg[0]++;
  if(msg[0] > 8)
  {
    msg[0] = 1;
  }
}
 
void loop(void)
{
  digitalWrite(red1, LOW);       // LED red LOW
  digitalWrite(orange1, LOW);    // LED orange LOW
  digitalWrite(green1, LOW);     // LED green LOW  
  digitalWrite(red2, LOW);       // LED red LOW
  digitalWrite(orange2, LOW);    // LED orange LOW
  digitalWrite(green2, LOW);     // LED green LOW
  
  
  if(msg[0] == 1)   
  {
    digitalWrite(red1, HIGH);    // LED red1 HIGH
    digitalWrite(green2, HIGH);    // LED green2 HIGH
  }
  else if(msg[0] == 2)   
  {
    digitalWrite(red1, HIGH);    // LED red1 HIGH
    digitalWrite(green2, HIGH);    // LED green2 HIGH
  }
  else if(msg[0] == 3)   
  {
    digitalWrite(red1, HIGH);    // LED red1 HIGH
    digitalWrite(green2, HIGH);    // LED green2 HIGH
  }
  else if(msg[0] == 4)   
  {
    digitalWrite(red1, HIGH);    // LED red1 HIGH
    digitalWrite(orange2, HIGH);    // LED orange2 HIGH
  }  
  else if(msg[0] == 5)   
  {
    digitalWrite(green1, HIGH);    // LED green1 HIGH
    digitalWrite(red2, HIGH);    // LED red2 HIGH
  }
  else if(msg[0] == 6)   
  {
    digitalWrite(green1, HIGH);    // LED green1 HIGH
    digitalWrite(red2, HIGH);    // LED red2 HIGH
  }
  else if(msg[0] == 7)   
  {
    digitalWrite(green1, HIGH);    // LED green1 HIGH
    digitalWrite(red2, HIGH);    // LED red2 HIGH
  }
  else if(msg[0] == 8)   
  {
    digitalWrite(orange1, HIGH);    // LED orange1 HIGH
    digitalWrite(red2, HIGH);    // LED red2 HIGH
  }
  radio.write(msg, 1);
}

Veiligheid staat voor op http://www.juniorverkeerslichten.nl

Pagina: 1