PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NodeMCU L298N DC Motor MQTT



Grace13
02.03.2019, 23:12
Hi,

Ich würde gerne einen 12 V DC Motor über eine H Brücke steuern ( L289N).


// Gleichstrommotor 1

int GSM1 = 3;
int in1 = 4;
int in2 = 5;

void setup()
{
pinMode(GSM1, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);

}
void loop()
{
digitalWrite(in1, HIGH); // Motor 1 beginnt zu rotieren
digitalWrite(in2, LOW);

analogWrite(GSM1, 200); // Motor 1 soll mit der Geschwindigkeit "200" (max. 255) rotieren


delay(2000);

digitalWrite(in1, LOW); // Durch die Veränderung von HIGH auf LOW (bzw. LOW auf HIGH) wird die Richtung der Rotation verändert.
digitalWrite(in2, HIGH);
delay(2000);

digitalWrite(in1, LOW); // Anschließend sollen die Motoren 2 Sekunden ruhen.
digitalWrite(in2, LOW);

delay(2000);
}

Damit bekomm ich den Motor zum laufen das wars aber auch.

Im Serial Monitor bekomm ich leider gar nichts angezeigt auf 115200 und auf 9600.
Da fängts nämlich schon an den Motor zu steuern. Brauch nur an/aus/richtungswechsel
Mein Ziel ist später den NodeMCU über MQTT aus dem IoBroker mit Alexa zu steuern. - Will damit die Klappe vom Futterautomat aufmachen.- Nicht unbedingt über Alexa kann auch automatisiert sein so das der Hund einmal am Tag was in den Napf bekommt.

Wenn ich den normalen WebServer versuche zu installieren bekomme ich irgendwie auch kein Output im Serial Monitor.

Versuch mich schon seit einigen Stunden. Leider bekomm ich es noch nicht hin mir aus den verschiedenen Sketchen die passenden Zeilen rauszusuchen.Hab erst vor kurzem mit nem Raspebrry angefangen. Nun ist NodeMCU bzw Ardunio an der Reihe da ich hier doch "einfacher" und günstiger bei meinen Projekten fahre.

Danke für eure Hilfe!!

HaWe
03.03.2019, 08:32
hallo,
wo hast du denn Serial() initialisiert und gestartet? ;)


PS, edit:
nur als Anmerkung, hat hiermit nichts direkt zu tun:
du weißt aber schon, dass die GPIO Pins 4+5 standardmäßig für i2c verwendet werden?

D-pin GPIO default
D1 5 SCL
D2 4 SDA

Grace13
03.03.2019, 13:01
Ehmm 😅 also es läuft alles über Win 10 Arduino IDE. Wenn ich das Sketch hochgeladen habe, öffne ich hierrüber dann den Serial ()?
War das, dass was du wissen wolltest 😅

Okay, sollte man also ändern?
Muss mir mal durchlesen was I2C ist

HaWe
03.03.2019, 13:52
Ehmm �� also es läuft alles über Win 10 Arduino IDE. Wenn ich das Sketch hochgeladen habe, öffne ich hierrüber dann den Serial ()?
War das, dass was du wissen wolltest ��

Okay, sollte man also ändern?
Muss mir mal durchlesen was I2C ist

am besten, du machst erst mal ein wirklich gutes Standard-Tutorial für Arduino von Anfang bis Ende, wo du die Basics von der Pike auf lernst. Dir fehlt offenbar noch sehr viel Grundwissen, bevor es an ESP8266 geht, der sowieso eher etwas für Fortgeschrittene ist (nicht 100% Arduino-API-kompatibel).
Für Serial() braucht man z.B. als allererstes Serial.begin(9600) oder Serial.begin(115200) etc.

Grace13
03.03.2019, 22:18
am besten, du machst erst mal ein wirklich gutes Standard-Tutorial für Arduino von Anfang bis Ende, wo du die Basics von der Pike auf lernst. Dir fehlt offenbar noch sehr viel Grundwissen, bevor es an ESP8266 geht, der sowieso eher etwas für Fortgeschrittene ist (nicht 100% Arduino-API-kompatibel).
Für Serial() braucht man z.B. als allererstes Serial.begin(9600) oder Serial.begin(115200) etc.

habe ich mal etwas gemacht.

Hab mal versucht ein sketch selber zu schreiben. Ist warscheinlich eher komplett in die Hose gefallen..

Das Problem das ich habe ist das es ührsprünglich für die GPIO steuerung mittels MQTT gedacht ist. ( Mein gedanken Gang... der NodeMCU hat ja auch GPIOs hier habe ich beispielweise GPIO 5/16/4 gewählt. Da das Sketch ja schon mittels mqtt die GPIO steuern kann. Soweit sogut nun müsste ich ja nur den einen Pin für die Geschwindigkeit ergänzen "Motor_ena")
Es werden warscheinlich ziemlich viele fehle drin sein, sry für das wirrwar..

#

//
#include <ArduinoJson.h>
#include <EEPROM.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>


#define TOKEN "ESP8266_DEMO_TOKEN"



#define GPIO 5 // PIN D0
#define GPIO 16 // PIN D1
#define GPIO 4 // PIN D2

const char *ssid = "Wlan";
const char *password = "SERVER PASSWORD";
const char *mqtt_server = "hie rmuss der mosquitto server rein?";
const char *device_id = "esp8266";

