seeeduino, Grove Multichannel Gas Sensor

Hi,

ich habe ein Problem: ich erhalte keine Werte von diesem Sensor.

Meine Umgebung:
seeeduino: Seeeduino LoRaWAN | Seeed Studio Wiki
Sensor: Grove - Multichannel Gas Sensor | Seeed Studio Wiki
PC: Ubuntu 18.04 mit Arduino Ide 1.8.5
Bibliothek: https://github.com/Seeed-Studio/Mutichannel_Gas_Sensor/archive/master.zip

Alles installiert, Beispielprogramme sehe ich. also habe ich Beispiele -> Grove MultiChannel Gas Sensor -> GetVersion geladen. Im Code habe ich Serial in SerialUSB umgewandelt, da ich mich ja auf einem Seeeduino bewegen will.

Compiliert, hochgeladen und den Serial Monitor geöffnet: ich sehe nichts.

Was mache ich da falsch?

Mit anderen Programmen ging mir das auch so.

Schönen Gruß
AugustQ

PS: die Adresse des Sensors habe ich auf 0x04 belassen.

das fand ich gerade: Arduino Playground - I2cScanner

ausprobiert. Und erhielt diese Nachricht:

Scanning...
No I2C devices found

OK, angeschlossenes Gerät nicht gefunden. Wie löse ich dieses Problem?

Schönen Gruß
AugustQ

Hat der Sensor PullUp-Widerstände?
Sensor richtig angeschlossen?
Sensor defekt?

Gruß Tommy

einen Schritt weiter: ich habe den Stecker auf einen anderen Platz eingesteckt. Und das erhalte ich jetzt:

Scanning...
I2C device found at address 0x04 !
done

Also, das Board wird erkannt. Das Programm GetVersion (das mitgelieferte Beispielprogramm) hängt sich aber auf.

Male ins doch einfach mal auf, wie Du das Ding angeschlossen hast. Deine Aussage

ich habe den Stecker auf einen anderen Platz eingesteckt

läßt auf wildes probieren schließen.
Den Sketch, wie er bei Dir ist, könntest Du auch in Codetags hier einstellen.

Gruß Tommy

Hi,

wildes probieren? Ja, ich habe keine Strategie.....

Das ist das Board: Seeeduino LoRaWAN | Seeed Studio Wiki
Auf dem Bild erkennt man 4 Steckplätze, um diese geht es. Und wie ich gerade gesehen habe sind diese auch beschriftet: I2C (2x) und AO/A2 (?). Das erklärt, warum ich mit dem ersten Steckplatz ein Ergebnis bekomme, wie ich das auch beschrieben hatte.

Der Sinn dieser Grove-Steckplätze ist, daß man so Dinge wie Widerstände nicht mehr braucht. Reinstecken und fertig, so fand ich das in einer Produktbeschreibung.

Schönen Gruß
AugustQ

AugustQ:
.....
Compiliert, hochgeladen und den Serial Monitor geöffnet: ich sehe nichts.

Was mache ich da falsch?

Mit anderen Programmen ging mir das auch so.
.....

Das zeigt uns, das dir sämtliche Grundlagen fehlen.
Warum fängst du nicht klein an und testest erst ein wenig mit den Beispielen in der IDE.
Dann bekommst du mehr Gefühl von der Materie.

Nachdem du jetzt die I2C-Adresse heraus gefunden hast, die Frage, funktioniert es jetzt ?

Hi Dieter,

wie ich in meinem Beitrag #3 geschrieben habe findet das Programm ein Gerät mit der Adresse 4 (dieses Programm: Arduino Playground - I2cScanner).

Nehme ich jetzt das Programm GetVersion aus den Beispielen der IDE, dann hängt sich dieses auf.

Was mache ich da falsch?

Schönen Gruß
AugustQ

in dieser Zeile bleibt das Programm hängen:

if(get_addr_dta(CMD_READ_EEPROM, ADDR_IS_SET) == 1126) // get version

führt zu dieser Funktion:

unsigned int MutichannelGasSensor::get_addr_dta(unsigned char addr_reg, unsigned char __dta)

ist in MutichannelGasSensor.cpp.

Wie muß man diesen Sensor ansprechen (wenn schon das Beispielprogramm nicht läuft) ?

Schönen Gruß
AugustQ

