probleem met code

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 5
Geregistreerd: 19 Mei 2017, 18:50

probleem met code

Berichtdoor haasje » 19 Mei 2017, 20:03

Hallo,

Ook ik heb me maar eens gewaagt aan een Arduino projectje.
situatie:

ik heb op lokatie 1 een set gemultiplexte schakelaars (totaal 12 stuks 3x4)
Deze lees ik met een arduino nano uit en stuur de gegevens vervolgens naar een andere lokatie met een I2C verbinding.
Op lokatie 2 heb ik een Arduino Uno (zal vervangen gaan worden door een 2de nano).
Deze moet het I2C signaal gaan omzetten naar digitale uitgangen.
Tot zo ver de situatie, maar nu het probleem.
De nano lijkt zijn werk goed te doen en verstuurd de data naar de uno. De gegevens komen in de uno aan en kan ik via de seriele monitor ook zien. Echter lukt het me niet om deze data om te zetten naar de digitale uitgangen. Ik krijg met de onderstaande code geen foutmeldingen, echter worden de uitgangen niet aangestuurd.
De code voor de aansturing van de digitale uitgangen is nog niet compleet, maar als ik maar vast 1 uitgang werkend heb zal de rest ook wel gaan lukken.

De code is deels opgebouwd uit voorbeeld codes die ik aangepast/gecombineerd heb.
Wie kan me helpen een zetje in de goede richting te geven.
Code: Alles selecteren
#include <Wire.h>

byte dpin1 = 2;
byte dpin2 = 3;
byte dpin3 = 4;
byte dpin4 = 5;
byte dpin5 = 6;
byte dpin6 = 7;
byte dpin7 = 8;
byte dpin8 = 9;
byte dpin9 = 10;

void setup() {
  pinMode(dpin1, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin2, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin3, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin4, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin5, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin6, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin7, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin8, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin9, OUTPUT);              // Sets the digital pin as output.
  digitalWrite(dpin1, LOW);           // Turn the LED off.
  digitalWrite(dpin2, LOW);           // Turn the LED off.
  digitalWrite(dpin3, LOW);           // Turn the LED off.
  digitalWrite(dpin4, LOW);           // Turn the LED off.
  digitalWrite(dpin5, LOW);           // Turn the LED off.
  digitalWrite(dpin6, LOW);           // Turn the LED off.
  digitalWrite(dpin7, LOW);           // Turn the LED off.
  digitalWrite(dpin8, LOW);           // Turn the LED off.
  digitalWrite(dpin9, LOW);           // Turn the LED off.
  Wire.begin(8);                // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop() {
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
  while (1 < Wire.available()) { // loop through all but the last
  char key = Wire.read();

            if (key == '1') {
            digitalWrite(dpin1, HIGH);
            delay (100);
            digitalWrite(dpin1, LOW);
            }

  Serial.print(key);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
  }

Advertisement

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

Re: probleem met code

Berichtdoor nicoverduin » 19 Mei 2017, 20:20

Heb je die delay al eens verhoogd? 100mSec is wel heel kort.
En kun je hier ff wat van die seriele output ook zetten?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 5
Geregistreerd: 19 Mei 2017, 18:50

Re: probleem met code

Berichtdoor haasje » 19 Mei 2017, 20:46

ik heb de delay ook al uitgezet gehad, dit hielp niet
Dit is de code van de nano:

Code: Alles selecteren
// Wire Master Writer
#include <Keypad.h>
#include <Wire.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'} 
};

byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup() {
    Serial.begin(9600);
    keypad.addEventListener(keypadEvent); // Add an event listener for this keypad
    Wire.begin(1); // join i2c bus (address optional for master)
}

void loop() {
  char key = keypad.getKey();

    if (key) {
        Serial.println(key);
    }
}

