Forum: Mikrocontroller und Digitale Elektronik Arduino CAN Bus Shield Sensordaten senden


von Flo D. (floflovaldo)


Lesenswert?

Hallo zusammen,

ich habe von einem Bekannten zwei dieser Shields der Version 1.2 
bekommen: http://www.seeedstudio.com/wiki/CAN-BUS_Shield

Die Test-Codes die in der Libary dabei sind funktionieren, die Daten 
werden gesendet und empfangen.

Mit CAN habe ich mich sonst noch nicht beschäftigt, würde jetzt aber 
gerne versuchen einen DHT22 auszulesen, den Code siehe unten, und diesen 
Code will ich in den Code für den Arduino der im CAN-Bus sendet einbauen 
sodass die Sensordaten an den anderen gesendet werden.

Die Beispiel-Codes befinden sich hier:
https://github.com/Seeed-Studio/CAN_BUS_Shield/tree/master/examples

In meinem Fall "receive_Blink" und "send_Blink"

Der Arduino DHT22 Code:
1
#include "DHT.h"
2
 
3
#define DHTPIN 9     
4
#define DHTTYPE DHT22 //DHT11, DHT21, DHT22
5
 
6
DHT dht(DHTPIN, DHTTYPE);
7
 
8
void setup() 
9
{
10
  Serial.begin(9600); 
11
  Serial.println("DHT22 - Test!");
12
 
13
  dht.begin();
14
}
15
 
16
void loop() 
17
{
18
  float h = dht.readHumidity();     //Luftfeuchte auslesen
19
  float t = dht.readTemperature();  //Temperatur auslesen
20
 
21
  // Prüfen ob eine gültige Zahl zurückgegeben wird. Wenn NaN (not a number) zurückgegeben wird, dann Fehler ausgeben.
22
  if (isnan(t) || isnan(h)) 
23
  {
24
    Serial.println("DHT22 konnte nicht ausgelesen werden");
25
  } 
26
  else
27
  {
28
    Serial.print("Luftfeuchte: "); 
29
    Serial.print(h);
30
    Serial.print(" %\t");
31
    Serial.print("Temperatur: "); 
32
    Serial.print(t);
33
    Serial.println(" C");
34
  }
35
}

Leider habe ich es nicht hinbekommen die Sensordaten per CAN zu senden.

Würde mich über Hilfe sehr freuen um das ganze besser zu verstehen. Code 
an sich den ich schon präsentieren könnte habe ich noch nicht. Ich habe 
bis jetzt nur die Libary DHT importiert, alles deklariert aber wie ich 
es senden soll ist eben unklar.

Gruß Florian

von Marc S. (marc_s86)


Lesenswert?

Zeig was du probiert hast dann helfen wir gern das zu richten.

von Flo D. (floflovaldo)


Lesenswert?

Sorry für die späte Antwort.

Ich habe bis jetzt im Send Sketch folgendes:
1
// demo: CAN-BUS Shield, send data
2
#include <mcp_can.h>
3
#include <SPI.h>
4
#include <DHT.h>
5
6
#define DHTPIN 2
7
#define DHTTYPE DHT22
8
9
DHT dht(DHTPIN, DHTTYPE);
10
11
12
// the cs pin of the version after v1.1 is default to D9
13
// v0.9b and v1.0 is default D10
14
const int SPI_CS_PIN = 9;
15
const int ledHIGH    = 1;
16
const int ledLOW     = 0;
17
18
MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin
19
20
void setup()
21
{
22
    Serial.begin(115200);
23
24
    while (CAN_OK != CAN.begin(CAN_500KBPS))              // init can bus : baudrate = 500k
25
    {
26
        Serial.println("CAN BUS Shield init fail");
27
        Serial.println(" Init CAN BUS Shield again");
28
        delay(100);
29
    }
30
    Serial.println("CAN BUS Shield init ok!");
31
    dht.begin();
32
}
33
34
unsigned char stmp[8] = {ledHIGH, 1, 2, 3, ledLOW, 5, 6, 7};
35
36
void loop()
37
{   Serial.println("In loop");
38
    // send data:  id = 0x00, standrad frame, data len = 8, stmp: data buf
39
    CAN.sendMsgBuf(0x70,0, 8, stmp);
40
    delay(1000);                       // send data per 100ms
41
42
    float h = dht.readHumidity();
43
    float t = dht.readTemperature();
44
}
45
46
/*********************************************************************************************************
47
  END FILE
48
*********************************************************************************************************/

