Probleme mit Bord wechseln ESP8266 - uno

Halli Hallo

Mein Name ist Bodo, komme aus dem schönen Stadt Kassel :slight_smile:

Ich habe da mal eine Frage.
Ich habe ein Programm was auf meinem UNO läuft.
Jetzt möchte ich dieses Programm auf einem ESP 8266 laufen lassen.
Aber ich bekomme das einfach nicht zum laufen, weiß aber nicht was ich falsch mache. :confused:

Hier das Programm was auf dem UNO läuft:

#include "U8glib.h"
#include <DHT.h>

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

int posicao = 0;
int temp_max = 30;

#define pino_aumenta 5
#define pino_diminui 4
#define pino_rele 7
#define pino_DHT A0
#define DHTTYPE DHT11

DHT dht(pino_DHT, DHTTYPE);

int temperatura;
int aumenta, diminui;

unsigned long previousMillis = 0;
//Intervalo de medicao temperatura
const long interval = 10000;

void draw()
{
//Retangulo temperatura atual
u8g.drawRFrame(0, 17, 84, 46, 2);
u8g.setFont(u8g_font_profont29 );// u8g_font_fub20
//Atualiza a temperatura no display
u8g.setPrintPos(9, 50);
u8g.print(temperatura);
//Circulo grau
u8g.drawCircle(51, 33, 3);
u8g.drawStr( 56, 50, "C");

//Box superior amarelo
u8g.setFont(u8g_font_tpss);
u8g.drawRBox(0, 0, 128, 18, 0);
u8g.setColorIndex(0);
u8g.drawStr( 5, 11, "Temperature Controller");
u8g.setColorIndex(1);

//box temperatura maxima
u8g.drawRFrame(86, 17, 42, 46, 2);
if (temp_max <= temperatura)
{
//Temperature greater than temp. SET
u8g.drawRBox(86, 17, 42, 22, 2);
u8g.setColorIndex(0);
u8g.drawStr(96, 33, "SET");
u8g.setColorIndex(1);
//Aciona saida do rele
digitalWrite(pino_rele, LOW);

}
else
{
//Temperature lower than temp. SET
u8g.drawRFrame(86, 17, 42, 22, 2);
u8g.drawStr(96, 33, "SET");
//Desliga saida do rele
digitalWrite(pino_rele, HIGH);
}
//Atualiza na tela o valor da temp. maxima
u8g.setPrintPos(100, 55);
u8g.print(temp_max);
u8g.drawCircle(120, 47, 2);
u8g.setColorIndex(1);
}

void setup(void)
{
Serial.begin(9600);
pinMode(pino_rele, OUTPUT);
pinMode(pino_aumenta, INPUT);
pinMode(pino_diminui, INPUT);
dht.begin();
}

void loop(void)
{
unsigned long currentMillis = millis();
//Timer para ler o valor da temperatura
if (currentMillis - previousMillis >= interval)
{
temperatura = dht.readTemperature();
previousMillis = currentMillis;
}

//Testa botao aumenta temperatura
aumenta = digitalRead(pino_aumenta);
if (aumenta == 1)
{temp_max++;}
while (digitalRead(pino_aumenta) == 1)
{delay(100);}

//testa botao diminui temperatura
diminui = digitalRead(pino_diminui);
if (diminui == 1)
{temp_max--;}
while (digitalRead(pino_diminui) == 1)
{delay(100);}

u8g.firstPage();
// Chama a rotina de desenho na tela
do
{
draw();
}
while ( u8g.nextPage() );
delay(50);
}

Ich habe dann die eisten Zeilen geändert, für die Anpassung zu ESP 8266

#include "U8glib.h"
#include <DHT.h>

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

int posicao = 0;
int temp_max = 22;
int d2 = 4;
int d1 = 5;
int d3 = 0;
int d7 = 13;
int d2_status = 0;
int d1_status = 0;
int d3_status = 0;
int d7_status = 0;

#define pino_aumenta d1
#define pino_diminui d2
#define pino_rele d7
#define pino_DHT d3
#define DHTTYPE DHT11

DHT dht(pino_DHT, DHTTYPE);

Warum es nicht geht kann ich nicht sagen, deswegen suche ich hier HILFE

Ich möchte das Programm später mit Blynk laufen lassen.

Möchte das es so geht das wenn an 5 Punkten eine eingestellte Temperatur erreicht ist, das dann ein anderer ESP 8266 einen Ausgang schaltet.

Vielleicht kann mir da ja BITTE jemand helfen.
Gruß Bodo und DANKE im Voraus

Bodo-Baller:
komme aus dem schönen Stadt Kassel :slight_smile:

Ansichtssache!!

Der Sketch ist ohne Codetags nicht lesbar, also verwende diese!

Gruß Fips

Und mein Tipp:
Verwende beim ESP die GPIO-Bezeichnung, nicht die Dxx, das kann so schief gehen.

Und gibt es eine Fehlermeldung beim Ausführen des Sketches auf dem ESP ?

Hallo

Meine Vermutung ist es das die #include "U8glib.h" nicht für den ESP 8266 geeignet ist ( falsche Speicher Zuordnung ) kann das der Grund sein ?

Gruß Bodo

HotSystems:
Und mein Tipp:
Verwende beim ESP die GPIO-Bezeichnung, nicht die Dxx, das kann so schief gehen.

Wenn das richtige Board ausgewählt ist gibt es keinerlei Probleme!

Gruß Fips

Bodo-Baller:
Hallo

Meine Vermutung ist es das die #include "U8glib.h" nicht für den ESP 8266 geeignet ist ( falsche Speicher Zuordnung ) kann das der Grund sein ?

Gruß Bodo

Sketch in "</>" ? ? ? ?

Gruß Fips

Derfips:
Wenn das richtige Board ausgewählt ist gibt es keinerlei Probleme!

Gruß Fips

Gebe ich dir Recht, aber für uns ist es einfacher, da meist das richtige Board nicht bekannt ist.

Hallo,
setze deinen Sketch in Code-Tags.
Dann ist dieser auch lesbar.

Wie das geht, stehthier.

 #include "U8glib.h"
#include <DHT.h>

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

int posicao = 0;
int temp_max = 30;

#define pino_aumenta 5
#define pino_diminui 4
#define pino_rele 7
#define pino_DHT A0
#define DHTTYPE DHT11

DHT dht(pino_DHT, DHTTYPE);

int temperatura;
int aumenta, diminui;

unsigned long previousMillis = 0;
//Intervalo de medicao temperatura
const long interval = 10000;

void draw()
{
//Retangulo temperatura atual
u8g.drawRFrame(0, 17, 84, 46, 2);
u8g.setFont(u8g_font_profont29 );// u8g_font_fub20
//Atualiza a temperatura no display
u8g.setPrintPos(9, 50);
u8g.print(temperatura);
//Circulo grau
u8g.drawCircle(51, 33, 3);
u8g.drawStr( 56, 50, "C");

//Box superior amarelo
u8g.setFont(u8g_font_tpss);
u8g.drawRBox(0, 0, 128, 18, 0);
u8g.setColorIndex(0);
u8g.drawStr( 5, 11, "Temperature Controller");
u8g.setColorIndex(1);

//box temperatura maxima
u8g.drawRFrame(86, 17, 42, 46, 2);
if (temp_max <= temperatura)
{
//Temperature greater than temp. SET
u8g.drawRBox(86, 17, 42, 22, 2);
u8g.setColorIndex(0);
u8g.drawStr(96, 33, "SET");
u8g.setColorIndex(1);
//Aciona saida do rele
digitalWrite(pino_rele, LOW);

}
else
{
//Temperature lower than temp. SET
u8g.drawRFrame(86, 17, 42, 22, 2);
u8g.drawStr(96, 33, "SET");
//Desliga saida do rele
digitalWrite(pino_rele, HIGH);
}
//Atualiza na tela o valor da temp. maxima
u8g.setPrintPos(100, 55);
u8g.print(temp_max);
u8g.drawCircle(120, 47, 2);
u8g.setColorIndex(1);
}

void setup(void)
{
Serial.begin(9600);
pinMode(pino_rele, OUTPUT);
pinMode(pino_aumenta, INPUT);
pinMode(pino_diminui, INPUT);
dht.begin();
}

void loop(void)
{
unsigned long currentMillis = millis();
//Timer para ler o valor da temperatura
if (currentMillis - previousMillis >= interval)
{
temperatura = dht.readTemperature();
previousMillis = currentMillis;
}

//Testa botao aumenta temperatura
aumenta = digitalRead(pino_aumenta);
if (aumenta == 1)
{temp_max++;}
while (digitalRead(pino_aumenta) == 1)
{delay(100);}

//testa botao diminui temperatura
diminui = digitalRead(pino_diminui);
if (diminui == 1)
{temp_max--;}
while (digitalRead(pino_diminui) == 1)
{delay(100);}

u8g.firstPage();
// Chama a rotina de desenho na tela
do
{
draw();
}
while ( u8g.nextPage() );
delay(50);
}

