Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

NodeMCU/ESP8266 - hva er det og hva kan det brukes til?


ZoRaC

Anbefalte innlegg

53 minutter siden, clio75 skrev:

Har sett litt på arduino plugin og den sier at den kan ha 9 kort. 

Kan noen forklare begrensningen og hva man gjør når man har planlagt 12 ?

 

Mener det kan kjøres Remote.
Da får du så mange du vil utfra hvor mange maskiner du kjører det på.

Litt nysgjerrig 12 stykker, hvorfor det? 

Lenke til kommentar
Del på andre sider

1 minute ago, Odd said:

Litt nysgjerrig 12 stykker, hvorfor det? 

Hvorfor ikke ;)

 

Temker 10++ temp sensorer og i alle fall en "sentral" som styrer litt ut i fra  temperature sensor. 

Så har jeg en del andre ting som jeg kansje skal lage med  nodeMCU 

 

@Actibus Sier du kan ha 30 kort, men finner ikke det i noen beskrivelser/manual. Men jeg finner at mann max kan ha 30 in/out på en device. 

Om 9 stk er en begrensing tror jeg at jeg bruker MYSENSORS.org istede :) 

Lenke til kommentar
Del på andre sider

6 minutter siden, clio75 skrev:

Hvorfor ikke ;)

 

Temker 10++ temp sensorer og i alle fall en "sentral" som styrer litt ut i fra  temperature sensor. 

Så har jeg en del andre ting som jeg kansje skal lage med  nodeMCU 

 

@Actibus Sier du kan ha 30 kort, men finner ikke det i noen beskrivelser/manual. Men jeg finner at mann max kan ha 30 in/out på en device. 

Om 9 stk er en begrensing tror jeg at jeg bruker MYSENSORS.org istede :) 

 

Du kan kjøre flere enn 9 ved å kjøre selve pluginet (exe fila) på en annen enhet og kople det opp som Remote plugin.
Et lite tips ... du kan ha en masse sensorer på en enhet ved å bruke IC2, grensesnittet leses ved at hver sensor får en egen adresse. (ONE wire)

Det er en slags buss hvor du kan henge på X antall sensorer.
 

Endret av Odd
Lenke til kommentar
Del på andre sider

1 hour ago, Odd said:

Et lite tips ... du kan ha en masse sensorer på en enhet ved å bruke IC2, grensesnittet leses ved at hver sensor får en egen adresse. (ONE wire)

Det er en slags buss hvor du kan henge på X antall sensorer.

Takk for tips :)

Lenke til kommentar
Del på andre sider

  • 1 måned senere...
On 11/15/2017 at 09:52, cozmo said:

 

Det der ser veldig lovende ut. Ser at folk driver små sensorer i ett års tid med type 3x1.5V batterier.

