Zitat von
HaWe
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..
#
Code:
//
#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 );
}
}
}
Lesezeichen