Bodo-Baller:
Aber ich bekomme das einfach nicht zum laufen, weiß aber nicht was ich falsch mache.

Fehlermeldung der IDE?

Gruß Fips

Fehlermeldung gibt es so keine, lässt sich auch aufspielen.

Nur der Hinweis, wo mit ich aber nichts anfangen kann.

IROM : 239408 - code in flash (default or ICACHE_FLASH_ATTR)
IRAM : 27132 / 32768 - code in IRAM (ICACHE_RAM_ATTR, ISRs...)
DATA : 1264 ) - initialized variables (global, static) in RAM/HEAP
RODATA : 13156 ) / 81920 - constants (global, static) in RAM/HEAP
BSS : 25208 ) - zeroed variables (global, static) in RAM/HEAP
Der Sketch verwendet 280960 Bytes (29%) des Programmspeicherplatzes. Das Maximum sind 958448 Bytes.
Globale Variablen verwenden 39628 Bytes (48%) des dynamischen Speichers, 42292 Bytes für lokale Variablen verbleiben. Das Maximum sind 81920 Bytes.

Welchen Esp8266 verwendest du?

Gruß Fips

mini ESP8266 NodeMCU

NodeMcu:

static const uint8_t D0 = 16;
static const uint8_t D1 = 5;
static const uint8_t D2 = 4;
static const uint8_t D3 = 0;
static const uint8_t D4 = 2;
static const uint8_t D5 = 14;
static const uint8_t D6 = 12;
static const uint8_t D7 = 13;
static const uint8_t D8 = 15;
static const uint8_t RX = 3;
static const uint8_t TX = 1;

Dein Programm:

#define pino_aumenta 5
#define pino_diminui 4
#define pino_rele 7
#define pino_DHT A0

#Gruß Fips

Die u8glib ist ja schon etwas in die Jahre gekommen und wird nicht weiter entwickelt. Sie hat auch keine ESP-Unterstützung. Du solltest zum Nachfolger u8glib2 wechseln, die kann ESP8266 und ESP32. Im Wicki gibt es auch Hinweise zur Migration.

Gruß Tommy

Hallo
Ich habe es jetzt 3 Tage versucht es hin zu bekommen, aber leider ohne Erfolg. :astonished:
Der Nachfolger u8glib2 geht nicht, oder ich bekomme das nicht hin.
Die Befehle in der Libraries sind nicht die gleichen und sind mir so oder so nicht verständlich :o
Da ich auch keine Erfahrung mit dem ansteuern von 128X64 OLED I2Cs habe.
Meine Kenntnisse sind sehr begrenzt :confused:

Da ich mich auch leider nicht so gut auskenne wird das wohl nichts. :frowning:
Gibt es denn irgendwie eine Möglichkeit das ich das Programm auf einen ESP zum laufen zu bekommen?
Ist denn der ESP 32 vielleicht besser geeignet, das ich das Programm vom UNO zum laufen zu bekomme?
Könnte mir das vielleicht jemand BITTE helfen?
Gruß Bodo

PS gibt es denn jemanden hier aus der Nähe von Kassel ?

Ich möchte dieses Projekt nachbauen (Arduino Temperature Controller | DHT11,OLED display,relay | नेपालीमा - YouTube ) , aber es soll dann mit WIFI noch zusätzlich laufen, deswegen ein ESP 8266 mini. Möchte das Gehäuse so klein wie möglich machen. Habe auch schon für mein 3D Drucker ein Gehäuse angefangen.

Bodo-Baller:
Meine Kenntnisse sind sehr begrenzt :confused:

Dann musst Du das ändern, indem Du die Grundlagen lernst.

Das Thema auch keine Sache, die man mit Null-Ahnung mal so schnell umbaut. Du hast letztendlich 3 Varianten

  1. Du lernst die Grundlagen und irgendwann kannst Du es realisieren
  2. Du bezahlst einen Dienstleister, um das für Dich zu tun
  3. Du verzichtest darauf
    (4. Du findest einen, der das kostenlos für Dich programmiert)

Das ist wie mit Deinem Auto. Wenn Du da ein Problem hast, hast Du auch diese Möglichkeiten. Warum sollte das in der Programmierung anders sein?

Gruß Tommy

Bodo-Baller:
Ich habe es jetzt 3 Tage versucht es hin zu bekommen, aber leider ohne Erfolg. :astonished:

