PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerfrage zu Arduino IDE und Node MCU



mjovi
03.12.2018, 08:56
Hallo Gemeinde.
Ich bin mir sicher ihr könnt mir helfen.
Ich nutze seit ein paar tagen den Arduino IDE (Version 1.8.7) um ein kleines Programm für ein D1 Mini (ESP8266MOD) von AZ Delivery zu erstellen.
Es soll eine 32x64 LED Matrix angesteuert werden.
Das klappt auch schon sehr gut allerdings nur wenn ich des D1 Mini per USB an meinem Rechner (Win10) angeschlossen habe und das Programm uploade.
Dann werden die Informationen angezeigt.
Jetzt bin ich davon ausgegangen dass wenn ich den D1 an eine andere Stromversorgung hänge dann wird das Programm direkt laufen.

Leider ist dem nicht so..Es passiert irgendwie nix..
Ich frag jetzt mal ganz naiv: Muss man das noch irgendwie definieren das es automatisch gestartet wird?


Vielen Dank und Viele Grüße
Michael

HaWe
03.12.2018, 09:47
hallo,
willkommen im Forum!
Ohne Code kann man dir sicher nicht helfen, also bitte IMMER den fraglichen Code posten,
und außerdem: um welche andere Stromversorgung handelt es sich?

mjovi
03.12.2018, 10:17
Hallo.
Sorry..das macht natürlich sinn.
Ich nutze als alternativer Stromversorgung ein Labornetzteil mir 2 USB Ausgängen. Das sollte genug Power haben.
Anbei mein Code:
--------------------------

#include <PxMatrix.h>
#include "ESP8266WiFi.h"


#ifdef ESP32

#define P_LAT 22
#define P_A 19
#define P_B 23
#define P_C 18
#define P_D 5
#define P_E 15
#define P_OE 2
hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

#endif

#ifdef ESP8266

#include <Ticker.h>
Ticker display_ticker;
#define P_LAT 16
#define P_A 5
#define P_B 4
#define P_C 15
#define P_D 12
#define P_E 0
#define P_OE 2

#endif
// Pins for LED MATRIX

uint8_t display_draw_time=0;

//PxMATRIX display(32,16,P_LAT, P_OE,P_A,P_B,P_C);
//PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D);
PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D,P_E);
//PxMATRIX display(128,32,P_LAT, P_OE,P_A,P_B,P_C,P_D,P_E);

// Some standard colors
uint16_t myRED = display.color565(255, 0, 0);
uint16_t myGREEN = display.color565(0, 255, 0);
uint16_t myBLUE = display.color565(0, 0, 255);
uint16_t myWHITE = display.color565(255, 255, 255);
uint16_t myYELLOW = display.color565(255, 255, 0);
uint16_t myCYAN = display.color565(0, 255, 255);
uint16_t myMAGENTA = display.color565(255, 0, 255);
uint16_t myBLACK = display.color565(0, 0, 0);

uint8_t ATop = 0;
uint8_t ALeft = 0;
uint8_t BTop = 0;
uint8_t BLeft = 32;
uint8_t CTop = 16;
uint8_t CLeft = 0;
uint8_t DTop = 16;
uint8_t DLeft = 32;

uint16_t myCOLORS[8]={myRED,myGREEN,myBLUE,myWHITE,myYELLOW,myCYAN,myM AGENTA,myBLACK};


const char* ssid = "mySSID";
const char* password = "myPASSWORD";

WiFiServer wifiServer(80);

#ifdef ESP8266
// ISR for display refresh
void display_updater()
{
display.display(display_draw_time);
}
#endif

#ifdef ESP32
void IRAM_ATTR display_updater(){
// Increment the counter and set the time of ISR
portENTER_CRITICAL_ISR(&timerMux);
display.display(display_draw_time);
portEXIT_CRITICAL_ISR(&timerMux);
}
#endif