void keypadEvent(KeypadEvent key){
    switch (keypad.getState()){
    case PRESSED:
        if (key == '1') {   
        Wire.beginTransmission(8);
        Wire.write(1);             
        Wire.endTransmission();   
        }

        if (key == '2') {   
        Wire.beginTransmission(8);
        Wire.write(2);             
        Wire.endTransmission();   
        }

        if (key == '3') {   
        Wire.beginTransmission(8);
        Wire.write(3);             
        Wire.endTransmission();   
        }

        if (key == '4') {   
        Wire.beginTransmission(8);
        Wire.write(4);             
        Wire.endTransmission();   
        }

        if (key == '5') {   
        Wire.beginTransmission(8);
        Wire.write(5);             
        Wire.endTransmission();   
        }

        if (key == '6') {   
        Wire.beginTransmission(8);
        Wire.write(6);             
        Wire.endTransmission();   
        }

        if (key == '7') {   
        Wire.beginTransmission(8);
        Wire.write(7);             
        Wire.endTransmission();   
        }

        if (key == '8') {   
        Wire.beginTransmission(8);
        Wire.write(8);             
        Wire.endTransmission();   
        }

        if (key == '9') {   
        Wire.beginTransmission(8);
        Wire.write(9);             
        Wire.endTransmission();   
        }

        if (key == '*') {   
        Wire.beginTransmission(8);
        Wire.write(10);           
        Wire.endTransmission();   
        }

        if (key == '0') {   
        Wire.beginTransmission(8);
        Wire.write(0);             
        Wire.endTransmission();   
        }

        if (key == '#') {   
        Wire.beginTransmission(8);
        Wire.write(11);           
        Wire.endTransmission();   
        }
    }
}

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

Re: probleem met code

Berichtdoor Koepel » 19 Mei 2017, 20:59

Het zou wel kunnen werken, maar beschrijf eerst goed vast wat je wilt.

Beschrijf bijvoorbeeld drie dingen:
Je hebt het keypad, met de codes.
Je hebt wat je over de I2C bus stuurt
Je hebt de digitale uitgangen.

Wat wil je over de I2C bus sturen ? De leesbare ASCII waarde van '1' of een binaire variabele van 1. Je mengt het nu door elkaar.

De receiveEvent() is een interrupt functie. Daar graag geen while-loop, geen Serial functies, geen delay. Bij voorkeur alleen een Wire.read() en een digitalWrite(). Je wilt misschien graag wat extra informatie naar de seriële monitor sturen, maar zodra je daar Serial functies gebruikt dan kunnen er dingen mis gaan.

Berichten: 5
Geregistreerd: 19 Mei 2017, 18:50

Re: probleem met code

Berichtdoor haasje » 19 Mei 2017, 21:11

De eerst geplaatste code is een poging van mij om een voorbeeldscetch aan te passen naar mijn behoefte.
ik heb de seriele monitor niet nodig, alleen de digitale uitgangen.

Wat ik nodig heb is het volgende:
locatie 1:
12 gemultiplexte schakelaars (zijn nu al aanwezig, die kan ik niet veranderen)
maximaal 2 draden om naar locatie 2 te gaan.
locatie 2:
12 digitale uitgangen die afhankelijk van de schakelaar die ingedrukt wordt hoog worden.

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

Re: probleem met code

Berichtdoor Koepel » 20 Mei 2017, 00:19

Misschien was ik niet duidelijk. Met een beschrijving van het keypad met de codes bedoel ik dit: Met de Keypad library maak je de codes: '1','2','3','4','5','6','7','8','9','*','0','#'. Dat is wel zo handig, want dat zijn de tekens op de toetsen. Dat zijn leesbare ASCII tekens.

Dan vraag ik me af, wat je over de I2C bus wilt gaan sturen, en hoe je dat omzet naar de pin nummer voor een digitalWrite.
Je gebruikt nu leesbare ASCII en binaire getallen door elkaar. Vandaar dat ik wil dat jij beschrijft hoe je het wilt doen. Dan kun je dat gaan maken.

Maximaal twee draden ? Maar I2C is: GND en SDA en SCL. Mag drie draden (met GND er bij) ook ?

De seriële monitor is altijd handig, alleen niet in de receiveEvent() functie. Dat is een interrupt routine.

Berichten: 5
Geregistreerd: 19 Mei 2017, 18:50

Re: probleem met code

Berichtdoor haasje » 20 Mei 2017, 02:46

Ik heb op beide locaties voedingsspanning liggen uit een gemeenschappelijke voeding, de massa is dus al gedeeld.