Jeg fant et design på et ekstremt strømgjerrig sensorkort basert på en ESP-12 (den "beste" versjonen av "ren" ESP8266). Den bruker ikke ESP8266 sin deepsleep-funksjon, men en egen chip som våkner og "skrur på lyset" (enabler en Low-dropout spenningsregulator som forsyner ESP'en) på intervall gitt av en motstand. Den måler også batterispenningen vhja ESP'ens ADC inngang, slik at den kan rapporteres inn.

http://www.kevindarrah.com/wiki/index.php?title=TrigBoard

 

Jeg har tilpasset designet og lagt ut mitt eget kort basert. Bruker nå kortet til bl.a. en temp/hum/lufttrykk sensor som drives av et oppladbart AAA LiFePo4 batteri:

image.png.b30898337689ce6a0179b13f9398ba61.png

Det hele får plass i en 10x6 cm boks.

Ved evt relayout vil jeg nok vurdere å gå over til chip-motstander (SMD), tenker da å bygge inn lading på kortet basert på denne chippen:

https://www.aliexpress.com/item/of-lithium-iron-phosphate-battery-chip-CN3058E-SOP8-absolutely-original/32745932440.html?spm=a2g0s.9042311.0.0.rJoIpA

http://consonance-elec.com/pdf/datasheet/DSE-CN3058E.pdf

 

AAA-batteriet lades nå av en 10x14cm 6V solcelle via en liten LiFePo4 lademodul som jeg har byttet noen chipresistorer på for å redusere ladestrømmen til ca 100 mA (AAA cellen bør ikke lades med mer enn 140 mA).

LiFePo4 er interessant batteriteknologi for 3,3V sensorer. En enkeltcelle LiFePo4 gir 3,2 V spenning ganske flatt helt til den nærmer seg utladet. Max spenning en ESP8266 er speccet for å tåle er 3,6 V, og det passer veldig fint med ladespenningen for LiFePo4. Grafen viser inngangsspenningen sensormodulen har rapportert inn til Domoticz siste tre døgn.Om natta er det batteriet som driver den, om dagen kommer ladespenningen opp. Her er :

image.thumb.png.3a8d069db9d36b02605d44f5f9c188b8.png

Uansett er der en 3,3V LDO spenningsregulator på kortet, så ESP'en ser ikke mer enn 3,3V. Med dette batteriet kunne jeg nok klart meg med en enklere kretsløsning, men dette designet gir fleksibilitet til evt å bruke et LiIon batteri el.l. som har høyere spenning.

  • Like 3
  • Thanks 1
Lenke til kommentar
Del på andre sider

  • 1 måned senere...

Løst, fant ut av det selv etter en del spekulering.

Kan deles om noen trenger

 

 

Noen som er kompetente på Arduino/NodeMCU koding her?

 

Kunne tenke meg å skrive om denne til å styre 4 rele via MQTT, det meste ligger i fila her men er usikker på hva som må fjernes og endres for å optimere den til mitt bruk.

https://github.com/thehookup/PoolMCU/blob/master/PoolMCU_CONFIGURE.in

Endret av kimstoroy
Lenke til kommentar
Del på andre sider

54 minutter siden, Moskus skrev:

*host* Arduino-plugin */host*

 

Prøvde den, men det var så ustabilt og med en gang den ble disconnected koblet rele 1 inn så en sprinkler i hagen stod på hele natten.

 

Jeg hadde 2 Fibaro Dual Relay som jeg benyttet her tildligere, men det var en kostbar løsning og jeg hadde andre plasser jeg ville benytte disse.

 

Jeg satt in Raspberry med Node Red, det fungerte utmerket via MQTT, men den tar en del plass.

 

Jeg fikk skrevet om en sketch jeg fant, så nå fungerer dette meget bra på NodeMCU via MQTT, samt det er mye billigere enn alternativer over(ca 250 inkl rele og 12v til 5v konverter).

 

Om noen trenger denne kan jeg dele :)

 

 

 

Lenke til kommentar
Del på andre sider

7 timer siden, kimstoroy skrev:

Prøvde den, men det var så ustabilt og med en gang den ble disconnected koblet rele 1 inn så en sprinkler i hagen stod på hele natten.

Øh… jaha? Jeg har kjørt vanningsanlegget med den i noen år nå. Aldri vært et problem her.

 

Og da kan du uansett snu polariteten slik at av faktisk er av. ;) 

Lenke til kommentar
Del på andre sider

Jeg satte sammen en NodeMCU med en DHT22 som oppdaterer (temperatur og fuktighet) hver time til Thingspeak.com. Jeg henter data fra thingspeak til HomeSeer hjemme. Dermed har jeg kontroll på temperaturen på loftet på landstedet.

Men; i dag merket jeg at NodeMCU'en lager et usikret trådløst nettverk med navn ESP***. Er det en sikkerhetsrisiko? Kan jeg slå det av? Jeg brukte Arduino og wifi-library for å sette opp NodeMCU.

Lenke til kommentar
Del på andre sider

13 timer siden, DiderikFrom skrev:

Men; i dag merket jeg at NodeMCU'en lager et usikret trådløst nettverk med navn ESP***. Er det en sikkerhetsrisiko? Kan jeg slå det av? Jeg brukte Arduino og wifi-library for å sette opp NodeMCU.

 

Det høres ut som en risiko, ja. 

Kan du dele koden du brukte for å sette det opp? Sikkert en smal sak å deaktivere. :) 

Lenke til kommentar
Del på andre sider

1 hour ago, ZoRaC said:

 

Det høres ut som en risiko, ja. 

Kan du dele koden du brukte for å sette det opp? Sikkert en smal sak å deaktivere. :) 

 

 

Ja, meget gjerne! Her er koden. Som du ser, har jeg funnet den på github, men har skrevet noe om fordi den rotet det til med Celsius.

Jeg synes det er rart at NodeMCU'en både kan lage et eget nettverk og være koblet til det trådløse nettet fra 4G-ruteren? 

 