void display_update_enable(bool is_enable)
{

#ifdef ESP8266
if (is_enable)
display_ticker.attach(0.002, display_updater);
else
display_ticker.detach();
#endif

#ifdef ESP32
if (is_enable)
{
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &display_updater, true);
timerAlarmWrite(timer, 2000, true);
timerAlarmEnable(timer);
}
else
{
timerDetachInterrupt(timer);
timerAlarmDisable(timer);
}
#endif


}

void aufteilung(uint8_t draw_time)
{
display.display(draw_time);
display.clearDisplay();
for (uint8_t x=0; x<64; x++){
display.drawPixel(x, 15, myBLUE);
display.drawPixel(x, 16, myBLUE);
}
for (uint8_t x=0; x<32; x++){
display.drawPixel(31, x, myBLUE);
display.drawPixel(32, x, myBLUE);
}
for (uint8_t x=0; x<32; x++){
display.drawPixel(0, x, myBLUE);
display.drawPixel(63, x, myBLUE);
}
for (uint8_t x=0; x<64; x++){
display.drawPixel(x, 0, myBLUE);
display.drawPixel(x, 31, myBLUE);
}

display_update_enable(true);
display.setBrightness(255);
yield();

}
void clearScore(String gruppe){
uint8_t left =0;
uint8_t top =0;
if(gruppe == "A"){
left = ALeft;
top=ATop;
}
if(gruppe == "B"){
left = BLeft;
top=BTop;
}
if(gruppe == "C"){
left = CLeft;
top = CTop;
}
if(gruppe == "D"){
left = DLeft;
top = DTop;
}
uint8_t x = 0;
uint8_t y = 0;
for (x=(left+1); x<(left+31); x++){
for (y=(top+1); y<(top+15); y++){
display.drawPixel(x, y, myBLACK);
}
}
display_update_enable(true);
yield();
}
void displayScore(String gruppe, String punkte ){
display.setTextSize(1);
display.setTextColor(myRED);
uint8_t left =0;
uint8_t top =0;
if(gruppe == "A"){
left = ALeft;
top=ATop;
}
if(gruppe == "B"){
left = BLeft;
top=BTop;
}
if(gruppe == "C"){
left = CLeft;
top = CTop;
}
if(gruppe == "D"){
left = DLeft;
top = DTop;
}
display.setCursor(left+3,top+4);
display.print(gruppe);
display.setTextColor(myWHITE);
display.setCursor(left+3+8,top+4);
display.print(punkte);
display_update_enable(true);
yield();
}
void displayIP(String ip){
display.display(0);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(myRED);
display.setCursor(1,4);
display.print("IP Adresse");
display.setTextColor(myWHITE);
display.setCursor(1,11);
display.print(ip);
display_update_enable(true);
yield();
}

void setup() {
Serial.begin(115200);
delay(1000);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting..");
}

Serial.print("Connected to WiFi. IP:");
Serial.println(WiFi.localIP());

wifiServer.begin();

// Define your display layout here, e.g. 1/8 step
display.begin(16);
display.setFastUpdate(true);
display_draw_time=0;
displayIP(WiFi.localIP().toString());
delay(5000);
aufteilung(display_draw_time);
displayScore("A", "___");
displayScore("B", "___");
displayScore("C", "___");
displayScore("D", "___");
delay(5000);
clearScore("D");
displayScore("D", "225");
}

void loop() {
WiFiClient client = wifiServer.available();
if (client) {
while (client.connected()) {
while (client.available()>0) {
char c = client.read();
Serial.write(c);
}
delay(10);
}
client.stop();
Serial.println("Client disconnected");
}
}
---------------------

HaWe
03.12.2018, 10:37
hallo,
zu
ein Labornetzteil mir 2 USB Ausgängen. Das sollte genug Power haben.
wieviel A genau haben die USB Ausgänge? Daran könnte es theoretisch dennoch bereits liegen.
Eventuell teste mal ein anderes Steckernetzteil mit mind. 2A.

