Fórum témák

» Több friss téma
Lapozás: OK   81 / 81
(#) gsc73 hozzászólása Feb 5, 2019 /
 
Sziasztok!

Nagyon köszönöm a tanácsokat, így már el tudok indulni. Nekem sem volt "komfortos" a relé, így optocsatolóval már okés lesz. Építeni nem fogok (az régebben volt), mostanában inkább"félkész" modulokból építkezem.

Üdv: G.
(#) Firefighter1 hozzászólása Feb 5, 2019 /
 
Szegény ember vízzel főz, még szegényebb meg EasyCoding-al programozik!

Folyamatábrás programozóban (igaz hogy NodeMCU ra van optimalizálva a modul de csak a PIN-eket írom át) így néz ki egy "programom"
Biztos hogy tele van sallangal, meg valószínűleg formailag sem olyan mint amilyennek kéne lennie, de működik!

Ez egy "gombot" azaz egy bemenetet figyel, ( tanács alapján a láb tápfeszre fel van húzva, így azt figyeli mikor lesz alacsony amikor a gomb meg van nyomva
és olyankor MQTT szerverre küld egy üzenetet jelen esetben egy "1" vagy egy "0"

  1. #include <ESP8266WiFi.h>
  2.  
  3. #include <PubSubClient.h>
  4.  
  5. int  i;
  6. int  a;
  7. int  b;
  8. WiFiClient espClient;
  9. PubSubClient client(espClient);
  10.  
  11. void reconnectmqttserver() {
  12. while (!client.connected()) {
  13. Serial.print("Attempting MQTT connection...");
  14. String clientId = "ESP8266Client-";
  15.  clientId += String(random(0xffff), HEX);
  16. if (client.connect(clientId.c_str())) {
  17. Serial.println("connected");
  18. } else {
  19. Serial.print("failed, rc=");
  20. Serial.print(client.state());
  21. Serial.println(" try again in 5 seconds");
  22. delay(5000);
  23. }
  24. }
  25. }
  26.  
  27. char msgmqtt[50];
  28. void callback(char* topic, byte* payload, unsigned int length) {
  29.   String MQTT_DATA = "";
  30.   for (int i=0;i<length;i++) {
  31.    MQTT_DATA += (char)payload[i];}
  32.  
  33. }
  34.  
  35. void setup()
  36. {
  37.   i = 0;
  38. a = 0;
  39. b = 0;
  40. Serial.begin(9600);
  41. pinMode(0, INPUT);
  42.   WiFi.disconnect();
  43.   delay(3000);
  44.   Serial.println("START");
  45.    WiFi.begin("MyNET","MyPassword");
  46.   while ((!(WiFi.status() == WL_CONNECTED))){
  47.     delay(300);
  48.     Serial.print("..");
  49.  
  50.   }
  51.   Serial.println("Connected");
  52.  
  53. }
  54.  
  55.  
  56. void loop()
  57. {
  58.  
  59.     client.setServer("192.168.1.13", 1883);
  60.     client.setCallback(callback);
  61.     if (!client.connected()) {
  62.     reconnectmqttserver();
  63.     }
  64.     client.loop();
  65.     if (digitalRead(0) == 0) {
  66.       a = 1;
  67.  
  68.     }
  69.     if (a == 1) {
  70.       if (b == 0) {
  71.         i = 1;
  72.         snprintf (msgmqtt, 50, "%d ",i);
  73.         client.publish("TOPIC", msgmqtt);
  74.         a = 0;
  75.         b = 1;
  76.  
  77.       }
  78.  
  79.     }
  80.     if (a == 1) {
  81.       if (b == 1) {
  82.         i = 0;
  83.         snprintf (msgmqtt, 50, "%d ",i);
  84.         client.publish("TOPIC", msgmqtt);
  85.         a = 0;
  86.         b = 0;
  87.  
  88.       }
  89.  
  90.     }
  91.     delay(500);
  92.  
  93. }


még azt kéne elérjem hogy a két GPIO láb kimenet legyen és RX-en és TX-en figyelje a "gombot"
a pergésmentesítést most nagyon alpári módon egy fél másodperces késleltetéssel a ciklus végén oldottam meg.
Legjobb lenne az lenne ha egy megszakítást tudnék tenni bele ami az rx-tx lábakat figyel.. vagy a GPIO0-2 lábakat és akkor RX-TX a kimenet

gomb1.PNG
    
(#) Gránátalma válasza Firefighter1 hozzászólására (») Feb 6, 2019 /
 
Ha az RX-TX-et akarod használni GPIO-nak szerintem a serial.begint kapd ki, vagy ifdefine-old meg.

A prellmentesítésre nem a fél másodperces delay a megoldás szerintem, hahenm az, ha dupla IF függvényt alkalmazol, egymásba írva, egyet a lenyomásra, majd egyet a visszatérésre, így elégséges kb 20-50ms delay is és TELJESEN prell mentes lesz a gombnyomás.

Szerk.: gyors átfutottam a kódot, a változók használata így nem annyira célszerű. Ekkora programnál nincs különösebben jelentősége, de ha komolyabb programot írsz és nem csak a program memória számít, hanem a RAM is, akkor ez felejtős.
A hozzászólás módosítva: Feb 6, 2019
(#) andyka hozzászólása Feb 6, 2019 /
 
Hello,
A prellmentesítésre -> Bővebben: Link, kitünő
(#) Firefighter1 hozzászólása Feb 6, 2019 /
 
Arra hol találok útmutatót hogy az RX és TX re hányas lábként hivatkozhatok!
Mert mindenhol csak a csatolt képet találom de az fals...
A hozzászólás módosítva: Feb 6, 2019
(#) Firefighter1 válasza Gránátalma hozzászólására (») Feb 6, 2019 /
 
Szia!
Idézet:
„Ha az RX-TX-et akarod használni GPIO-nak szerintem a serial.begint kapd ki”

Ezzel konfigurálom hogy sorosportkent menjen a tx rx nem pedig I/O.
A "prellmentesítést" még körbejárom.... néztem azt a könyvtárat is.... lehet hogy egy duplatripla nyakatekert IF el fogom megoldani!
És igen abba is igazad van hogy a válltozók ilyen jellegű használata "pazarlás"

De a komolyabb programoktól én még messze vagyok mint Makó Jeruzsálemtől.... odáig pedig hosszú az út! Addigra csak meg tudom "jól" tanulni!

Jelen pillanatban a legtöbb dolog amit tervezek egy ESP be paszirozni, az egy hő/pára mérés, meg 1 relé egy gomb vagy hő/pára meg 2 relé...
(#) Gránátalma válasza Firefighter1 hozzászólására (») Feb 6, 2019 /
 
Igen, de ha serialként használod, nem fogod IO-ként használni, ezért kell levenni róla, de ha "dinamikusan" akarod kapcsolgatni program ujraírás nélkül, maximum ujraindítás útján, akkor ifdefine- al tudod ki-bekapcsolgatni.

A prellmentesítéshez felesleges pocsékolni a program memóriát egy library-vel.(persze ezesetben elfér....)
Elég, ha If-be figyeled a gomb lenyomását, ezen belül meg figyeled egy másikkal a felengedést. Nem tud billegni az állapot, ha vár a program az állapotváltozásra.

Tudom, itt épp elfér a sok globál változó, ezért írtam, hogy ha esetleg a későbbiekben...

Szerk.: kifelejtettem, TX a GPIO1, RX a GPIO3.
A hozzászólás módosítva: Feb 6, 2019
(#) Firefighter1 válasza Gránátalma hozzászólására (») Feb 7, 2019 /
 
Igazság szerint eddig csak azért használtam hogy a programbeli hibákat tudjam kontrolálni.... minden "eseménynél"irattattam vele sorosporton a PC -re így láttam hogy hol a hiba!
Ugyhogy nem kell de az a plussz 2 láb jól jön!

És ha GPIO1 és GPIO3 akkor a pinmodnál pedig egyes és hármasikként "hivatkozok" rá?
(#) Gránátalma válasza Firefighter1 hozzászólására (») Feb 7, 2019 /
 
Igen.
Ha van szkópod, vagy logikai analizátorod, dugd rá erre a két lábra és nézd meg, pl egy beindításnál mit produkál, ugyanis míg a SETUP funkciód nem végzi el, addig a TX tutira beszélgetni fog.
A hozzászólás módosítva: Feb 7, 2019
(#) Firefighter1 válasza Gránátalma hozzászólására (») Feb 7, 2019 /
 
Akkor Rx/TX et jobb ha gombnak konfigurálom az én esetemben, mert ha relé lenne akkor lehet hogy addig rángatná.

Nagyon köszönöm, sokat segítettél!
Most emésztem egy kicsit a dolgokat aztán hétvégén valamit megalkotok
(#) Gránátalma válasza Firefighter1 hozzászólására (») Feb 7, 2019 /
 
Nem lehet, hanem tuti, hogy rángatná. Gombként nem okoz problémát, így van. Szivesen.
A hozzászólás módosítva: Feb 7, 2019
(#) Firefighter1 válasza Gránátalma hozzászólására (») Feb 9, 2019 /
 
Perllmentesitésre így jó?

  1. int  gomb;
  2. void setup()
  3. {
  4.   gomb = 0;
  5. pinMode(3, INPUT);
  6.  
  7. }
  8.  
  9.  
  10. void loop()
  11. {
  12.  
  13.     if (digitalRead(3) == 1) {
  14.       while ((digitalRead(3) == 0)){
  15.         delay(25);
  16.  
  17.       }
  18.       gomb = 1;
  19.  
  20.     }
  21.  
  22. }

Itt most semmi más nincs a kódba csak a gombfigyelés.

Az if-el belép ha a gomb lenyomódik, és elvileg utána azt vizsgálja hogy a gomb váltott e alacsonyra, ha nem akkor vár 25 milliszekundumot és megint megnézi, ha alacsony, akkor kilép az ismétlésből, a gombhoz rendelt segédváltozó értékét átállítja 1-re és fut tovább...

Legalábbis ezt szerettem volna elérni, és Folyamatábrásan nekem elvileg jól is néz ki, mert ezt a kódrészletet ebből a blockábrából fordította.
A hozzászólás módosítva: Feb 9, 2019
(#) Bakman válasza Firefighter1 hozzászólására (») Feb 10, 2019 /
 
A deklarálásnak nem a Setup részben kellene lennie? Így minden egyes körben megtörténik a változó létrehozása.
(#) proba válasza Firefighter1 hozzászólására (») Feb 10, 2019 /
 
Ha nem túl hosszú a programom, szivesebben alkalmazok számlálót prell mentesítésre.
Egy számláló minden loop ciklus lefutásnál nő egyet. ( ez ha jól szervezed többé kevésbé állandó idő) Minden gombnyomás/felengedés nullázza. Ha elér egy bizonyos értéket, akkor a gomb érvényessé válik, tárolható, és prellmentes. Így nem kell a programodnak azzal tölteni az időt hogy a gombra vár.
(#) Kovidivi válasza proba hozzászólására (») Feb 10, 2019 /
 
Hogyan különbözteted meg, hogy gombnyomás, vagy gomb elengedés történt? Beolvasod a szám mellé a gomb állapotát is?
(#) Firefighter1 válasza Bakman hozzászólására (») Feb 10, 2019 /
 
Az nem oda kerül, csak véletlenűl benne maradt,
Ezt a kis részletet csak "kiemeltem" az egészből, hogy meg tudjam kérdezni, a gomb része igy jó e..??

Hosszúnak éppen nem hosszú, de van:
2 gomb állapot figyelés
egy net csatlakozás
egy MQTT csatlakozás
2 mqtt topic hallgatás / írás
2 kimenet...
kicsit rendbe szedem, aztán felteszem ide.
Meg még össze kell fésülnöm, mert eddig csak külön külön probáltam a részegységeket, egy egész programként még nem..
(#) Gránátalma válasza Firefighter1 hozzászólására (») Feb 10, 2019 /
 
Jónak jó, de én a gombot fordítva használnám. Felhúznám tápra ellenállással, majd a gomb lenyomásával tenném le testre. Így amikor nincs használva nem lebegne.
A hozzászólás módosítva: Feb 10, 2019
(#) proba válasza Kovidivi hozzászólására (») Feb 10, 2019 /
 
A gomb állapotváltozásának figyeléséhez eleve tárolva van, így az utolsó tárolt állapot, a gomb aktuális értéke. ( hiszen ha változott volna a számláló törlődött volna. ) Ha meg akkor újra kiolvasom, már nem garantált a tárolt állapottal egyezés. Amire figyelni kell a számláló kezelés, hajlamos túlcsordulni, és újra az előírt értéket elérni.....Így viszont könnyű a hosszú és rövid gombnyomást is megkülömböztetni.
A hozzászólás módosítva: Feb 10, 2019
(#) kiborg hozzászólása Hé, 10:51 /
 
Sziasztok!
LoLin NodeMCU-t használok, amin ESP12E modul van. Ennek hivatalosan GPIO 0-16 kivezetése van. Viszont előre deklarálva van pár és alapértelmezettként csak 11 GPIO használható fel. Hogyan tudnám megoldani, hogy a maradékot is sima GPIO-ként tudjam használni Arduino keretrendszeren.
Magyarul szeretném felülírni az alapértelmezett port felhasználási módot.
Következő: »»   81 / 81
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu