PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NodeMCU 1.0 e-ink und si7021



Neuton23
28.12.2018, 13:09
Hallo,

ich bin gerade an einem Projekt in dem ich ein e-ink display ansteuern will und zusätzlich einen Temperatur Sensor auslesen will.
Mein Problem ist das wenn ich die Library für das waveshare 1.54 " e-ink display nutze und zugleich das display mit spi initialisiere bekomme ich willkürliche werte von dem Sensor. Egal ob der Sensor angesteckt ist oder nicht

verkabelt ist es wie folgt

waveshare:
Busy -> D6 (12)
RST -> D4
DC -> D3
CS -> D8
CLK -> D5
DIN -> D7
GND -> GND
VCC -> None (because i get a mem_error when it is connected to 3.3v)

SI7021:
SCL -> D2 (4)
SDA -> D2 (5)
GND -> GND
3.3v -> 3.3v

this is my program so far with the edp2 library




#include <Wire.h>

// SI7021 I2C address is 0x40(64)
#define si7021Addr 0x40

// base class GxEPD2_GFX can be used to pass references or pointers to the display instance as parameter, uses ~1.2k more code
// enable or disable GxEPD2_GFX base class
#define ENABLE_GxEPD2_GFX 0

#include <GxEPD2_BW.h>
#include <GxEPD2_3C.h>
#include <Fonts/FreeMonoBold9pt7b.h>

#if defined (ESP8266)
// 3-color e-papers
GxEPD2_3C<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 12));
#endif

#if defined(_BOARD_GENERIC_STM32F103C_H_)
#define MAX_DISPAY_BUFFER_SIZE 15000ul // ~15k is a good compromise
#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8))
#define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8))
#endif

#if defined(__AVR)
#define MAX_DISPAY_BUFFER_SIZE 800 //
#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8))
#define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8))
#endif

void setup()
{
Serial.begin(115200);
Serial.println("Setup");
Wire.begin();
Wire.beginTransmission(si7021Addr);
Wire.endTransmission();
display.init(115200);
delay(300);
}

void loop()
{
unsigned int data[2];

Wire.beginTransmission(si7021Addr);
//Send humidity measurement command
Wire.write(0xF5);
Wire.endTransmission();
delay(500);

// Request 2 bytes of data
Wire.requestFrom(si7021Addr, 2);
// Read 2 bytes of data to get humidity
if(Wire.available() == 2)
{
data[0] = Wire.read();
data[1] = Wire.read();
}

// Convert the data
float humidity = ((data[0] * 256.0) + data[1]);
humidity = (((125 * humidity) / 65536.0) - 6)/1000;

Wire.beginTransmission(si7021Addr);
// Send temperature measurement command
Wire.write(0xF3);
Wire.endTransmission();
delay(500);

// Request 2 bytes of data
Wire.requestFrom(si7021Addr, 2);

// Read 2 bytes of data for temperature
if(Wire.available() == 2)
{
data[0] = Wire.read();
data[1] = Wire.read();
}

// Convert the data
float temp = ((data[0] * 256.0) + data[1]);
float celsTemp = ((175.72 * temp) / 65536.0) - 46.85;
float fahrTemp = celsTemp * 1.8 + 32;

// Output data to serial monitor
Serial.print("Humidity : ");
Serial.print(humidity);
Serial.println(" % RH");
Serial.print("Celsius : ");
Serial.print(celsTemp);
Serial.println(" C");
Serial.print("Fahrenheit : ");
Serial.print(fahrTemp);
Serial.println(" F");
delay(1000);
}


void helloWorld(int i)
{
Serial.println("helloWorld");
display.setRotation(1);
display.setFont(&FreeMonoBold9pt7b);
display.setTextColor(GxEPD_RED);
uint16_t x = (display.width() - 160) / 2;
uint16_t y = display.height() / 2;
display.setFullWindow();
display.firstPage();
do
{

display.fillScreen(GxEPD_WHITE);
display.setCursor(20,115);
display.println(String(i));
display.setCursor(x, y);
display.println(String(x) + " " +String(y) );

}
while (display.nextPage());
//Serial.println("helloWorld done");
}



egal ob ich bei diesem code die pins sda und sdc verbunden habe gibt er mir immer die selben werte in der console aus.

Was mach ich genau falsch. Bin relativ neu in der elektrotechnik. Brauche ich dort evtl einen Pull up resistor oder so

Rabenauge
29.12.2018, 06:20
Kontrollier mal das Pin-Mapping für _deinen_ NodeMCU.
Ich hab hier welche (LOLIN), bei denen es etwas anders ist als bei vielen anderen, scheinbar.
Weiterhin kannst du die I2C-Adresse mal überprüfen- manche Module können mehr als eine Adresse haben.
Ob du Pullups brauchst, kann man nur raten: schau nach ob die auf dem Modul drauf sind-das ist bei vielen Modulen so, aber nicht bei allen.
Manche bauen die immer ein, vorsichtshalber- ich habs bisher fast nie getan.

Ausserdem sehe ich nicht, wo du eigentlich die Pins definierst, welche die Wire-Bibliothek benutzen soll...
Ich mache das bei mir so:
Wire.begin(D2, D1); // I2C Bus SDA=D2, SCL=D1 -> das funktioniert auch, mein NodeMcu spricht mit nem Arduino.

Ohne PullUps, übrigens...da aber mein Arduino ein ProMini in der 5V-Ausführung ist, hab ich Levelshifter dazwischen.
Läuft dein Sensor denn überhaupt mit 3V?

HaWe
29.12.2018, 09:54
Arduino verwendet standardmässig bei Nodemcu immer für Wire die Pins D1 und D2, wenn man nichts anderes definiert.
Pullups sind keine fest eingebaut, es funktioniert oft auch ganz ohne, besser aber man nimmt welche zwischen 2k und 5k wie es empfohlen wird.

Moppi
29.12.2018, 10:13
Hallo,

ich will mich mal dazu gesellen. Schade ist immer, dass man erst suchen muss, wenn man sich dafür interessiert. Ich will nicht meckern, aber:


NodeMCU 1.0 e-ink und si7021



Was ist ein si70231? - Kann man doch hinschreiben: .... meinGerät (si7021).
Als Einführung kurz die Teile aufzuführen, die man verwendet - auch mit Typbezeichnung - wäre gut, damit andere sich besser in den Text reinfinden.
Mühevoll ist es, wenn man so wie ich, die Teile nicht kennt und zwei-/dreimal über den Text lesen muss, um zu wissen, was was ist und was gemeint ist.

Dann komme ich zu dem:


SI7021:
SCL -> D2 (4)
SDA -> D2 (5)
GND -> GND
3.3v -> 3.3v

Das scheint falsch zu sein. Kann so nicht funktionieren. Ich gehe mal davon aus, dass der Problembeschreiber den Text selbst nochmal gelesen hat und Fehler nicht enthalten sind. Von daher muss man nicht lange suchen, es wurden SCL und SDA auf denselben Anschluss gelegt und dann auch noch die Pin-Nummern vertauscht (in Klammern scheinen die Pin-Nummern zu stehen).

Wenn man sich Mühe gibt und sorgfältig eine Problembeschreibung erstellt, findet man eigene Fehler oft schon selbst, weil man es für den Text nochmal genau reflektiert, was man gemacht hat. Andere haben auch weniger Mühe damit und können schneller helfen - mehr Antworten in kürzerer Zeit.

MfG