Hírek:

Fontos tudnivalók a migrációval kapcsolatban, kérlek olvasd el:

A régi fórumról áthozott hozzászólásoknál a felhasználó neve adatvédelmi megfontolásokból véletlenszerűen generált értékekre lett  lecserélve. Ez akkor tud a valódi értékre visszaállni, ha az adott felhasználó a régi fórumon nyilatkozik, hogy beleegyezik az adatainak az új fórumra továbbításához, majd ezután itt a régi felhasználónevével és email címével regisztrál.
8~20 óra között, 1~30 percen belül megtörténik a jóváhagyás, 30 percenként ellenőrizd email fiókodat (SPAM-ot is) mindenképp kapsz mail-t, a sikeres regisztrácioról, vagy a hibáról és, hogy mi a teendőd.
Nézd meg  "A régi fórumról, az új fórumra költözés útmutatót."
A régi fórumon használt email címmel de más felhasználói azonosítóval érkező regisztrációs kérelmek törlésre kerűlnek.

Main Menu

Segítség, béna vagyok!

Indította gaben, 2024 április 09, 15:35

Előző téma - Következő téma

dezsoe

Így van, a millis() - elozoido <= 2400 a helyes. Állapotgépről írhatok pár mondatot este, ha érdekel, csak most szaladós vagyok.

dezsoe

Egész pontosan: millis() - elozoido > 2400 a helyes, bocs.

svejk

Írjál csak, figyelünk! :)

dezsoe

Az állapotgép lényege, hogy úgy lehet vele egy vagy több folyamatot vezérelni, hogy a vezérlést végző szerkezetet nem fogjuk meg. Magyarul: egy műveletsor végrehajtása nem köti le a vezérlő eszközt. Azért írok vezérlő eszközt, mert nem csak processzor lehet az áldozat, láttam már teljesen mechanikus állapotgépet is. Mivel az állapotgép nem sajátítja ki a vezérlőt, akár több állapotgép is futhat működése szempontjából párhuzamosan. Ténylegesen azért ezek egymás után fognak lefutni, de kívülről nézve párhuzamosnak tűnik a működésük. Vegyük példának az eredeti kérdést: "ha egy gomb high állapotú, akkor pl egy piros ledet villogtat, ha low, akkor egy zöldet. A villogás a lednél: 2300ms high, 100ms low állapotú." Ehhez be kell olvasni a gombot és tudnunk kell, hogy a LED-eknek mi az állapota. Lehet egyszerűbben is csinálni, de szemléltetésképpen legyen két állapotgépünk, egy a LED-eknek, egy a gombnak, ajándék 10ms-os prellmentesítéssel:

LED:
(0) nem történik semmi

(1) piros kikapcsolása, -> (2)
(2) zöld villogás indítása, zöld idő tárolása, zöld bekapcsolása, -> (3)
(3) eltelt-e 2300ms? ha igen, zöld idő tárolása, zöld kikapcsolása, -> (4)
(4) eltelt-e 100ms? ha igen -> (2)

(5) zöld kikapcsolása, -> (6)
(6) piros villogás indítása, piros idő tárolása, piros bekapcsolása, -> (7)
(7) eltelt-e 2300ms? ha igen, piros idő tárolása, piros kikapcsolása, -> (8)
(8) eltelt-e 100ms? ha igen -> (6)

gomb:
(0) LED állapotba (1)
(1) gomb megnyomva? ha igen, gomb idő tárolása, -> (2)
(2) gomb megnyomva? nem -> (1), egyébként eltelt-e 10ms? ha igen -> (3)
(3) LED állapotba (5), -> (4)
(4) gomb megnyomva? nem -> (5)
(5) LED állapotba (1),-> (1)

A program főciklusában ezt a két állapotgépet hívogatjuk egymás után. (Meg amit még amúgy is csinálni kell, de az most itt nem lényeges.) Az állapotgépek állapotváltozását -> (állapot)-tal jelöltem. Ha nincs ilyen vagy nem teljesül a feltétele, akkor az adott állapot marad, ahogy volt. Mindkét állapotgép (0)-ból indul. A LED 1-4 állapota a zöld villogtatását végzi, az 5-8 a pirosét. A gomb (0)-ban bekapcsolja a zöld villogást, majd elkezdi figyelni a gomb állapotát az (1)-ben. Ha a gombot megnyomjuk, akkor a megnyomás idejét eltárolva (2)-be lép, ahol a prellmentesítés történik. Ha elengedtük a gombot (vagy prellez), akkor visszalép (1)-be. Ha még mindig meg van nyomva és eltelt 10ms, akkor megnyomottnak tekinti a gombot és átlép (3)-ba. Itt a LED állapotát pirosra váltja, de csak egyszer, mert már megy is tovább a (4)-esre, ahol addig marad, amíg a gombot nyomva tartjuk. Ha már nincs megnyomva, akkor továbbugrik (5)-re, ahol a LED állapotot visszaváltjuk zöldre, majd irány az (1) és várjuk az újabb gombnyomást.