Rom wurde bekanntlich auch nicht in drei Tagen erbaut :slight_smile:

Bodo-Baller:
Der Nachfolger u8glib2 geht nicht, oder ich bekomme das nicht hin.

Die Bibliothek U8g2lib vom geschätzen Oli Kraus funktioniert meines Wissens prächtig. Ich fange gerne bei seinen Beispielen an. Da die ESP gegenüber den Arduinos schön viel Speicher haben, kann man den F Modus (Grafik wird komplett im Speicher gehalten) verwenden. Auch für I2C kann man die Standard-Pins nutzen, auch wenn HW (Hardware) nicht ganz exakt für die ESPs paßt. Also FHW_I2C im Contructor. Quelle zum Nachlesen.

Funktioniert bei Dir dieses Programm:

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup(void) {
  oled.begin();
}

void loop(void) {
  oled.clearBuffer();         // clear the internal memory
  oled.setFont(u8g2_font_6x12_tr); // choose a suitable font
  oled.setCursor(0, 15);
  oled.print("Hallo Welt!");
  oled.sendBuffer();          // transfer internal memory to the display
  delay(1000);
}

Ohne Sensor:

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <DHT.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

int posicao = 0;
int temp_max = 30;

#define pino_aumenta 5
#define pino_diminui 4
#define pino_rele 7
#define pino_DHT A0
#define DHTTYPE DHT11

DHT dht(pino_DHT, DHTTYPE);

int temperatura;
int aumenta, diminui;

unsigned long previousMillis = 0;
//Intervalo de medicao temperatura
const long interval = 10000;

void draw()
{
  //Retangulo temperatura atual
  oled.drawRFrame(0, 17, 84, 46, 2);
  oled.setFont(u8g2_font_helvR18_tr);// u8g_font_fub20
  //Atualiza a temperatura no display
  oled.setCursor(9, 50);
  oled.print(temperatura);
  //Circulo grau
  oled.drawCircle(51, 33, 3);
  oled.drawStr( 56, 50, "C");

  //Box superior amarelo
  oled.setFont(u8g2_font_7x14_tr);
  oled.drawRBox(0, 0, 128, 18, 0);
  oled.setDrawColor(0);
  oled.drawStr( 5, 11, "Temperatur Regler");
  oled.setDrawColor(1);

  //box temperatura maxima
  oled.drawRFrame(86, 17, 42, 46, 2);
  if (temp_max <= temperatura)
  {
    //Temperature greater than temp. SET
    oled.drawRBox(86, 17, 42, 22, 2);
    oled.setDrawColor(0);
    oled.drawStr(96, 33, "SET");
    oled.setDrawColor(1);
    //Aciona saida do rele
    digitalWrite(pino_rele, LOW);

  }
  else
  {
    //Temperature lower than temp. SET
    oled.drawRFrame(86, 17, 42, 22, 2);
    oled.drawStr(96, 33, "SET");
    //Desliga saida do rele
    digitalWrite(pino_rele, HIGH);
  }
  //Atualiza na tela o valor da temp. maxima
  oled.setCursor(100, 55);
  oled.print(temp_max);
  oled.drawCircle(120, 47, 2);
  oled.setDrawColor(1);
  oled.sendBuffer();          // transfer internal memory to the display
}

void setup(void)
{
  oled.begin();
  dht.begin();
  pinMode(pino_rele, OUTPUT);
  pinMode(pino_aumenta, INPUT_PULLUP);
  pinMode(pino_diminui, INPUT_PULLUP);
  oled.setFont(u8g2_font_6x12_tr);
  oled.setCursor(0, 15);
  oled.print("Start");
  oled.sendBuffer();          // transfer internal memory to the display
  delay(2000);
  draw();
}

void loop(void)
{
  unsigned long currentMillis = millis();
  //Timer para ler o valor da temperatura
  if (currentMillis - previousMillis >= interval)
  {
    //temperatura = dht.readTemperature();
    temperatura = 25;
    previousMillis = currentMillis;
    draw();
  }
/*
  //Testa botao aumenta temperatura
  aumenta = digitalRead(pino_aumenta);
  if (aumenta == 1)
  {
    temp_max++;
  }
  while (digitalRead(pino_aumenta) == 1)
  {
    delay(100);
  }

  //testa botao diminui temperatura
  diminui = digitalRead(pino_diminui);
  if (diminui == 1)
  {
    temp_max--;
  }
  while (digitalRead(pino_diminui) == 1)
  {
    delay(100);
  }
*/
}