Woran erkennst du, dass sich das Programm aufhängt ?
Gibt es eine Fehlermeldung ?
Und bitte poste den Sketch in Code-Tags, den du verwendest.

Hi

AugustQ:
...
Was mache ich da falsch?

Du ignorierst behaglich alle Versuche, Dir zu helfen.

  • Dein Sketch? (bitte in CODE-Tags - zur Not NACHLESEN, was damit gemeint sein könnte
  • was bedeutet 'hängt sich auf' - wie kommst Du zu diesem Schluss?
  • was hast Du bereits dagegen unternommen?

MfG

postmaster-ino:
......

  • was hast Du bereits dagegen unternommen?

MfG

Na das siehst du doch.

NICHTS....außer hier gefragt, was er falsch macht.

AugustQ:
seeeduino: Seeeduino LoRaWAN | Seeed Studio Wiki

Was mache ich da falsch?

Du hast ja schon gesagt welches Board du einsetzt und auf die Webseite verwiesen. Hast Du auch dir die Seite mal durchgelesen und das gemacht was auf dieser Seite steht?

Da steht z.B.:

Warning
Please update the firmware when the first time to use it. Please always plug 3.7V Lipo battery in case USB power supply is not sufficient.

und noch extrem wichtig:

Tip
If you want to use the 4 on-board Grove connector, please use digitalWrite(38, HIGH) to open VCC. Otherwise you can't provide power to Grove modules.

Da Du nur den einen Sensor dran hast, gehe ich davon aus das USB genug Power liefert. Ob ein Firmwareupdate gemacht werden muß, kann ich nicht beurteilen.

Aber das 2. ist sehr wichtig. Also pack mal

digitalWrite(38, HIGH);

als 1. Zeile in den Setup Bereich und lies Dir bitte die Beschreibungen von Seedstudio durch die werden nämlich nicht nur so aus Spaß erstellt!

Gruß, Jürgen

Hallo,

ich bitte um Entschuldigung, aber es kam ein anderes Projekt mit einer höheren Priorität dazwischen. So, jetzt kann ich mich wieder um dieses Problem kümmern.

Auch auf die Gefahr hin, mich zu wiederholen, fasse ich noch einmal einige Punkte zusammen:

Danach habe ich aus den Beispielen das Programm GetVersion geholt und ein wenig verändert: Serial in SerialUSB umgesetzt, digitalWrite() eingefügt, Kontrollausdrucke eingebaut.
So schaut das Programm jetzt aus:

// Get firmware version of Grove Multichannel Gas Sensor
#include <Wire.h>
#include "MutichannelGasSensor.h"

#define SENSOR_ADDR     0X04        // default to 0x04

void setup()
{
    digitalWrite(38, HIGH);
    SerialUSB.begin(9600);
    while ( ! SerialUSB ) ;
    SerialUSB.println("starting:");
    gas.begin(SENSOR_ADDR);

    SerialUSB.println( CMD_READ_EEPROM );
    SerialUSB.println( ADDR_IS_SET );
    SerialUSB.println( gas.i2cAddress );
    
    unsigned char version = gas.getVersion();
    SerialUSB.print("Version = ");
    SerialUSB.println(version);    
}

void loop()
{
    // nothing to do
}

Ergebnis: hängt.

Danach habe ich die Dateien MultichannelGasSensos.h und .cpp meinem Projekt hinzugefügt. Folgendes habe ich geändert:

unsigned int MutichannelGasSensor::get_addr_dta(unsigned char addr_reg, unsigned char __dta)
{
  SerialUSB.println("get_adr_dta()");
   
START: 
    Wire.beginTransmission(i2cAddress);
    Wire.write(addr_reg);
    Wire.write(__dta);
    Wire.endTransmission();    // stop transmitting
    
    Wire.requestFrom(i2cAddress, 2);
    
    unsigned int dta = 0;
    
    unsigned char raw[10];
    int cnt = 0;
  SerialUSB.print  ("avail: ");
  SerialUSB.println(Wire.available()); 
    while(Wire.available())
    {
        raw[cnt++] = Wire.read();
    }

SerialUSB.print  ("cnt = ");
SerialUSB.println(cnt );    
    if(cnt == 0)goto START;

Damit erhalte ich jetzt folgenden Ausgabe:

starting:
6
0
4
getVersion()
get_adr_dta()
avail: 0
cnt = 0
avail: 0
cnt = 0
....... forever

Also schaue ich jetzt in Wire.cpp nach:

int TwoWire::available(void)
{
  return rxBuffer.available();
}

Das Objekt Wire hat also keine Daten, weshalb der Code in MultichannelGasSensor wieder zurück auf START springt.

Weiter bin ich noch nicht gekommen.

Meine Frage ist: was mache ich falsch bei diesem Sensor bzw. bei der Anbindung via Grove?

Schönen Gruß
AugustQ

ein Nachtrag: die Firmware habe ich bisher nicht aktualisiert.

Nach meinem Verständnis benötige ich dafür einen entsprechenden Programmer, den ich nicht habe. In der Arduino Ide kann ich zwar unter Werkzeuge einen Programmer auswählen, aber ich glabue, dafür brauche ich noch solch ein Teil.

Wäre so etwas hier das richtige Werkzeug für diese Aufgabe:

?

Richtig?

Schönen Gruß
AugustQ

ich habe noch ein wenig gespielt und dabei folgendes festgestellt:

das seeeduino-Board habe ich durch einen Arduino Uno ersetzt. Die Verkabelung habe ich wie folgt vorgenommen:

Grove     Arduino
schwarz    GND
rot           3.3V
weiß         A4
gelb          A5

Ergebnis: geht.

Im Detail:
das Beispielprogramm GetVersion:

// Get firmware version of Grove Multichannel Gas Sensor
#include <Wire.h>
#include "MutichannelGasSensor.h"

#define SENSOR_ADDR     0X04        // default to 0x04

void setup()
{
    Serial.begin(115200);
    gas.begin(SENSOR_ADDR);
    
    unsigned char version = gas.getVersion();
    Serial.print("Version = ");
    Serial.println(version);    
}

void loop()
{
    // nothing to do
}

lieferte folgende Ausgabe:

version = 2
version = 2
Version = 2

die erste Zeile kommt vom Aufruf gas.begin(), die wiederrum getVersion() aufruft.
Die zweite Zeile kommt vom Aufruf gas.getVersion().
Und die dritte Zeile kommt aus der setup()-Routine.

Nächster Schritt auf dem Arduino: das Beispielprogramm ReadSensorValue:

Programm kann ich nachreichen, falls gewünscht

liefert folgende Ausgabe:

The concentration of NH3 is 3.70 ppm
The concentration of CO is 10.50 ppm
The concentration of NO2 is 0.08 ppm
The concentration of C3H8 is 7241.02 ppm
The concentration of C4H10 is 3445.26 ppm
The concentration of CH4 is 14875.11 ppm
The concentration of H2 is 2.69 ppm
The concentration of C2H5OH is 4.99 ppm
...

Ergebnis: der Sensor läuft, zumindest schon mal auf dem Arduino Uno.
Allerdings brauche ich ihn auf dem seeeduino.

Schritt 1: Verkabelung auf dem seeeduino analog zu Arduino. Läuft nicht.
Schritt 2: SDA und SCL umgesteckt auf P0_4 bzw. P0_5. Ergebnis: läuft nicht.

Was mache ich da falsch? Einen Tipp bitte.

Schönen Gruß
AugustQ

Der hat doch oben auf der rechten Leiste SDA/SCL und an den extra-Anschlüssen auch.
Warum klemmst Du nicht da an?

Gruß Tommy

Hi,

ich denke, ich habe dies bereits gemacht: SDA und SCL auf die Pins rechts oben geklemmt. Bei mir ist das beschriftet mit PO_4 und PO_5. Das lieferte kein Ergebnis.

Was meintest Du mit den extra-Anschlüssen?

Schönen Gruß
AugustQ

Auf den Bildern vom seeeduino-Board sind so weiße Anschlüsse, wauch I2C dran steht.

Ansonsten hast Du schon mal darüber nachgedacht, dass Dein Board im Eimer ist?

Gruß Tommy

Hallo,
nur mal so...
"Ergebnis: der Sensor läuft, zumindest schon mal auf dem Arduino Uno."

Wie kommst Du drauf? Mal die Werte verglichen. Was hast Du für eine Referenz?
Nur ein Beispiel,CO!?
Gruß und Dank
Andreas