Edit: Når jeg tenker meg om, antar jeg at ESP'en er i rutermodus kun når klienten ikke er tilkoblet (client.stop)? En nødløsning kunne være å flytte delay til før client.stop? Men det beste hadde vært å deaktivere rutermodus.

#include <DHT.h>
#include <ESP8266WiFi.h>

//https://github.com/casper-gh/nodemcu-temperature-sensor/blob/master/thermometer-dht22-thingspeak.ino
 
// replace with your channel's thingspeak API key, 
String apiKey = "***********";
const char* ssid = "**************";
const char* password = "***************";
 
const char* server = "api.thingspeak.com";
#define DHTPIN 4 // D2 pin on Nodemcu
 
DHT dht(DHTPIN, DHT22, 11);
WiFiClient client;

void setup() {                
  Serial.begin(115200);
  delay(10);
  dht.begin();
  
  WiFi.begin(ssid, password);
 
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
   
  WiFi.begin(ssid, password);
   
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
}
  
void loop() {   
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  // Read temperature as Celsius (the default)
  //float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  //float f = dht.readTemperature(true);
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
 
  if (client.connect(server,80)) {  //   "184.106.153.149" or api.thingspeak.com
    String postStr = apiKey;
           postStr +="&field1=";
           postStr += String((float)t);
           postStr +="&field2=";
           postStr += String((float)h);
//String((float)t sends float, and String((int)t sends integer

 
     client.print("POST /update HTTP/1.1\n"); 
     client.print("Host: api.thingspeak.com\n"); 
     client.print("Connection: close\n"); 
     client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n"); 
     client.print("Content-Type: application/x-www-form-urlencoded\n"); 
     client.print("Content-Length: "); 
     client.print(postStr.length()); 
     client.print("\n\n"); 
     client.print(postStr);
           
 
     Serial.print("Temperature: ");
     Serial.print(t);
     Serial.print(" degrees Celcius Humidity: "); 
     Serial.print(h);
     Serial.println("% send to Thingspeak");    
  }
  client.stop();
   
  Serial.println("Waiting...");    
  // time between updates
  //  delay(120000); // 2 mins
  delay(1800000); // 30 mins
}

 

Endret av DiderikFrom
Lenke til kommentar
Del på andre sider

21 minutter siden, DiderikFrom skrev:

Ja, meget gjerne! Her er koden. Som du ser, har jeg funnet den på github, men har skrevet noe om fordi den rotet det til med Celsius.

 

Jeg tror det løses med å sette dette før wifi.begin():

WiFi.mode(WIFI_STA);

Ref https://github.com/esp8266/Arduino/issues/676

 

Ser også at du har 2 "wifi.begin();", kanskje den ene starter i AP-modus? Ville fjernet den nederste av dem også. :) 

  • Like 1
Lenke til kommentar
Del på andre sider

5 minutes ago, ZoRaC said:

Ser også at du har 2 "wifi.begin();", kanskje den ene starter i AP-modus? Ville fjernet den nederste av dem også. :) 

 

Det har jeg jammen! Det må jeg fjerne,

 

5 minutes ago, ZoRaC said:

 

Jeg tror det løses med å sette dette før wifi.begin():


WiFi.mode(WIFI_STA);

Ref https://github.com/esp8266/Arduino/issues/676

 

Ah, herlig! Det ser veldig riktig ut, jamfør ref. (Det burde jeg jo ha klart å google meg til...)

Tester dette så snart jeg kommer ut til NodeMCU'en.

 

Tusen takk!?

Lenke til kommentar
Del på andre sider

På 13.6.2018 den 10.15, clio75 skrev:


 

 


Er på trappene til noe tilsvarende. Så om du har lyst til å dele hadde jeg fått litt inspirasjon emoji2.png

Sent from my SM-G930F using Tapatalk
 

 

 

Her er oppsettet mitt på NodeMCU

 

MQTT topic den responderer på:

/Sprinkler/sone1/

/Sprinkler/sone2/

/Sprinkler/sone3/

/Sprinkler/sone4/

 

Den svarer med følgende topic:

/Sprinkler/soneConfirm1/

/Sprinkler/soneConfirm2/

/Sprinkler/soneConfirm3/

/Sprinkler/soneConfirm4/

 