Ik heb de voorgaande code helemaal verwijderd en ben vanaf 0 opnieuw begonnen.
Eerst gegoogeld naar communicatie tussen 2 arduino's met I2C; dit gevonden in een youtube filmpje en dit als basis gebruikt.
Vervolgens met behulp van voorbeeldschetsen deze code aangepast.
Dit is nu gelukt en alles werkt, ik heb echter nog 1 (klein) probleem en ik hoop dat ik daarvoor niet weer alles opnieuw moet gaan doen.
Met de huidige code krijgt de slave alleen de melding dat er een knop wordt ingedrukt en welke knop dat dan is. Wat echter aan deze constructie mist is dat er geen tijdsduur wordt meegestuurd. Het zou soms makkelijk zijn als ik op de slave zou kunnen zien dat de knop vastgehouden wordt of maar kort ingedrukt wordt.

Dit is de nieuwe code:
Master
Code: Alles selecteren
// I2C Master Code (Nano)
#include <Wire.h>
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char hexaKeys[ROWS][COLS] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'0','A','B'} 
};

byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad

Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS );

void setup()
{
  Serial.begin(9600);
  Wire.begin();
}

void loop()
{
   char key = customKeypad.getKey();
    if (key){
      Wire.beginTransmission(5);
      Wire.write(key);
      Wire.endTransmission();
    }
  }



en de code van de slave:
Code: Alles selecteren
//I2C Slave code (uno)
#include <Wire.h>

byte dpin1 = 2;
byte dpin2 = 3;
byte dpin3 = 4;
byte dpin4 = 5;
byte dpin5 = 6;
byte dpin6 = 7;
byte dpin7 = 8;
byte dpin8 = 9;
byte dpin9 = 10;
byte dpin10 = 11
byte dpin11 = 12
byte dpin12 = 13

void setup()
{
  pinMode(dpin1, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin2, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin3, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin4, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin5, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin6, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin7, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin8, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin9, OUTPUT);              // Sets the digital pin as output.
  pinMode(dpin10, OUTPUT);             // Sets the digital pin as output.
  pinMode(dpin11, OUTPUT);             // Sets the digital pin as output.
  pinMode(dpin12, OUTPUT);             // Sets the digital pin as output.
  digitalWrite(dpin1, LOW);           // Turn the LED off.
  digitalWrite(dpin2, LOW);           // Turn the LED off.
  digitalWrite(dpin3, LOW);           // Turn the LED off.
  digitalWrite(dpin4, LOW);           // Turn the LED off.
  digitalWrite(dpin5, LOW);           // Turn the LED off.
  digitalWrite(dpin6, LOW);           // Turn the LED off.
  digitalWrite(dpin7, LOW);           // Turn the LED off.
  digitalWrite(dpin8, LOW);           // Turn the LED off.
  digitalWrite(dpin9, LOW);           // Turn the LED off.
  digitalWrite(dpin10, LOW);          // Turn the LED off.
  digitalWrite(dpin11, LOW);          // Turn the LED off.
  digitalWrite(dpin12, LOW);          // Turn the LED off.

  Wire.begin(5);
  Wire.onReceive(receiveEvent);
  Serial.begin(9600);
  }

void loop()
{
}