svejk

Köszi.

Végül is nagy vonalakban akkor ez egy sorrendi hálüózat.

dezsoe


dezsoe

Hopp, csak sikerült elrontani. Javítás:

gomb:
(0) LED állapotba (1), -> (1)

dezsoe

No, akkor mégegyszer a gomb állapotai, mert az (5)-ös felesleges:

gomb:
(0) LED állapotba (1), -> (1)
(1) gomb megnyomva? ha igen, gomb idő tárolása, -> (2)
(2) gomb megnyomva? nem -> (1), egyébként eltelt-e 10ms? ha igen -> (3)
(3) LED állapotba (5), -> (4)
(4) gomb megnyomva? nem -> (0)

Így néz ki a forrása:


#include <Arduino.h>

#define redLED 13
#define greenLED 12
#define button 11

uint8_t LEDstate = 0;
uint8_t Btnstate = 0;

void LEDmachine()
{
    static unsigned long lastmillis;
    unsigned long currmillis = millis();

    switch (LEDstate)
    {
        case 1:
            digitalWrite(redLED, LOW);
            LEDstate = 2;
            break;
        case 2:
            lastmillis = currmillis;
            digitalWrite(greenLED, HIGH);
            LEDstate = 3;
            break;
        case 3:
            if (currmillis - lastmillis > 2300)
            {
                lastmillis = currmillis;
                digitalWrite(greenLED, LOW);
                LEDstate = 4;
            }
            break;
        case 4:
            if (currmillis - lastmillis > 100)
                LEDstate = 2;
            break;
        case 5:
            digitalWrite(greenLED, LOW);
            LEDstate = 6;
            break;
        case 6:
            lastmillis = currmillis;
            digitalWrite(redLED, HIGH);
            LEDstate = 7;
            break;
        case 7:
            if (currmillis - lastmillis > 2300)
            {
                lastmillis = currmillis;
                digitalWrite(redLED, LOW);
                LEDstate = 8;
            }
            break;
        case 8:
            if (currmillis - lastmillis > 100)
                LEDstate = 5;
            break;
    }
}

void Btnmachine()
{
    static unsigned long lastmillis;
    unsigned long currmillis = millis();
    bool buttonpressed = !digitalRead(button); // negaltam, mert pull-up-os a gomb

    switch (Btnstate)
    {
        case 0:
            LEDstate = 1;
            Btnstate = 1;
            break;
        case 1:
            if (buttonpressed)
            {
                lastmillis = currmillis;
                Btnstate = 2;
            }
            break;
        case 2:
            if (!buttonpressed)
                Btnstate = 1;
            else if (currmillis - lastmillis > 10)
                Btnstate = 3;
            break;
        case 3:
            LEDstate = 5;
            Btnstate = 4;
            break;
        case 4:
            if (!buttonpressed)
                Btnstate = 0;
            break;
    }
}

void setup()
{
    pinMode(redLED, OUTPUT);
    digitalWrite(redLED, LOW);
    pinMode(greenLED, OUTPUT);
    digitalWrite(greenLED, LOW);
    pinMode(button, INPUT_PULLUP);
}

void loop()
{
    LEDmachine();
    Btnmachine();
    //
    // ... minden mas, ami kell
    //
}

gaspa

Túlléptem a kesergésen,próbálom átalakítani a betáplálást hibridre(most a napenergia töredéke hasznosul).A hibridnél a bejövő hálózat szét van választva a kimenettől(kép),a két nulla alapesetben nincs összekötve és a kimenet nullája sincs a földdel.Régebbről van egy vészhelyzeti rendszerem,ami csak hálózat kimaradáskor kapcsolódott egy fázisra,ezen csináltam pár mérést.Ha van hálózat összeköti a nullákat és szépen elosztja a terhelést a napelem-akku-hálózat sorrendben folyamatos átmenettel.Ha hálózat nincs nem köti össze a nullákat és az inverter nulláját a földdel.Azt még nem néztem mi van,ha csak napelem és hálózat van,de elegendő a napelem.Ez bonyolódik azzal,hogy 3 fázisra külön inverterrel és egy akkuval szeretném.Az akku töltésnél is akadhat probléma,de talán diódákkal szét lehet választani.

  

kuner

Köszönöm!
Ezen még át kell rágnom magam, mit, miért, hogyan... mi mit csinál,melyik programrészlet hogyan kapcsolódik mihez ...