Zu deinem Code:
der ist zu lang, um ihn zu testen und zu debuggen.
Kürze ihn mal auf das Nötigste herunter und dann poste bitte den gekürzten, minimalen Code.

Wenn du im erweiterten Editor bist, dann schließe ihn bitte auch in Code-Tags ein:
Code markieren und dann im Editor-Kopf-Menü auf das
#
Zeichen klicken.

Moppi
03.12.2018, 11:08
Mehr als 500mA kommen normal aus einem USB-Anschluss doch nicht raus oder doch? Wenn er zwei benutzen muss sind max. 1A bis 1.5A.
Gibt es ein Datenblatt zu der "32x64 LED Matrix"? Wieviel Strom benötigt die?
Vielleicht ist das D1 Mini mit der Versorgungsspannung falsch angeschlossen oder Spannung ist zu hoch (5V an 3.3V)... ?

MfG

HaWe
03.12.2018, 11:12
es funktioniert doch angeschlossen am PC-USB. Ich hatte aber selber schon Probleme mit zu schwachen externen USB-Stromquellen. Wer weiß, was das Netzteil hat.
Falls niemand einen Fehler bereits im Code sieht: warten wir mal seine Antwort ab!

mjovi
03.12.2018, 11:16
Hallo.
Also der USB Ausgang hat lt. Spec 1.2A max.
Die LED Matrix betreibe ich über den regelbaren Ausgang des Netzteils.
Ich denke nicht das mein Code im generellen ein Problem hat, denn er läuft ja.
Muss man irgendwo noch was einstellen damit mein Programm auf dem Flash des D1 Mini festgeschrieben wird oder so?
Ich denke fast das dies das Problem sein könnte. Aber wie gesagt. Ich bin mir nicht sicher.



#include <PxMatrix.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>



#ifdef ESP32

#define P_LAT 22
#define P_A 19
#define P_B 23
#define P_C 18
#define P_D 5
#define P_E 15
#define P_OE 2
hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

#endif

#ifdef ESP8266

#include <Ticker.h>
Ticker display_ticker;
#define P_LAT 16
#define P_A 5
#define P_B 4
#define P_C 15
#define P_D 12
#define P_E 0
#define P_OE 2

#endif
// Pins for LED MATRIX
uint8_t display_draw_time=0;


PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D,P_E);

// Some standard colors
uint16_t myRED = display.color565(255, 0, 0);
uint16_t myGREEN = display.color565(0, 255, 0);
uint16_t myBLUE = display.color565(0, 0, 255);
uint16_t myWHITE = display.color565(255, 255, 255);
uint16_t myYELLOW = display.color565(255, 255, 0);
uint16_t myCYAN = display.color565(0, 255, 255);
uint16_t myMAGENTA = display.color565(255, 0, 255);
uint16_t myBLACK = display.color565(0, 0, 0);

uint8_t ATop = 0;
uint8_t ALeft = 0;
uint8_t BTop = 0;
uint8_t BLeft = 32;
uint8_t CTop = 16;
uint8_t CLeft = 0;
uint8_t DTop = 16;
uint8_t DLeft = 32;

uint16_t myCOLORS[8]={myRED,myGREEN,myBLUE,myWHITE,myYELLOW,myCYAN,myM AGENTA,myBLACK};


const char* ssid = "mySSID";
const char* password = "myPassword";

ESP8266WebServer server(80); //instantiate server at port 80 (http port)

#ifdef ESP8266
// ISR for display refresh
void display_updater(){
display.display(display_draw_time);
}
#endif

#ifdef ESP32
void IRAM_ATTR display_updater(){
// Increment the counter and set the time of ISR
portENTER_CRITICAL_ISR(&timerMux);
display.display(display_draw_time);
portEXIT_CRITICAL_ISR(&timerMux);
}
#endif

