Wire.h vraagje

Arduino specifieke Software
Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Wire.h vraagje

Berichtdoor snewpers » 31 Okt 2015, 17:48

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)
Code: Alles selecteren
 Wire.onReceive(receiveEvent);
om een event te starten, bijvoorbeeld een waarde van een Var van 0 naar 1 omzetten, iets wat een button op B ook zou doen. Alleen wil ik die waarde aanpassen wanneer er een event op arduino A wordt gedaan.

Dus... Event op A --> event op B

Op de A Arduino gebruik ik:
Code: Alles selecteren
Wire.beginTransmission(0x10);Wire.write  (1);Wire.endTransmission();
// waarbij de '1' de waarde is die ik wil gebruiken als trigger voor een event op Arduino B;

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

Berichten: 77
Geregistreerd: 06 Okt 2012, 10:57

Re: Wire.h vraagje

Berichtdoor Beamer » 31 Okt 2015, 17:52

Begin eens met A4 en A5 recht te verbinden. Het is een bus, geen RS232 protocol waarbij je de TX en RX wisselt.

Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Re: Wire.h vraagje

Berichtdoor snewpers » 31 Okt 2015, 18:48

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.


:oops:

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... :D

Berichten: 77
Geregistreerd: 06 Okt 2012, 10:57

Re: Wire.h vraagje

Berichtdoor Beamer » 31 Okt 2015, 19:26

:D :D

Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Re: Wire.h vraagje

Berichtdoor snewpers » 03 Nov 2015, 16:26

Gaat toch iets niet goed, jammergenoeg.

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.

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

Re: Wire.h vraagje

Berichtdoor nicoverduin » 03 Nov 2015, 18:28

Zet je hele code ff hier neer van beide programma's...
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Re: Wire.h vraagje

Berichtdoor snewpers » 03 Nov 2015, 19:04

Arduino A

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

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

Re: Wire.h vraagje

Berichtdoor nicoverduin » 03 Nov 2015, 21:07

eerste reactie: NETTE CODE!!!!!
Ik zal morgen wel ff kijken
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Re: Wire.h vraagje

Berichtdoor snewpers » 03 Nov 2015, 22:20

Haha thanks! Maar doet het nog niet 100% :)

Berichten: 52
Geregistreerd: 15 Okt 2015, 21:14

Re: Wire.h vraagje

Berichtdoor snewpers » 05 Nov 2015, 23:04

:?

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 :shock:

Iemand enig idee waar ik het moet zoeken?
Thanks!

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 84 gasten