void receiveEvent (int howMany)
{
  while (Wire.available())
  {
    char key = Wire.read();

            if (key == '1') {
            digitalWrite(dpin1, HIGH);
            delay (50000);
            digitalWrite(dpin1, LOW);
            }
            if (key == '2') {
            digitalWrite(dpin2, HIGH);
            delay (50000);
            digitalWrite(dpin2, LOW);
            }
            if (key == '3') {
            digitalWrite(dpin3, HIGH);
            delay (50000);
            digitalWrite(dpin3, LOW);
            }           
            if (key == '4') {
            digitalWrite(dpin4, HIGH);
            delay (50000);
            digitalWrite(dpin4, LOW);
            }
            if (key == '5') {
            digitalWrite(dpin5, HIGH);
            delay (50000);
            digitalWrite(dpin5, LOW);
            }
            if (key == '6') {
            digitalWrite(dpin6, HIGH);
            delay (50000);
            digitalWrite(dpin6, LOW);
            }
            if (key == '7') {
            digitalWrite(dpin7, HIGH);
            delay (50000);
            digitalWrite(dpin7, LOW);
            }
            if (key == '8') {
            digitalWrite(dpin8, HIGH);
            delay (50000);
            digitalWrite(dpin8, LOW);
            }
            if (key == '9') {
            digitalWrite(dpin9, HIGH);
            delay (50000);
            digitalWrite(dpin9, LOW);
            }
            if (key == '0') {
            digitalWrite(dpin10, HIGH);
            delay (50000);
            digitalWrite(dpin10, LOW);
            }
            if (key == 'A') {
            digitalWrite(dpin11, HIGH);
            delay (50000);
            digitalWrite(dpin11, LOW);
            }
            if (key == 'B') {
            digitalWrite(dpin12, HIGH);
            delay (50000);
            digitalWrite(dpin12, LOW);
            }

  }
}



Is er makkelijke oplossing voor dit probleem of zal ik weer opnieuw moeten beginnen?

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

Re: probleem met code

Berichtdoor Koepel » 20 Mei 2017, 08:13

Er zijn standaard manieren om te kijken hoe lang iets is ingedrukt. Bijvoorbeeld door iets over de I2C bus te sturen als een toets wordt ingedrukt, en iets anders als de toets wordt losgelaten. Dan kun je in de Slave kijken hoe lang dat duurde.

Het was belangrijk dat je mijn vragen beantwoordde. Mijn bedoeling was om ergens naar toe te werken. Met zomaar willekeurig wat code van internet te plukken kom je niet veel verder.

Wanneer je iets noemt, zoals een Youtube filmpje, dan heb ik er graag een link naar toe. Er staat helaas veel slechte code op internet :(

Je hebt de onderste toetsen gewijzigd van '*','0','#' naar '0','A','B'. Dan zit de '0' op een andere plaats.
Waarom heb je die onderste toetsen gewijzigd ? Misschien kun je een link geven naar je keypad, dan kan ik zelf de toetsen zien.

Over de I2C bus stuur je nu de codes van de Keypad library. Dat is één byte per keer. Dat is prima, als dat is wat je wilt.
Wanneer je een toets blijft indrukken, dan wordt continue die code over I2C verstuurd. Dat is teveel voor de Slave, volgens mij gaat dan de communicatie verkeerd.

In de receiveEvent() zit nog steeds een onnodige while-loop, en er zitten grote delay() in. Die delay() hoort daar niet.

Je zou in de Slave de receiveEvent() heel klein kunnen maken, door wat ontvangen wordt met Wire.read() in een globale variabele te zetten. Dan kun je in de loop() er van alles mee doen. Maar ik weet niet of je dat zelf kunt maken.

Hier (http://arduinoforum.nl/viewtopic.php?f=8&t=2523#p19236) schreef ik: "Dat zien we vaak hier op het forum. Iemand heeft alles werkend op één klein dingetje na. Dat ene kleine dingetje blijkt nu net niet mogelijk te zijn, omdat de code verkeerd is opgebouwd. Dat geeft niet, dat kan gebeuren.".

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

Re: probleem met code

Berichtdoor shooter » 26 Mei 2017, 23:28

in de zender een code toevoegen, zodat je kunt zien dat je geen knop meer indrukt.
dus een else ....
dit ook in de ontvanger doen, dan gaat de uitgang ook weer uit als je de knop loslaat.
in de zender een wachtlus zetten zoals 100 msec (kan gewoon met een delay hoor.
paul deelen
shooter@home.nl

Berichten: 5
Geregistreerd: 19 Mei 2017, 18:50

Re: probleem met code

Berichtdoor haasje » 26 Mei 2017, 23:36

ik heb mijn arduino nano beschadigd (i2c werkt niet meer), ben dus op een vervanger aan het wachten. Ben nu een aantal dagen niet thuis, zal daarna hopelijk weer verder gaan. Idee is om dit verhaal misschien verder uit te breiden en de overdracht via 433mhz uit te voeren.
Wordt vervolgd...

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 15 gasten