void display_update_enable(bool is_enable){

#ifdef ESP8266
if (is_enable)
display_ticker.attach(0.002, display_updater);
else
display_ticker.detach();
#endif

#ifdef ESP32
if (is_enable) {
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &display_updater, true);
timerAlarmWrite(timer, 2000, true);
timerAlarmEnable(timer);
} else {
timerDetachInterrupt(timer);
timerAlarmDisable(timer);
}
#endif

}

void displayIP(String ip){
display.display(0);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(myRED);
display.setCursor(1,4);
display.print("IP Adresse");
display.setTextColor(myWHITE);
display.setCursor(1,11);
display.print(ip);
display_update_enable(true);
yield();
}

void setup() {
delay(1000);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting..");
}

Serial.print("Connected to WiFi. IP:");
Serial.println(WiFi.localIP());

server.begin();

// Define your display layout here, e.g. 1/8 step
display.begin(16);
display.setFastUpdate(true);
display_draw_time=0;
displayIP(WiFi.localIP().toString());

}

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

HaWe
03.12.2018, 11:20
es hätte sein können, dass im Code irgendwo auf Serial() gewartet wird, das konnte ich aber nicht finden bisher.
Meine esp8266 funktionieren ohne weiters Hochladen von was auch immer, egal wo sie angeschlossen sind.

mjovi
03.12.2018, 11:31
Darf ich frage welche du genau benutzt?

Müssen die verwendeten Bibliotheken (z.B.: <PxMatrix.h>) auch mit hochgeladen werden oder passiert das automatisch?

HaWe
03.12.2018, 11:35
alle libs (.h, .cpp) werden zusammen mit .ino von gpp automatisch mitcompiliert.
Müsstest du irgendetwas extra hochladen, müsstest du es auch bereits im PC-USB Betrieb.
Meine esps habe ich von Ebay
zB https://www.ebay.de/itm/NodeMCU-V3-Lua-WIFI-Module-ESP8266-32M-Extra-Memory-Flash-USB-Serial-CH340GUUMW/153166509331?hash=item23a96f7513:g:ylcAAOSwIphbPGZ d

mjovi
03.12.2018, 11:48
Und mit welchen Editor arbeitest du?
Auch mit dem Arduino IDE?

Kann es vielleicht an dem liegen?

HaWe
03.12.2018, 12:02
ich nutze die auch, vers. 1.8.5
Aber wenn alles richtig per PC USB funktioniert und nicht an ext. 5V, dann kann es IMO nur liegen an
a) warten auf nicht vorhandenen Serial Kontakt (sehe ich nicht bei dir)
b) zu schwache Stromquelle

andere mögliche Fehlerquellen sehe ich z.Zt noch nicht.

mjovi
03.12.2018, 12:22
Also. Wenn ich das Display abziehe dann startet die MCU. Auch mit diversen Stromquellen.

Aber sobald ich das Display hinhänge und dann starte tut sich nix mehr

:(

btw: habe jetzt alles am dem Ausgang vom Schaltnetzteil hängen.
Das ist auf jeden fall leistungsstark genug.

HaWe
03.12.2018, 12:41
klingt, als würde das Display über irgendeinen Pin des esp diesen am Starten hindern -
hast du display GND und esp GND verbunden?
sind die GPIOs D0 (gpio 16) oder D8 (gpio 15) mit vom Display belegt?

mjovi
03.12.2018, 13:05
So.. gefunden.
Es lag tatsächlich an einem Kabel.
Ein Kabel war Zuviel. Es ging von D3 NodeMCU auf GND im Display.
Ich muss mir das mal in ruhe ansehen ob das in der Beschreibung irgendwo stand.

Vielen Dank für eure Hilfe.

HaWe
03.12.2018, 13:55
sehr gut, freut mich.
Der Teufel ist manchmal eben wirklich ein Eichhörnchen 8)