Ich bin quasi frisch hier angemeldet, da ich an einer Stelle nicht weiterkomme. Ich bin relativ frisch was Arduino angeht. Man könnte sagen "Neueinsteiger". Auf Grund meiner Arbeit beschäftige ich mich mehr mit Elektronik und Programmierung. Dafür eignet sich ein Arduino hervorragend (meine Sicht :-)).
Vielleicht kann mir jemand hier weiterhelfen.
Ich hab einen Infrarot Temperatursensor (Melexis MLX90615) und ein China OLED (Fa. Heltec). Ich wollte beide per I2C betreiben und die Sensordaten auf dem OLED sichtbar machen. Das Ganze soll tragbar sein, will zum Ablesen nicht immer den Laptop mitschleppen :D.
Den Sensor kann ich per Serial Monitor auslesen. Das OLED kann ich ebenfalls betreiben. Mein Problem ist nur, dass sobald ich beide betreibe der Sensor nicht mehr arbeitet. Er misst nur noch durchgehend 318,18 °C für Objekt und Ambient. Vom Gefühl her habe ich das Internet auf den Kopf gestellt (sogar YT Videos angeschaut), finde aber keinen Lösungsansatz.
Anbei meinen Code dazu:
#include <MLX90615.h>
#include <I2cMaster.h>
#include "U8glib.h"
#define SDA_PIN 20 //define the SDA pin
#define SCL_PIN 21 //define the SCL pin
SoftI2cMaster i2c(SDA_PIN, SCL_PIN);
MLX90615 mlx90615(0x5B, &i2c);
U8GLIB_SSD1306_128X64 u8g(0x7B); // Display which does not send AC
void draw(void) {
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(0, 20);
u8g.print("T_Obj:");
u8g.setFont(u8g_font_unifont);
u8g.println(mlx90615.getTemperature(MLX90615_OBJECT_TEMPERATURE));
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(0, 60);
u8g.print("T_Amb:");
u8g.setFont(u8g_font_unifont);
u8g.println(mlx90615.getTemperature(MLX90615_AMBIENT_TEMPERATURE));
}
void setup()
{
Serial.begin(9600);
Serial.println("Temperatur per Infrarot:");
//mlx90615.writeEEPROM(Default_Emissivity); //write data into EEPROM when you need to adjust emissivity.
//mlx90615.readEEPROM(); //read EEPROM data to check whether it's a default one.
}
void loop()
{
u8g.firstPage();
do {
draw();
}while( u8g.nextPage() );
Serial.print("T_Obj: ");
Serial.print(mlx90615.getTemperature(MLX90615_OBJECT_TEMPERATURE)); Serial.println(" Celsius");
Serial.print("T_Amb: ");
Serial.print(mlx90615.getTemperature(MLX90615_AMBIENT_TEMPERATURE)); Serial.println(" Celsius");
delay(1500);
}
Ich hab beiden die I2C Adressen direkt angegeben, weil ich der Meinung war, dass die Kommunikation nicht in Ordnung ist. Was ich merkwürdig finde, der Sensor arbeitet richtig sobald ich alle Befehle für das OLED inaktiv setze. Daher der Serial.Print Befehl. So kann ich kontrollieren, was der Sensor an Daten liefert.
Welchen Arduino verwendest Du?
Warum nimmst Du nicht HardwareI2C, sondern eine Softwasreemulation?
Hast Du Pullup-Widerstände (4k7) an SDA und SCL, wenn die Komponenten keine verbaut haben (nachmessen).
Entschuldige die Info mit über das Board wollte ich eigentlich reinschreiben. Es ist ein Mega 2560.
Ja, aktuell hatte ich es ohne Pullup Widerstände, aber das würde mir auch noch einfallen. Das würde ich morgen ausprobieren.
Die Lösung für den I2C hatte ich in einem anderen Sketch gesehen. Daher hatte ich das übernommen und beibehalten.
Eventuell könnte man es auch mit Wire machen, da hab ich bis jetzt noch nicht viel mit gearbeitet.
EDIT:
Hab gerade mal den I2C Scanner laufen lassen. Zuerst mit dem Infrarotsensor alleine. Dieser wird auch erkannt. Anschließend das OLED dazu gesteckt und nun wird nur noch das OLED erkannt.
Hab den Tipp mit der Wire Bibliothek probiert. Funktioniert super. Vielen Dank dafür.
Anbei der Code falls irgendjemand Interesse (oder das gleiche Problem) hat.
#include <MLX90615.h>
#include <I2cMaster.h>
#include <U8glib.h>
#include <Wire.h>
#define SDA_PIN 14 //define the SDA pin
#define SCL_PIN 15 //define the SCL pin
SoftI2cMaster i2c(SDA_PIN, SCL_PIN);
MLX90615 mlx90615(0x5B, &i2c);
U8GLIB_SSD1306_128X64 u8g(0x7B); // Display which does not send AC
void draw(void) {
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(0, 20);
u8g.print("T_Obj:");
u8g.setFont(u8g_font_unifont);
u8g.println(mlx90615.getTemperature(MLX90615_OBJECT_TEMPERATURE));
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(0, 60);
u8g.print("T_Amb:");
u8g.setFont(u8g_font_unifont);
u8g.println(mlx90615.getTemperature(MLX90615_AMBIENT_TEMPERATURE));
}
void setup()
{
Serial.begin(9600);
Serial.println("Temperatur per Infrarot:");
//mlx90615.writeEEPROM(Default_Emissivity); //write data into EEPROM when you need to adjust emissivity.
//mlx90615.readEEPROM(); //read EEPROM data to check whether it's a default one.
}
void loop()
{
u8g.firstPage();
do {
draw();
}while( u8g.nextPage() );
Serial.print("T_Obj: ");
Serial.print(mlx90615.getTemperature(MLX90615_OBJECT_TEMPERATURE)); Serial.println(" Celsius");
Serial.print("T_Amb: ");
Serial.print(mlx90615.getTemperature(MLX90615_AMBIENT_TEMPERATURE)); Serial.println(" Celsius");
Serial.println();
delay(1500);
}
EDIT:
Eine Frage hätte ich noch. Wäre sowas auch per Arduino Nano möglich? Auf Grund der Baugröße wäre der super für ein tragbares "Messgerät".
ich sitze auch gerade an diesem Projekt-allerdings mit einem UNO. Ich habe das gleiche Problem mit den 382,18°C. Habe allerdings nicht so recht verstanden,was HarryKane geändert hat, dass es funktioniert.. Und wie ich das beim UNO ändern kann.. Wäre schön, wenn mir hier jemand weiter helfen könnte (auch wenn der Ursprung hier schon etwas länger her ist..)
Der Sensor ist wohl KEIN I²C-Sensor, sondern schwätzt MBus.
Das wird auf zwei Pins gemacht, Die normal Nichts mit I²C zu tun haben.
Auf dem hier benutztem Arduino Mega liegt I²C auf den Pins 20 und 21 und im Fehler-Sketch sind diese beiden Pins auch für die MBus-Library (also Die für den Sensor) in Benutzung.
Das beißt sich aber mit dem normalem I²C-Bus.
Deshalb wurden die Pins auf 'irgend was Anderes' umgesetzt - im Beispiel auf die Pins 14 und 15 (ggf. müssen die Pins PCINT-fähig sein).
Beim Uno oder Nano liegt I²C auf A4 und A5.
Da dort sämtliche Pins PCINT-fähig sind (bis auf A6 und A7), hast Du die freie Auswahl.
Einfach die Pin-Nummern anpassen:
#define SDA_PIN 14 //define the SDA pin
#define SCL_PIN 15 //define the SCL pin
SoftI2cMaster i2c(SDA_PIN, SCL_PIN);
MLX90615 mlx90615(0x5B, &i2c);
14 und 15 wären auf Uno/Nano übrigens A0 (PCINT8) und A1 (PCINT9).
Denke, die Lib kümmert sich selber um den Interrupt, sofern Dieser benötigt wird.
Fällt hat nur auf, daß die benutzten Pins am Arduino Mega beide PCINT können - ob nötig, oder nicht, entscheidet vll. das Licht
Hallo postmaster-ino und danke für deine Antwort.. Aber leider stehe ich immer noch ziemlich auf dem Schlauch (ich habe noch nicht viel mit dem arduino gearbeitet..) Wie wird diese mbus Kommunikation implementiert? Wenn ich einfach nur die Pins im Code abändere (und natürlich auch umstecke) tut sich nichts bzw. es bleibt beim gleichen Ergebnis. (und ja, ich habe neu hochgeladen). Ich lese mir die Werte derzeit nur über den seriellen Monitor aus, habe also noch kein LCD dran, dennoch sollte er ja mal mindestens eine Wertschwankung anzeigen, wenn ich den Sensor bewege.. Aber es bleibt bei diesem festen Wert (nur das Datum wird aktualisiert). Ich gehe davon aus, dass er ihn schon ausliest, aber nicht richtig arbeitet.. Hast du noch eine Idee? Ich habe keine Pull-up oder down Widerstände verwendet.
geändert hatte ich im Code nur die Pin Zuweisung: #define SDA_PIN A0 //define the SDA pin #define SCL_PIN A1 //define the SCL pin
SoftI2cMaster i2c(SDA_PIN, SCL_PIN);
MLX90615 mlx90615(0x5B, &i2c);
U8GLIB_SSD1306_128X64 u8g(0x7B); // Display which does not send AC
... long story short ...
Das Forum hat mich wieder gekickt ... OHNE, daß ich zuvor STRG-A, STRG-C gedrückt hätte aarrgg
Denke, Du brauchst PullUPs - 1...30kΩ sollten ok sein.
JEDER Pin am UNO ist PCINT-fähig.
Beim Nano, da gleicher Chip, sieht's fast genauso aus - die dort zusätzlichen Pins A6 und A7 sind allerdings nicht PCINT-fähig (sind nur reine analog-IN).
Die restlichen Pins passen mit dem Uno überein.
Drähte vll. vertauscht?
Andere Pins benutzt?
Die Pins 2 und 3? (Die sind 'echt' Interrupt-fähig).
Wenn davon egal was funktioniert, kommen wir der Lösung näher.
Ich denke auch, dass 10kR Widerstände es vielleicht richten können.. Allerdings habe ich nun einen anderen Code (andere Seite, ähnliches Projekt) und damit tut´s erstmal..
Drähte habe ich mehrfach kontrolliert und auch durch gemessen, auch andere Pins (unter anderem 2 und 3) habe ich ausprobiert.. Ich bin da heute wirklich fast wahnsinnig geworden- deshalb anderer Code.. Und schwups hats funktioniert.. Wie dem auch sei.. Ich mache erstmal mit dem anderen Code weiter und probiere die PullUps bei Gelegenheit nochmal aus.. Mir lässt das nämlich nicht wirklich Ruhe, warum das nicht funktioniert hat.. Also, so garnichts..
Danke dir trotzdem vielmals!!!