Ez még új nekem, de sosem keső elkezdeni [#rolleyes]

kuner

Ezzel szenvedek hajnal óta ...

7 csatornás impulzus kapcsoló, tiltó bemenettel, led visszajelzéssel.

Ha az A0 bemenetet testre húzom, minden kimenetnek LOW szinten kell lennie, amig A0 testen van (tiltás). Normál állapotban zöld led villog, tiltás alatt pedig a piros. Ez lenne az elképzelés. De ha A0 testre kerül, kimenetek LOW állapotba kerülnek - ami jó is- de a ledek nem villognak addig.
Sorrend nem jó, vagy a while parancs ?



#include <Arduino.h>

#define redLED 12
#define greenLED 13

uint8_t LEDstate = 0;
uint8_t Btnstate = 0;


#define BUTTON1 A1         // nyomógomb #1
#define BUTTON2 A2         // nyomógomb #2
#define BUTTON3 A3         // nyomógomb #3
#define BUTTON4 A4         // nyomógomb #4
#define BUTTON5 A5         // nyomógomb #5
#define BUTTON6 10         // nyomógomb #6
#define BUTTON7 9         // nyomógomb #7
#define BUTTON8 A0         // nyomógomb #8
 
#define RELAY1 8         // Relé #1 vezérlés
#define RELAY2 7         // Relé #2 vezérlés
#define RELAY3 6         // Relé #3 vezérlés
#define RELAY4 5         // Relé #4 vezérlés
#define RELAY5 4         // Relé #5 vezérlés
#define RELAY6 3         // Relé #6 vezérlés
#define RELAY7 2         // Relé #7 vezérlés
 

 int val1=0;                                                
 int old_val1=0;          
 
 int val2=0;                                                      
 int old_val2=0;          

int val3=0;                                                          
 int old_val3=0;          

int val4=0;                                                          
 int old_val4=0;          

int val5=0;                                                        
 int old_val5=0;          

int val6=0;                                                          
 int old_val6=0;          

int val7=0;                                                          
 int old_val7=0;    

 int val8=0;                                                          
 int old_val8=0;      
                               
             
 int state1=1;            
 int state2=1;  
 int state3=1;  
 int state4=1;  
 int state5=1;  
 int state6=1;  
 int state7=1;

void LEDmachine()
{
    static unsigned long lastmillis;
    unsigned long currmillis = millis();

    switch (LEDstate)
    {
        case 1:
            digitalWrite(redLED, LOW);
            LEDstate = 2;
            break;
        case 2:
            lastmillis = currmillis;
            digitalWrite(greenLED, HIGH);
            LEDstate = 3;
            break;
        case 3:
            if (currmillis - lastmillis > 100)
            {
                lastmillis = currmillis;
                digitalWrite(greenLED, LOW);
                LEDstate = 4;
            }
            break;
        case 4:
            if (currmillis - lastmillis > 2300)
                LEDstate = 2;
            break;
        case 5:
            digitalWrite(greenLED, LOW);
            LEDstate = 6;
            break;
        case 6:
            lastmillis = currmillis;
            digitalWrite(redLED, HIGH);
            LEDstate = 7;
            break;
        case 7:
            if (currmillis - lastmillis > 1000)
            {
                lastmillis = currmillis;
                digitalWrite(redLED, LOW);
                LEDstate = 8;
            }
            break;
        case 8:
            if (currmillis - lastmillis > 1000)
                LEDstate = 5;
            break;
    }
}

void Btnmachine()
{
    static unsigned long lastmillis;
    unsigned long currmillis = millis();
    bool buttonpressed = !digitalRead(BUTTON8);

    switch (Btnstate)
    {
        case 0:
            LEDstate = 1;
            Btnstate = 1;
            break;
        case 1:
            if (buttonpressed)
            {
                lastmillis = currmillis;
                Btnstate = 2;
            }
            break;
        case 2:
            if (!buttonpressed)
                Btnstate = 1;
            else if (currmillis - lastmillis > 10)
                Btnstate = 3;
            break;
        case 3:
            LEDstate = 5;
            Btnstate = 4;
            break;
        case 4:
            if (!buttonpressed)
                Btnstate = 0;
            break;
    }
}

 
void setup(){

pinMode(redLED, OUTPUT);      
digitalWrite(redLED, LOW);
pinMode(greenLED, OUTPUT);  
digitalWrite(greenLED, LOW);
pinMode(BUTTON8, INPUT);    


 pinMode(BUTTON1, INPUT);    
 pinMode(RELAY1, OUTPUT);    
 
 pinMode(BUTTON2, INPUT);    
 pinMode(RELAY2, OUTPUT);    

 pinMode(BUTTON3, INPUT);    
 pinMode(RELAY3, OUTPUT);    

 pinMode(BUTTON4, INPUT);    
 pinMode(RELAY4, OUTPUT);    

 pinMode(BUTTON5, INPUT);    
 pinMode(RELAY5, OUTPUT);    

 pinMode(BUTTON6, INPUT);    
 pinMode(RELAY6, OUTPUT);    

 pinMode(BUTTON7, INPUT);    
 pinMode(RELAY7, OUTPUT);    
}
 
void loop(){

LEDmachine();
Btnmachine();

 val1=digitalRead(BUTTON1);    
 val2=digitalRead(BUTTON2);    
 val3=digitalRead(BUTTON3);    
 val4=digitalRead(BUTTON4);    
 val5=digitalRead(BUTTON5);  
 val6=digitalRead(BUTTON6);  
 val7=digitalRead(BUTTON7);    
 val8=digitalRead(BUTTON8);


if ((val1==HIGH) && (old_val1==LOW))
 {
   state1 = 1 - state1;
   delay(300);
 }
 
 old_val1=val1;      
 
if ((val2==HIGH) && (old_val2==LOW))
 {
   state2 = 1 - state2;
   delay(300);
 }
 old_val2=val2;    

 if ((val3==HIGH) && (old_val3==LOW))
 {
   state3 = 1 - state3;
   delay(300);
 }
 old_val3=val3;

   if ((val4==HIGH) && (old_val4==LOW))
 {
   state4 = 1 - state4;
   delay(300);
 }
 old_val4=val4;

if ((val5==HIGH) && (old_val5==LOW))
 {
   state5 = 1 - state5;
   delay(300);
 }
 old_val5=val5;

if ((val6==HIGH) && (old_val6==LOW))
 {
   state6 = 1 - state6;
   delay(300);
 }
 old_val6=val6;

if ((val7==HIGH) && (old_val7==LOW))
 {
   state7 = 1 - state7;
   delay(300);
 }
 old_val7=val7;
 
 
 if (state1 == 1){
  digitalWrite(RELAY1,HIGH);    
 }else{
  digitalWrite(RELAY1,LOW);      
 }
 
 if (state2 == 1){      
  digitalWrite(RELAY2,HIGH);      
 }else{      
  digitalWrite(RELAY2,LOW);      
 }

if (state3 == 1){    
  digitalWrite(RELAY3,HIGH);      
 }else{        
  digitalWrite(RELAY3,LOW);      
 }

if (state4 == 1){      
  digitalWrite(RELAY4,HIGH);      
 }else{        
  digitalWrite(RELAY4,LOW);      
 }

if (state5 == 1){  
  digitalWrite(RELAY5,HIGH);      
 }else{        
  digitalWrite(RELAY5,LOW);      
 }

if (state6 == 1){    
  digitalWrite(RELAY6,HIGH);      
 }else{      
  digitalWrite(RELAY6,LOW);      
 }

if (state7 == 1){    
  digitalWrite(RELAY7,HIGH);      
 }else{        
  digitalWrite(RELAY7,LOW);      
 }

 while (digitalRead(BUTTON8) == 0)
        {
         digitalWrite(RELAY1,LOW);
         digitalWrite(RELAY2,LOW);
         digitalWrite(RELAY3,LOW);
         digitalWrite(RELAY4,LOW);
         digitalWrite(RELAY5,LOW);
         digitalWrite(RELAY6,LOW);
         digitalWrite(RELAY7,LOW);
   }  
}

2f428kduf

Tanácsot kérek. Van egy Ender3-as nyomtatóm, kissebb távtartókat, Nyomtatott kártyák tartóit nyomtattam vele. Ezek kicsik voltak, jók lettek, bár a méret nem mindíg passzolt, de a max. 0.5 mm nem számított. Most egy 60x80x8mm-es darabot, benne D50-es üreg a kondenzátor számára. A rögzítés számára egyik oldalon 5x10 mm-es fülekkel a rögzítés számára. A bajom: valószínü a hőtágolás miatt a 4 sarka kissé felgörbült, így az a rész vékonyabb lett. Még éppen használható lett. Amikor kettőt akartam egymás mellett, nagyon felgörbült, leállítottam. Amikor csak egy darabot, türhető lett. Mit tegyek, ne engedje el, ha nagyobb darabot akarok??? A tranácsokat  köszönöm.

dezsoe

A while. Teljesen megfogod vele a főciklust. Azok a delay(300)-ak mi célt szolgálnak?

kuner

Csengőkapcsolók lesznek a nyomógombok helyén, egyelőre kicsit nagyra hagytam a késleltetést, teszt és programozás idejére. Csökkenteni fogom, ha már minden összeállt.


Akkor a while hasonlóan működik, mint a delay?

dezsoe

Igen. Ha az A0 aktív és tiltod a kimeneteket, mi történik, amikor inaktívvá válik? Visszaállnak az előző állapotba vagy maradnak kikapcsolva? Ja, és a relék addig aktívak, amíg a gombjukat nyomod vagy ki-bekapcsolhatóak? Kicsit írj már arról, hogy mit is kéne a programnak csinálni.