int motor1_ena = 4; // muss ich den jetzt auch als GPIO definieren?
int motor1_in1 = 5;
int motor1_in2 = 16;

WiFiServer server(80); // WLAN Verbindung wird über den Port80 hergestellt

void setup()
{

pinMode( motor1_ena , OUTPUT); // Geschwindigkeit
pinMode( motor1_in1 , OUTPUT); // + oder - von motor
pinMode( motor1_in2 , OUTPUT); // - oder + von motor




Serial.begin(115200); // Das NodeMCU verwendet die Baudrate "115200"
// Diese Baudrate muss später im Seriellen Monitor eingestellt werden, damit wir die Aktionen des NodeMCU überwachen können


Serial.println();
Serial.print("Verbinde zu ");
Serial.println(ssid); // Kontrollelement im seriellen Monitor


WiFi.begin(ssid,password); // Die WLAN Verbindung wird, mit der oben definierten SSID und dem zugehörigen Passwort hergestellt


while (WiFi.status() != WL_CONNECTED) // Solange noch keine WLAN-Verbindung besteht....
{
delay(500);
Serial.print("."); // ... sollen Punkte ausgegeben werden. Die Punkte dienen als Kontrollelement.
}
Serial.println(" ");
Serial.println("WiFi verbunden"); // Kontrollelement im seriellen Monitor

server.begin(); // Das NodeMCU dient nun als Mini-Webserver, auf welchem wir Daten temporär speichern können

Serial.println ("Webserver laeuft, warte auf ESP8266..."); // Kontrollelement im seriellen Monitor

delay(10000); // An dieser Stelle geben wir dem ESP-Modul 10 Sekunden Zeit für die Initialisierung
Serial.println();
Serial.println("Die IP-Adresse des Webservers lautet ");
Serial.println(WiFi.localIP()); // Nun wird die sogenannte localIP ausgegeben. Diese können wir später im Webbrowser aufrufen und die Temperaturwerte ablesen.
{
pinMode( motor1_ena , OUTPUT);
pinMode( motor1_in1 , OUTPUT);
pinMode( motor1_in2 , OUTPUT);
delay(10);
Init WiFi();
client.setServer( thingsboardServer, 1883 );
client.setCallback(on_message);



}
void loop() {
if ( !client.connected() ) {
reconnect();
}

client.loop();
}

// The callback for when a PUBLISH message is received from the server.
void on_message(const char* topic, byte* payload, unsigned int length) {

Serial.println("On message");

char json[length + 1];
strncpy (json, (char*)payload, length);
json[length] = '\0';

Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Message: ");
Serial.println(json);

// Decode JSON request
StaticJsonBuffer<200> jsonBuffer;
JsonObject& data = jsonBuffer.parseObject((char*)json);

if (!data.success())
{
Serial.println("parseObject() failed");
return;
}

// Check request method
String methodName = String((const char*)data["method"]);

if (methodName.equals("getGpioStatus")) {
// Reply with GPIO status
String responseTopic = String(topic);
responseTopic.replace("request", "response");
client.publish(responseTopic.c_str(), get_gpio_status().c_str());
} else if (methodName.equals("setGpioStatus")) {
// Update GPIO status and reply
set_gpio_status(data["params"]["pin"], data["params"]["enabled"]);
String responseTopic = String(topic);
responseTopic.replace("request", "response");
client.publish(responseTopic.c_str(), get_gpio_status().c_str());
client.publish("v1/devices/me/attributes", get_gpio_status().c_str());
}
}

String get_gpio_status() {
// Prepare gpios JSON payload string
StaticJsonBuffer<200> jsonBuffer;
JsonObject& data = jsonBuffer.createObject();
data[String(GPIO0_PIN)] = gpioState[0] ? true : false;
data[String(GPIO2_PIN)] = gpioState[1] ? true : false;
char payload[256];
data.printTo(payload, sizeof(payload));
String strPayload = String(payload);
Serial.print("Get gpio status: ");
Serial.println(strPayload);
return strPayload;
}

void set_gpio_status(int pin, boolean enabled) {
if (pin == GPIO0_PIN) {
// Output GPIOs state
digitalWrite(GPIO0, enabled ? HIGH : LOW);
// Update GPIOs state
gpioState[0] = enabled;
} else if (pin == GPIO2_PIN) {
// Output GPIOs state
digitalWrite(GPIO2, enabled ? HIGH : LOW);
// Update GPIOs state
gpioState[1] = enabled;
}
}

void InitWiFi() {
Serial.println("Connecting to AP ...");
// attempt to connect to WiFi network

WiFi.begin(WIFI_AP, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
}


void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
status = WiFi.status();
if ( status != WL_CONNECTED) {
WiFi.begin(WIFI_AP, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
}
Serial.print("Connecting to ThingsBoard node ...");
// Attempt to connect (clientId, username, password)
if ( client.connect("ESP8266 Device", TOKEN, NULL) ) {
Serial.println( "[DONE]" );
// Subscribing to receive RPC requests
client.subscribe("v1/devices/me/rpc/request/+");
// Sending current GPIO status
Serial.println("Sending current GPIO status ...");
client.publish("v1/devices/me/attributes", get_gpio_status().c_str());
} else {
Serial.print( "[FAILED] [ rc = " );
Serial.print( client.state() );
Serial.println( " : retrying in 5 seconds]" );
// Wait 5 seconds before retrying
delay( 5000 );
}
}
}