Wire.h vraagje
12 berichten
• Pagina 1 van 2 • 1, 2
Wire.h vraagje
Hoi
Ik wil van Arduino A een waarde doorspelen naar Arduino B. Ik wil hiervoor wie.h gebruiken.
Ik ben al even aan het pielen maar begrijp niet hoe ik die waarde van A naar B krijg.
Ik heb poorten A4 en A5 (omgekeerd) verbonden en een GND van A naar B.
De A is master zonder adres, de B heeft als adres 0x10.
Ik gebruik in de B (ontvanger)
Dus... Event op A --> event op B
Op de A Arduino gebruik ik:
Op Arduino B heb ik:
Ik heb de Slave op de computer aangesloten en de master op een externe voeding.
In de serial monitor zie ik geen enkele actie van Arduino B wanneer ik de functie aanroep in Arduino A.
Ik heb het idee dat ij iets fout doe bij de (int) achter void receiveEvent(int) maar kom er niet uit...
Iemand die me kan helpen hiermee of de juiste richting op kan sturen?
Thanks!
Ik wil van Arduino A een waarde doorspelen naar Arduino B. Ik wil hiervoor wie.h gebruiken.
Ik ben al even aan het pielen maar begrijp niet hoe ik die waarde van A naar B krijg.
Ik heb poorten A4 en A5 (omgekeerd) verbonden en een GND van A naar B.
De A is master zonder adres, de B heeft als adres 0x10.
Ik gebruik in de B (ontvanger)
- Code: Alles selecteren
Wire.onReceive(receiveEvent);
Dus... Event op A --> event op B
Op de A Arduino gebruik ik:
- Code: Alles selecteren
Wire.beginTransmission(0x10);Wire.write (1);Wire.endTransmission();
Op Arduino B heb ik:
- Code: Alles selecteren
void receiveEvent(int) {
int x = Wire.read(); // receive byte as an integer
Serial.println(x); // print the integer
}
Ik heb de Slave op de computer aangesloten en de master op een externe voeding.
In de serial monitor zie ik geen enkele actie van Arduino B wanneer ik de functie aanroep in Arduino A.
Ik heb het idee dat ij iets fout doe bij de (int) achter void receiveEvent(int) maar kom er niet uit...
Iemand die me kan helpen hiermee of de juiste richting op kan sturen?
Thanks!
Advertisement
Re: Wire.h vraagje
Begin eens met A4 en A5 recht te verbinden. Het is een bus, geen RS232 protocol waarbij je de TX en RX wisselt.
Re: Wire.h vraagje
Beamer schreef:Begin eens met A4 en A5 recht te verbinden. Het is een bus, geen RS232 protocol waarbij je de TX en RX wisselt.
Zoveel gelezen dat ik er in het begin van het ware.h verhaal zorg voor heb gedragen dit verkeerd te doen... komt omdat ik eerst met tx/rx bezig was. Dit had nog lang kunnen duren zonder je antwoord, Beamer. Thanks, alles werkt zoals gehoopt...
Re: Wire.h vraagje
Gaat toch iets niet goed, jammergenoeg.
Arduino A stuur een commando naar arduino B:
En in de loop staat bij een IF statement de volgende actie:
Er wordt een 1 naar arduino 2 gestuurd. Die komt ook aan volgens serial monitor.
De code in Arduino B is:
en als event heb ik:
De startwaarde van de timer moet X worden, en X ==1 na drukken knop op arduino A.
Die '1' komt wel over maar soms start de WHILE loop niet... waardoor die knop dus niet correct werkt.
Ik krijg de ware.onrecieve niet in een while, alleen in de setup. Maar controleert Arduino B nu wel continue de waarde? Moet ik niet ergens in de while loops kijken of er op en knop gedrukt is op arduino B?
--------------------
output serial monitor
0
1
### Tijd_1_Rijder ###
65910 Starttijd
72399
NIEUW 6.489
OUD 0.000
0
1
Ht rode gedeelte is wat goed is, de timer wordt gestart omdat de status '1' is. Bij de tweede keer drukken (some 4s, soms 10e), komt de '1' wel over, maar is er geen vervolg meer, dus de while die nu moet aanspringen (met starttijd etc) springt niet aan.
Arduino A stuur een commando naar arduino B:
- Code: Alles selecteren
void setup() {
Wire.begin();
}
En in de loop staat bij een IF statement de volgende actie:
- Code: Alles selecteren
Wire.beginTransmission(0x10);Wire.write (1);Wire.endTransmission();
Er wordt een 1 naar arduino 2 gestuurd. Die komt ook aan volgens serial monitor.
De code in Arduino B is:
- Code: Alles selecteren
void setup()
{
Wire.begin(0x10); // 10 is slave!
Wire.onReceive(receiveEvent); // register event
en als event heb ik:
- Code: Alles selecteren
void receiveEvent(int) { // DATA TRANSFER VAN ARDUINO A
int x = Wire.read(); // Byte binnenhalen
Serial.println(x); // Tijdelijk!
StartWaarde=x; // Timer starten!
}
De startwaarde van de timer moet X worden, en X ==1 na drukken knop op arduino A.
Die '1' komt wel over maar soms start de WHILE loop niet... waardoor die knop dus niet correct werkt.
Ik krijg de ware.onrecieve niet in een while, alleen in de setup. Maar controleert Arduino B nu wel continue de waarde? Moet ik niet ergens in de while loops kijken of er op en knop gedrukt is op arduino B?
--------------------
output serial monitor
0
1
### Tijd_1_Rijder ###
65910 Starttijd
72399
NIEUW 6.489
OUD 0.000
0
1
Ht rode gedeelte is wat goed is, de timer wordt gestart omdat de status '1' is. Bij de tweede keer drukken (some 4s, soms 10e), komt de '1' wel over, maar is er geen vervolg meer, dus de while die nu moet aanspringen (met starttijd etc) springt niet aan.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Wire.h vraagje
Zet je hele code ff hier neer van beide programma's...
Re: Wire.h vraagje
Arduino A
cpp code
en arduino B
cpp code
cpp code
#include <Wire.h>
const int StartPin = 9; // BUTTON start/stop
int StartState = 0; // Status van de STARTPIN
const int ResetPin = 8; // BUTTON voor resetten van gate, niet nodig voor magneet!
int ResetState = 0; // Status van de RESETSTATE
const int RedLedPin = 5; // Rode LED
const int Or1LedPin = 4; // Oranje LED 1
const int Or2LedPin = 3; // Oranje LED 2
const int GreenLedPin = 2; // GROENE LED 1
int GateState = 0; // Status : Gate is omhoog [1] of omlaag [0[
int GatePin = 6; // BUTTON om te zien of hek omhoog is
int GateUpStatus; // Status van de GatePin
int SpeakerOut = 10; // SPEAKER op pin 10
long RandNumber; // voor random start // RANDOM Nummer voor random start
const int Magnet = 7; // Magneet PIN 7 [blauw LED op board]
void setup() { // eenmalig
Wire.begin(); // join i2c bus (address optional for master), 1 is de master of the UNIVERSEEEEEE! dus.
pinMode(GreenLedPin, OUTPUT);
pinMode(Magnet, OUTPUT);
pinMode(SpeakerOut, OUTPUT);
pinMode(GatePin, INPUT_PULLUP);
Serial.begin(9600); // SERIELE output ter controle
/*
* Boot routine hier
*
*/
}
void loop() {
/*
* GatePin = 1 [gate up dus] dan kan er gestart worden anders niet.
* Dit deel doet een toggle op de GatePin button.
*/
GateUpStatus = digitalRead(GatePin);
if (GateUpStatus == LOW && GateState == 1) {
GateState = 0; // toggle gatestatus 0= omlaag, 1 is omhoog
} if (GateUpStatus == LOW && GateState == 0) {
GateState = 1;;
}
Serial.println(GateState); // output 0 of 1
if (GateState == 1)
{ digitalWrite(Magnet, HIGH);
} // Magneet AAN
else if (GateState == 0) {
digitalWrite(Magnet, LOW); // Magneet UIT
}
/*
* Start procedure wanneer gate omhoog is kan gestart worden. LET OP: pullup buttons werken ANDERSOM!
*/
StartState = digitalRead(StartPin);
if (StartState == LOW && GateState == 1) // STARTKNOP wordt gedrukt terwijl hek omhoog is, doorgaan!
{ RandNumber = random(10, 2700); Serial.println(RandNumber); // random nummer voor delay (0 - 2.7 sec)
// Wire.beginTransmission(0x10);Wire.write (0);Wire.endTransmission();
// START SEQUENCE BEGINT HIER
// Delay van 5 seconden voordat start begint zodat rijder klaar kan gaan staan!
digitalWrite(GreenLedPin, LOW); digitalWrite(RedLedPin, LOW); digitalWrite(Or2LedPin, LOW); digitalWrite(Or1LedPin, LOW);
delay(1000); //5
// Einde Delay van 5 sec
delay(RandNumber); // random delay instellen 0 - 2,5 sec
digitalWrite(Magnet, LOW); digitalWrite(GreenLedPin, HIGH); tone(SpeakerOut, 632, 2500);
Wire.beginTransmission(8); Wire.write (1); Wire.endTransmission();
// lamp en tone en MAGNEET
delay(2520);
digitalWrite(GreenLedPin, LOW); // LED UIT
GateState = 0; Serial.println("Start is gedaan! Gate down!");
}// GATE DOWN
else
{
Serial.println("GEEN START ");
}
delay(300);
}
en arduino B
cpp code
#include <Wire.h>
unsigned long time, StartTijd, EindTijd, Duur; // Tijd Vars
unsigned long R1Nieuw = 0.00, R1Oud = 0.00, R2Nieuw = 0.00; // Tijd Vars voor rijders
unsigned long RandNumber; // Alleen voor testen nodig!
const int StartKnop = 5; // ## pin 5 ## Startknop
int StartState = 0; // Startstatus van knop
int StartWaarde = 0; // Startwaarde toegekend door drukken knop
const int StopKnop = 6; // ## pin 6 ## Stopknop
int StopState = 0; // Stopstatus van knop
int StopWaarde = 0; // Stopwaarde toegekend door drukken knop
const int RijderKnop = 3; // ## pin 3 ## Rijdersknop
int RijderState = 1; // Stopstatus van knop 1 = 1 rijder, 0 = 2 rijders
int RijderWaarde = 0; // Rijderwaarde toegekend door schakelaar
int WieNu = 1; // Welke rijder is nu? rijder 1 of 2
int Start1var = 0;
int Eind1var = 0;
int Start21var = 0;
int Eind21var = 0;
int Start22var = 0;
int Eind22var = 0;
int x = 0;
void setup()
{ // Void Setup start
Wire.begin(8); // 8 is slave!
Wire.onReceive(receiveEvent); // register event
pinMode(StartKnop, INPUT_PULLUP); // Init van Startknop [pulse van Arduino 1]
pinMode(StopKnop, INPUT_PULLUP); // Init van Stopknop [pulse van Laser]
pinMode(RijderKnop, INPUT_PULLUP); // Init rijders, met 1/0 schakelaar
Serial.begin(9600); // Serial output, mag vewijderd worden
} // Void Setup einde
void loop()
{ // Void Loop start
// StartState = digitalRead(StartKnop);
// if (StartState == HIGH){StartWaarde=0;} //NO GO!!!
// if (StartState == LOW) {StartWaarde=1;} // startknop gedrukt
if (x == 0) {
StartWaarde = 0;
}
if (x == 1) {
StartWaarde = 1;
}
StopState = digitalRead(StopKnop);
if (StopState == HIGH) {
StopWaarde = 0; // <-- actief maken als knopper er zijn! 0= no go
}
if (StopState == LOW) {
StopWaarde = 1; // <-- actief maken als knopper er zijn!
}
RijderWaarde = digitalRead(RijderKnop); // aamtal rijders
if (RijderWaarde == HIGH) {
RijderState = 1; // 1 rijders // <-- actief maken als knopper er zijn!
}
if (RijderWaarde == LOW) {
RijderState = 0; // 2 rijders // <-- actief maken als knopper er zijn!
}
/////// MODUS 1 RIJDER
// start gedrukt, rijderselectie =1 en StopWaarde =0, dus uit, nu dus subloop draaien tot stop == low (aan))
while ( StartWaarde == 1 && RijderState == 1 && StopWaarde == 0 && Start1var < 1)
{
Serial.println("\n### Tijd_1_Rijder ###"); Tijd_1_Rijder();
} // while end
// stop gedrukt, rijderselectie =1 en StopStatus = 1, dus aan!, nu dus subloop draaien voor resultaat
while ( Start1var == 1 && RijderState == 1 && StopWaarde == 1 && Eind1var < 1)
{
EindTijd_1_Rijder();
} // while end
} // Void Loop einde
////////////////////////////////////////
/////// LOOPS
////////////////////////////////////////
void receiveEvent(int) { // DATA TRANSFER VAN ARDUINO A
int x = Wire.read(); // Byte binnenhalen
Serial.println(x); // Tijdelijk!
StartWaarde = 1; Serial.println(StartWaarde); // Timer starten!
}
/////// MODUS 1 RIJDER
void Tijd_1_Rijder() // Start 1 rijder Modus, Start
{
if (R1Nieuw > 0) {
R1Oud = R1Nieuw; // Staat al een tijd! dus huidige tijd naar oude tijd
R1Nieuw = 0.00;
}
StartTijd = time = millis(); // Starttijd noteren
Serial.print(StartTijd); Serial.println(" Starttijd"); // Serieel tijdelijk
Start1var = 1; Eind1var = 0; // toggle status
} // Start 1 rijder Modus, Einde
void EindTijd_1_Rijder() // Einde 1 rijder Modus, Start
{
EindTijd = time = millis(); Serial.println(EindTijd); // == starttijd + random
R1Nieuw = (EindTijd - StartTijd); // Verstreken tijd in MS
Serial.print("NIEUW "); Serial.println(R1Nieuw / 1000.0, 3); // <-- dit moet naar bovenste DIGITS
Serial.print("OUD "); Serial.println(R1Oud / 1000.0, 3); // <-- dit moet naar onderste DIGITS
Start1var = 0; Eind1var = 1; StartWaarde = 0; // toggle status
} // Einde 1 rijder Modus, Einde
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Wire.h vraagje
eerste reactie: NETTE CODE!!!!!
Ik zal morgen wel ff kijken
Ik zal morgen wel ff kijken
Re: Wire.h vraagje
Heb de baudrate aangepast, die was misschien te laag... maar op 115200 werkt het ook niet. Probleem is dat het puur willekeur is, of zo lijkt het. De ene keer kan ik de procedure 10x doen zonder een enkele fout, de andere keer gaat het bij de tweede keer al mis. Lijkt alsof de tweede code soms niks met de doorgekregen waarde doet. In de ser.monitor zie ik wel een '1' genoteerd, dus hij komt wel over, maar dan is er geen actie meer van het tweede script. Het kan dus zijn dat er 4 keer geen actie komt op een commando, maar de vijfde keer gaat het weer prima
Iemand enig idee waar ik het moet zoeken?
Thanks!
12 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 84 gasten