ESP8266 -> Arduino Nano seriell Problem

Hallo Leute,

ich bin son doofer Fachinformatiker(nebenberufliches Studium Medieninformatik am Laufen), der sich ein bisschen an Mikrocontrollern ausprobiert und nur gegooglete Ahnung von Elektronik hat.

Testaufbau ist folgender (eigentlich nicht so relevant)
Arduino Nano steuert über 595 Shiftregister ne 16 Kanal Relaisplatine mit je 24V LED Ketten - das funktioniert auch - hab im Arduino selber einfach hochzählen können, Platine reagiert

#include <SoftwareSerial.h>
SoftwareSerial ArduinoNano(6, 11); //RX, TX
const int anzeigePin1 = 2;
const int clockPin1 = 3;
const int datenPin1 = 9;
const int anzeigePin2 = 4;
const int clockPin2 = 5;
const int datenPin2 = 10;
const String cache = "0";

void setup() {
  // put your setup code here, to run once:
  ArduinoNano.begin(9600);
  Serial.begin(9600);
  pinMode(anzeigePin1, OUTPUT);
  pinMode(clockPin1, OUTPUT);
  pinMode(datenPin1, OUTPUT);
  pinMode(anzeigePin2, OUTPUT);
  pinMode(clockPin2, OUTPUT);
  pinMode(datenPin2, OUTPUT);
  pinMode(6, INPUT);
  pinMode(11, OUTPUT);
}

void loop() {
  delay(1000);
  Serial.println("Loopstart");
  // put your main code here, to run repeatedly:
  int Schaltzustand = 0;
  int s1 = 0;
  int s2 = 0;
  int n = 0;
  String Lesen = lesen();

  if (Lesen != "NA") {
    cache = Lesen;
  }
  Serial.println("Cache: "+cache);
  Schaltzustand = cache.toInt();
  Serial.println("Variable Schaltzustand: "+Schaltzustand);
  for (n = 0; n == 8; n++) {
    Serial.println(n);
    bitWrite(s1, n, ((Schaltzustand >> n) & 1));
  }
  for (n = 8; n == 16; n++) {
    Serial.println(n);
    bitWrite(s2, n - 8, ((Schaltzustand >> n) & 1));
  }

  digitalWrite(anzeigePin1, LOW);
  digitalWrite(anzeigePin2, LOW);
  shiftOut(datenPin1, clockPin1, MSBFIRST, s1);
  shiftOut(datenPin2, clockPin2, MSBFIRST, s2);
  digitalWrite(anzeigePin1, HIGH);
  digitalWrite(anzeigePin2, HIGH);
  delay(100);
  Serial.println(" Loopende");

}

//Seriell vom ESP8266 lesen
String lesen() {
  String nachricht = "";
  char zeichen;
  //Seriell vom Arduino lesen
  while (ArduinoNano.available()>0) {
    Serial.print("DA!");
    zeichen = ArduinoNano.read();
    nachricht.concat(zeichen);
  }
  if (nachricht!=""){
    Serial.print("Gelesen: "+nachricht);
  }else
    nachricht="NA";
  return nachricht;
}

ESP8266 stellt einen Webserver mit Eingabefeld und "Senden" Knopf bereit weil hochzählen langweilig ist.

// Bibliotheken
#include <ESP8266WiFi.h>
#include <SoftwareSerial.h>
#include <ESP8266WebServer.h>
#include <WiFiClient.h>

//WLAN Kennung
const char* ssid     = "Einhornhort";
const char* passwort = "geheim";

// Webserver auf Port 80
ESP8266WebServer  server(80);

//Kommunikation mit Arduino
SoftwareSerial NodeMCU(D2, D1); //RX, TX

//#######################################################################

void handleRoot() {
  String s = "<!DOCTYPE html><html><head><body><h1>Die Lampe</h1>
<form action=\"/action_page\">
<input type=\"text\" id=\"wert\" name=\"wert\" value=\"\">
<input type=\"submit\" value=\"Mach!\"></form></body></html>";;
  server.send(200, "text/html", s); //Send web page
  Serial.println("Hauptseite aufgerufen");
}

//#######################################################################

void handleForm() {
 String wert = server.arg("wert");   
 NodeMCU.print(wert);
 Serial.println("Werte gesendet: "+wert);
 String s = "<a href='/'> Go Back </a>";
 server.send(200, "text/html", s); //Send web page
}

//#######################################################################

void setup() {
  delay(500);
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(D1, OUTPUT);  //Seriell senden
  pinMode(D2, INPUT);  //Seriell empfangen
  NodeMCU.begin(9600);
  
  Serial.print("Verbindet mit ");
  Serial.println(ssid);
  WiFi.begin(ssid, passwort);
  int count = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    count++;
    if (count = 100) {
      break;
    }
  }
  server.on("/", handleRoot);
  server.on("/action_page", handleForm);
  server.begin();
  Serial.println("");
  Serial.println("WLAN verbunden");
  delay(10000);
  Serial.print("IP Addresse: ");
  Serial.println(WiFi.localIP());
}

//#######################################################################

void loop() {
  server.handleClient();
}

Nun das Problem... ESP soll via Seriell an Arduino die eingegebene Zahl übermitteln... tut er aber nicht - laut serieller Konsole kommt nix an
D1 vom ESP geht über son 8 Kanal "Logic Shifter" an D6 vom Nano - der Logic Shifter hängt mit der 3V Seite am 3V Ausgang des ESP und mit der 5V Seite am 5V Ausgang vom Nano - Ground haben beide gemeinsam...

Kann mir jemand einen Tipp geben ob ich ein Code - oder ein elektrisches Problem habe?

Wenn es hilft, male ich die Schaltung auch auf - da ich mit dem CAD Tool als Anfänger eher am Rad gedreht habe mit Bleistift und Kuli auf Papier :wink:

Viel freundlichen Dank!

Hallo,

das kann nicht sein

pinMode(D1, OUTPUT);  //Seriell senden
pinMode(D2, INPUT);  //Seriell empfangen

muss weg

Heinz

Levelshifter dazwischen?

Nimm doch einfach I2C (auch mit Levelshifter). Beispiel hier.

Gruß Tommy

Interessant ist auch, wie du beide verkabelt hast.
Da muss RX auf TX und TX auf RX. Einen Levelshifter brauchst du nicht. Jeweils einen 1k Widerstand in beide Leitungen und das funktioniert. Zumal die üblichen I2C-Levelshifter meist nicht dafür geeignet sind.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.