Her benyttes pinne 5-8 på NodeMCU som utganger til Rele, denne kan enkelt utvides til flere soner.

Topic kan endres til noe som passer bedre til ditt prosjekt

 

Her er innholdet i filen som er lastet opp til NodeMCU:

 

#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>

 

void callback(char* topic, byte* payload, unsigned int length);

 

//EDIT THESE LINES TO MATCH YOUR SETUP
const char* mqtt_server = "ip adr MQTT server";
const char* ssid = "ssid wifi";
const char* password = "Wifi Passord";

 

//EJ: Data PIN Assignment on WEMOS D1 R2 https://www.wemos.cc/product/d1.html
// if you are using Arduino UNO, you will need to change the "D1 ~ D4" with the corresponding UNO DATA pin number

const int switchPin1 = D5;
const int switchPin2 = D6;
const int switchPin3 = D7;
const int switchPin4 = D8;

 

//EJ: These are the MQTT Topic that will be used to manage the state of Relays 1 ~ 4
//EJ: Refer to my YAML component entry
//EJ: feel free to replicate the line if you have more relay switch to control, but dont forget to increment the number suffix so as increase switch logics in loop()

char const* switchTopic1 = "/Sprinkler/sone1/";
char const* switchTopic2 = "/Sprinkler/sone2/";
char const* switchTopic3 = "/Sprinkler/sone3/";
char const* switchTopic4 = "/Sprinkler/sone4/";


WiFiClient wifiClient;
PubSubClient client(mqtt_server, 1883, callback, wifiClient);

void setup() {
  //initialize the switch as an output and set to LOW (off)
  pinMode(switchPin1, OUTPUT); // Relay Switch 1
  digitalWrite(switchPin1, LOW);

  pinMode(switchPin2, OUTPUT); // Relay Switch 2
  digitalWrite(switchPin2, LOW);

  pinMode(switchPin3, OUTPUT); // Relay Switch 3
  digitalWrite(switchPin3, LOW);

  pinMode(switchPin4, OUTPUT); // Relay Switch 4
  digitalWrite(switchPin4, LOW);

  ArduinoOTA.setHostname("Sprinkler NodeMCU"); // A name given to your ESP8266 module when discovering it as a port in ARDUINO IDE
  ArduinoOTA.begin(); // OTA initialization

  //start the serial line for debugging
  Serial.begin(115200);
  delay(100);

  //start wifi subsystem
  WiFi.begin(ssid, password);
  //attempt to connect to the WIFI network and then connect to the MQTT server
  reconnect();

  //wait a bit before starting the main loop
      delay(2000);
}


void loop(){

  //reconnect if connection is lost
  if (!client.connected() && WiFi.status() == 3) {reconnect();}

  //maintain MQTT connection
  client.loop();

  //MUST delay to allow ESP8266 WIFI functions to run
  delay(10);
  ArduinoOTA.handle();
}

void callback(char* topic, byte* payload, unsigned int length) {

  //convert topic to string to make it easier to work with
  String topicStr = topic;
  //EJ: Note:  the "topic" value gets overwritten everytime it receives confirmation (callback) message from MQTT

  //Print out some debugging info
  Serial.println("Callback update.");
  Serial.print("Topic: ");
  Serial.println(topicStr);

   if (topicStr == "/Sprinkler/sone1/")
    {

     //turn the switch on if the payload is '1' and publish to the MQTT server a confirmation message
     if(payload[0] == '1'){
       digitalWrite(switchPin1, HIGH);
       client.publish("/Sprinkler/soneConfirm1/", "1");
       }

      //turn the switch off if the payload is '0' and publish to the MQTT server a confirmation message
     else if (payload[0] == '0'){
       digitalWrite(switchPin1, LOW);
       client.publish("/Sprinkler/soneConfirm1/", "0");
       }
     }

     // EJ: copy and paste this whole else-if block, should you need to control more switches
     else if (topicStr == "/Sprinkler/sone2/")
     {
     //turn the switch on if the payload is '1' and publish to the MQTT server a confirmation message
     if(payload[0] == '1'){
       digitalWrite(switchPin2, HIGH);
       client.publish("/Sprinkler/soneConfirm2/", "1");
       }

      //turn the switch off if the payload is '0' and publish to the MQTT server a confirmation message
     else if (payload[0] == '0'){
       digitalWrite(switchPin2, LOW);
       client.publish("/Sprinkler/soneConfirm2/", "0");
       }
     }
     else if (topicStr == "/Sprinkler/sone3/")
     {
     //turn the switch on if the payload is '1' and publish to the MQTT server a confirmation message
     if(payload[0] == '1'){
       digitalWrite(switchPin3, HIGH);
       client.publish("/Sprinkler/soneConfirm3/", "1");
       }

      //turn the switch off if the payload is '0' and publish to the MQTT server a confirmation message
     else if (payload[0] == '0'){
       digitalWrite(switchPin3, LOW);
       client.publish("/Sprinkler/soneConfirm3/", "0");
       }
     }
     else if (topicStr == "/Sprinkler/sone4/")
     {
     //turn the switch on if the payload is '1' and publish to the MQTT server a confirmation message
     if(payload[0] == '1'){
       digitalWrite(switchPin4, HIGH);
       client.publish("/Sprinkler/soneConfirm4/", "1");
       }

      //turn the switch off if the payload is '0' and publish to the MQTT server a confirmation message
     else if (payload[0] == '0'){
       digitalWrite(switchPin4, LOW);
       client.publish("/Sprinkler/soneConfirm4/", "0");
       }
     }
}


void reconnect() {

  //attempt to connect to the wifi if connection is lost
  if(WiFi.status() != WL_CONNECTED){
    //debug printing
    Serial.print("Connecting to ");
    Serial.println(ssid);

    //loop while we wait for connection
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }

    //print out some more debug once connected
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }

  //make sure we are connected to WIFI before attemping to reconnect to MQTT
  if(WiFi.status() == WL_CONNECTED){
  // Loop until we're reconnected to the MQTT server
    while (!client.connected()) {
      Serial.print("Attempting MQTT connection...");

      // Generate client name based on MAC address and last 8 bits of microsecond counter
      String clientName;
      clientName += "esp8266-";
      uint8_t mac[6];
      WiFi.macAddress(mac);
      clientName += macToStr(mac);

      //if connected, subscribe to the topic(s) we want to be notified about
      //EJ: Delete "mqtt_username", and "mqtt_password" here if you are not using any
      if (client.connect((char*) clientName.c_str(),"MQTT brukernavn", "MQTT passord")) {  //EJ: Update accordingly with your MQTT account
        Serial.print("\tMQTT Connected");
        client.subscribe(switchTopic1);
        client.subscribe(switchTopic2);
        client.subscribe(switchTopic3);
        client.subscribe(switchTopic4);
        //EJ: Do not forget to replicate the above line if you will have more than the above number of relay switches
      }

      //otherwise print failed for debugging
      else{Serial.println("\tFailed."); abort();}
    }
  }
}

//generate unique name from MAC addr
String macToStr(const uint8_t* mac){

  String result;

  for (int i = 0; i < 6; ++i) {
    result += String(mac, 16);

    if (i < 5){
      result += ':';
    }
  }
  return result;
}

Lenke til kommentar
Del på andre sider

On 6/18/2018 at 10:39, ZoRaC said:

 

Jeg tror det løses med å sette dette før wifi.begin():


WiFi.mode(WIFI_STA);

Ref https://github.com/esp8266/Arduino/issues/676

 

Ser også at du har 2 "wifi.begin();", kanskje den ene starter i AP-modus? Ville fjernet den nederste av dem også. :) 

 

On 6/18/2018 at 10:47, DiderikFrom said:

 

Det har jeg jammen! Det må jeg fjerne,

 

 

Ah, herlig! Det ser veldig riktig ut, jamfør ref. (Det burde jeg jo ha klart å google meg til...)

Tester dette så snart jeg kommer ut til NodeMCU'en.

 

Tusen takk!1f603.png

 

Da fikk jeg oppdatert NodeMCU'en i dag, og dette funket utmerket!

  • Like 1
Lenke til kommentar
Del på andre sider

  • 2 måneder senere...

Har fått i gang Arduino plugin, og brukar denne mot NodeMCU som styrer garasjeportane samt indikerer status på desse, det fungerer fint!

Men ser ut for meg som at det ikkje går an å lese inn analoge verdiar (via digitale pinnar), f.eks temperatur frå DS18B20. Får kun satt opp digitale inngangar som gir 1/0.

Er eg heilt på jordet, eller stemmer dette?

 

 

image.thumb.png.185f1bb906efeb0eab2c49be66bdb283.png

Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.