Ich weiß nicht genau wie ich die Sensordaten an den Bus senden soll. Ich 
habe zwar schon ein bisschen im Internet geschaut, aber nichts gefunden 
das mir geholfen hat.

Die Test char hatte ich noch drin gelassen aus dem Beispiel.

Beim Receive Sketch bin ich auch noch nicht weiter. Dieses ist noch wie 
in dem Beispiel, da ich erstmal an das Send Sketch eben wollte.

Receive Sketch:
1
// demo: CAN-BUS Shield, receive data with check mode
2
// send data coming to fast, such as less than 10ms, you can use this way
3
// loovee, 2014-6-13
4
5
6
#include <SPI.h>
7
#include "mcp_can.h"
8
9
10
// the cs pin of the version after v1.1 is default to D9
11
// v0.9b and v1.0 is default D10
12
const int SPI_CS_PIN = 9;
13
const int LED=8;
14
boolean ledON=1;
15
MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin
16
17
void setup()
18
{
19
    Serial.begin(115200);
20
    pinMode(LED,OUTPUT);
21
22
    while (CAN_OK != CAN.begin(CAN_500KBPS))              // init can bus : baudrate = 500k
23
    {
24
        Serial.println("CAN BUS Shield init fail");
25
        Serial.println(" Init CAN BUS Shield again");
26
        delay(100);
27
    }
28
    Serial.println("CAN BUS Shield init ok!");
29
}
30
31
32
void loop()
33
{
34
    unsigned char len = 0;
35
    unsigned char buf[8];
36
37
    if(CAN_MSGAVAIL == CAN.checkReceive())            // check if data coming
38
    {
39
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf
40
41
        unsigned char canId = CAN.getCanId();
42
43
        Serial.println("-----------------------------");
44
        Serial.println("get data from ID: ");
45
        Serial.println(canId);
46
47
        for(int i = 0; i<len; i++)    // print the data
48
        {
49
            Serial.print(buf[i]);
50
            Serial.print("\t");
51
            if(ledON && i==0)
52
            {
53
54
                digitalWrite(LED,buf[i]);
55
                ledON=0;
56
                delay(500);
57
            }
58
            else if((!(ledON)) && i==4)
59
            {
60
61
                digitalWrite(LED,buf[i]);
62
                ledON=1;
63
            }
64
        }
65
        Serial.println();
66
    }
67
}
68
69
/*********************************************************************************************************
70
  END FILE
71
*********************************************************************************************************/

Beste Grüße
Florian

von Wolfgang (Gast)


Lesenswert?

Florian D. schrieb:
> ... aber wie ich es senden soll ist eben unklar.

Dann guck dir von den Beispielen zu CAN-Bus Library mal die Beispiele 
mit "Send" im Namen an. Was meinst du, was die tun, z.b. /send.ino/. Die 
Daten liegen dort in stmp[] und werden an die Senderoutine übergeben.

von Flo D. (floflovaldo)


Lesenswert?

Hallo,

ich habe jetzt Testweise in das Array stmp[] folgenden Inhalt 
eingetragen:
1
unsigned char stmp[8] = {22.50, 53.25, 0, 0, 0, 0, 0, 0};
Wegen des Char kommt am anderen Shield nur 22, 53, 0, ... raus, aber des 
ist klar. Nur wenn ich jetzt statt dem chat nen float nehme, so wie ich 
es immer bei den DHTs gemacht hatte kommt ne Fehlermeldung:
1
exit status 1
2
'signed' or 'unsigned' invalid for 'stmp'

Das andere Problem ist die Länge des Arrays, was in dem Beispiel ja 8 
wäre, jetzt habe ich das direkt davor in der Klammer geändert, und 
hinten auch nur noch die zwei "simulierten" Sensorwerte drin, aber am 
Receive-Code bekomm ich die ersten raus und dann welche mit 
irgendwelchen Zahlen.

Woran liegt das?

Würde mich über eure Hilfe freuen
Florian

von Marc S. (marc_s86)


Lesenswert?

Florian D. schrieb:
> Woran liegt das?

Daran, dass du weder deine Programmiersprache beherrschst, noch den 
CAN-Bus verstanden hast.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.