Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino - tutorijali, pitanja, primjeri i projekti
Makso,

jedno pitanje. Da li je zelis da umesto ovog tvog programa napravim rad pomocu sekvence Prvi radi 60min + 10min pauza, pa onda drugi radi 60min + 10min pauza i tako u krug (ista prica i za drugi i treci) ili nesto drugo? Ne razumem tacno kako treba da radi i ako se nastavlja na tvoj program, gde da ga nastavim.
Reply
Da trebalo bi mi tako za jedan dio programa koji će biti neovisan od onoga što sam već postavio, a u tome dijelu koda što sam postavio trebalo bi mi samo po 10 sekundi za onaj delay što sam ja pisao.
Reply
Makso,

ne nisi mi dobro rekao. Razumem skroz tu pricu oko sekvence za koju sam te pitao. Tvoj program koji si postavio u prilogu, radi na sledeci naci:
1. Ako je pritisnut taster START/STOP i ako je dobijen uslov motora 1 => ukljuci motor1
2. Pauza od xxx vremenskih jedinica
3. Ako je dobijen uslov motora 2 => ukljuci motor 2
4. Pauza od xxx vremenskih jedinica
5. Ako je dobijen uslov motora 3 => ukljuci motor 3
6. Pauza od xxx vremenskih jedinica
7. Ako je dobijen uslov motora 4 => ukljuci motor 4
8. Pauza od xxx vremenskih jedinica
Ovim algoritmom su motori samo ukljuceni sa vremenskim zatezanjem od po xxx vremenskih jedinica. Iskljuciju se samo ako nije aktivan START/STOP ili ako nema uslova nekog od motora. Da li ovako treba da radi program? Tako je napisan. Gde tacno treba da se nadoveze onda ona sekvenca i kada se zavrsava?
Reply
Da taj program tako treba da radi i on se ne završava, treba stalno da provjerava da li su uslovi ispunjeni.
A ta sekvenca sa radom od 60 minuta i pauzom od 10 minuta nema veze sa ovim gore uslovima, nego samo da posebna dva izlaza pali nasumično svakih 60 minuta sa pauzama od 10 minuta kada nijedan od ta dva izlaza nije aktivan.
Reply
Nemoj da ispadam dosadan, ali neke stvari mi nisu jasne, pa moram da ih razjasnim, posto hocu i gornji program da ti napisem kako treba.
Kada se ukljuci prvi motor, drugi motor se ukljucuje tek posle xxx vremenskih jedinica. Da su ta vremenska zatezanja, samo da bi se napravila zadrska da se ukljucuje jedan po jedan, a ne svi odjednom? To je sve.
Reply
Da tako je upravu si, samo vremensko zatezanje palenja motora, jer ne smiju se paliti odjednom svi, za taj dio programa samo treba da bude vremensko zatezanje od 10 sekundi između palenja motora i to je to.

A ovo što mi treba za 60 minuta i 10 minuta nema nikakve veze sa uslovima motora, ali baš nikakve, motori imaju samo to vremensko zatezanje i ništa više, i oni rade dok su njihovi uslovi ispunjeni što sam ja odradio u kodu.
Za ovih 60 + 10 minuta, imaću posebna dva izlaza koji će se paliti nasumično kombinacijom ta dva vremena (60 i 10 minuta), i ta dva izlaza će imati svoj posebni jedan taster za aktivaciju odbrojavanja, a motori će posebno raditi sa svojim uslovima, znači to treba da bude nezavisno jedno od drugog.
Ako me sad razumiješ, ako ne da ti nekako to ispišem u kodu da lakše razumiješ?

Izvini što nisam ranije odgovorio, stalno sam na terenu pa ne stignem.
Reply
Makso, evo programa:
Code:
#define    START    1
#define    STOP    0

// ***** Definisanje korisnickih promenljivih *****
unsigned int    Sec_Counter = 0;
unsigned char    Sequence = 0;
// ***** Definisanje korisnickih flagova *****
         bool    KB_Start_Stop_Old = false;                    // Flag za izvlacenje ivice tastera
volatile bool    Current_State = STOP;                        // Trenutno stanje masine

ISR(TCC1_OVF_vect)
{    
    // TMR1 Reload na 1s
    TCNT1H = 0xC2;                
    TCNT1L = 0xF7;
    
    if(Current_State == START)
    {    Sec_Counter++;                                        // Inkrement brojaca na svaku sekundu
        switch(Sequence)
        {    case    0    :    Izlaz1 = true;                    // Ukljuci izlaz
                            if(Sec_Counter >= 3600)            // Da li je proslo 60min
                            {    Sec_Counter = 0;
                                Izlaz1 = false;                // Iskljuci izlaz
                                Sequece = 1;
                            }            
                            break;
            case    1    :    if(Sec_Counter >= 600)            // Da li je proslo 10 min
                            {    Sec_Counter = 0;
                                Izlaz2 = true;                // Ukljuci drugi izlaz
                                Sequence = 2;    
                            }            
                            break;
            case    2    :    if(Sec_Counter >= 3600)            // Da li je proslo 60min
                            {    Sec_Counter = 0;
                                Izlaz2 = false;                // Iskljuci izlaz
                                Sequece = 3;
                            }        
                            break;
            case    3    :    if(Sec_Counter >= 600)            // Da li je proslo 10 min
                            {    Sec_Counter = 0;
                                Izlaz2 = false;                // Ukljuci drugi izlaz
                                Izlaz1 = true;
                                Sequence = 0;    
                            }            
                            break;                
            case     default:Sequence = 0;
                            break;
        }        
    }    
    else
    {    Sec_Counter = 0;
        Sequence = 0;
    }
}

// ***** Inicijalizacija TMR1 *****
void TMR1_Init(void)
{    TCCR1A = 0b00000000;
    TCCR1B = 0b00000101;                                    // Prescaler deli ucestanost sa 1024
    TIMSK1 = 0x01;                                            // Timer 1 overflow interrupt
    TCNT1H = 0xC2;                                            // Interrupt on every 1s
    TCNT1L = 0xF7;
    SREG |= 0x80;                                            // Globalna dozvola interapta
}
void main(void)
{    TMR1_Init();
    while(1)
    {    // Ukljucivanje uredjaja i iskljucivanje uredjaja
        if(KB_Start_Stop && !KB_Start_Stop_Old)
        {    if(Current_State == STOP))                        // Ukljucivanje
            {    Current_State = START;}
            else                                            // Iskljucivanje
            {    Current_State = STOP;}                        // Iskljucivanje
        }
        KB_Start_Stop_Old = KB_Start_Stop;
        
        // Ispitivanje uslova motora
        if(Current_State == STOP)                            
        {    motor1 = false;                                    // Ako je masina u STOP modu, iskljuci motor1
            motor2 = false;                                    // Ako je masina u STOP modu, iskljuci motor2
            motor3 = false;                                    // Ako je masina u STOP modu, iskljuci motor3
            motor4 = false;                                    // Ako je masina u STOP modu, iskljuci motor4
        }
    }    
}

Pozdrav
Reply
Hvala za pomoć, sad to moram za arduino prepraviti.
Reply
Opet ja sa svojim idejama... Smile

Sličan je prethodnom kodu za koji sam tražio pomoć, našao sam neki kod koji broji preko millis-a, i to je sve radilo dok nisam upisao if uslov i više se ništa ne dešava?

Code:
int ventilator = 12;

const int vrijeme1 = 6;
const int vrijeme2 = 7;

int vrijeme1State = LOW;
int vrijeme2State = LOW;

unsigned long time_since_last_reset = 0;
int interval1 = 1000;
int interval2 = 3000;
int interval3 = 3000;
int interval4 = 5000;

void setup() {
pinMode(vrijeme1, INPUT);
pinMode(vrijeme2, INPUT);
pinMode(ventilator, OUTPUT);
delay(150);
}

void loop() {
 time_since_last_reset = millis();
 vrijeme1State = digitalRead(vrijeme1);
 if (vrijeme1 == HIGH){
time_since_last_reset = millis();
while((millis() - time_since_last_reset) < interval1){
 digitalWrite(ventilator, HIGH);
}
time_since_last_reset = millis();
while((millis() - time_since_last_reset) < interval2){
 digitalWrite(ventilator, LOW);
}
}
vrijeme2State = digitalRead(vrijeme2);
 if (vrijeme2 == HIGH){
time_since_last_reset = millis();
while((millis() - time_since_last_reset) < interval3){
 digitalWrite(ventilator, HIGH);
}
time_since_last_reset = millis();
while((millis() - time_since_last_reset) < interval4){
 digitalWrite(ventilator, LOW);
 }
 }
}
Reply
Makso,
tvoje surfovanje i skidanje tudjih programa ne vodi nikuda. Moras da imas osnove razumevanja rada kontrolera i njegovog izvrsavanja programa. Drugacije ces uvek biti u rekurziji i neces nista uspeti da uradis.
Mislim da preko foruma treba da se nauce neke stvari, a ne otklanjanje tudjih gresaka, sto je mnogo tezi posao.
Reply
Iako je Vojin rizikovao da ispadne "malo grub" svaka mu je na mestu.
Savet je i više nego prijateljski.

Pozz
Reply
@vojinilic
Potpuno te razumijem, problem mi i jeste što ne znam i nemam nikakvog iskustva sa ovim načinom programiranja, ali eto nešto pokušavam, možda razumijem kako kontroler radi ali, samo kad nešto promašim u kodu ili ne napišem pravilno i onda ne znam šta gdje sam pogriješio, malo sam programirao i PLC kontrolere i to mi je opet nekako daleko jednostavnije programirati, i onda imam velike muke sa Arduinom. Onda gledam tuđe kodove pa modifikujem jer ne bih znao sve iznova napisati.

Ali, upsjeo sam i naći grešku šta sam uradio u modifikaciji koda, umjesto if uslova za taster sam zamjenio sa while(digitalRead(vrijeme1) == HIGH){, i sada radi kako sam zamislio.
Reply
Ugradio sam Arduino u jedan ormar u kojem su energetske sklopke i ostala automatika, imam Arduino na posebnoj ploči sa svojim napajanjem i nekoliko relea koji propuštaju 220V za sklopke, tu su još prekidači koji se nalaze na vratima ormara i na njih sam propustio +5V i vežu se na ulaze Arduina, za povezivanje sam koristio dvožilni kabal sa širmom (shield ili kako se već zove), taj širm sam uvezao od svih prekidača zajedno i povezao na GND napajanja od Arduina.

Problem je sledeći, Arduino odradi isti proces nekoliko puta u krug i onda se jednostavno zablokira i moram ga restartovat i opet tako?

Da li sam dobro povezao širmove od kablova ili imam neke druge smetnje, ili treba uraditi uzemljenje?
Reply
(01-12-2017, 06:58 PM)Makso Wrote: Ugradio sam Arduino u jedan ormar u kojem su energetske sklopke i ostala automatika, imam Arduino na posebnoj ploči sa svojim napajanjem i nekoliko relea koji propuštaju 220V za sklopke, tu su još prekidači koji se nalaze na vratima ormara i na njih sam propustio +5V i vežu se na ulaze Arduina, za povezivanje sam koristio dvožilni kabal sa širmom (shield ili kako se već zove), taj širm sam uvezao od svih prekidača zajedno i povezao na GND napajanja od Arduina.

Problem je sledeći, Arduino odradi isti proces nekoliko puta u krug i onda se jednostavno zablokira i moram ga restartovat i opet tako?

Da li sam dobro povezao širmove od kablova ili imam neke druge smetnje, ili treba uraditi uzemljenje?
Ha stari problem. Moras sve galvanski da ovojis, opto kalplere i odvojeno napajanje. macola je pisao o tome
Novac je sredstvo a ne cilj.
Reply
Jedan od mogucih uzroka je propadanje napona napajanja, pa se zbog toga mcu ubije - programski brojac pokazuje na nepostojecu lokaciju. Probaj da ukljucis BOD i POR na MCU.
Reply
Koristim neki kineski smps adapter 1A 12V, sa njim napajam releje koji rade na 12V i preko stabilizatora ide 5V na Arduino i uslovne prekidače.?

Edit:
Ploča na kojoj su relei je slična kao gotovi relej moduli što se prodaju, samo sam koristio tranzistore bez optokaplera i vezao na špulu relea.
Reply
Ovo je moj prvi susret sa ARDUINOM,
pokrenuo sam 

arduino-1.8.1 i cisto radi probe uzeo primer test

void setup() {
Serial.begin(9600);
}


void loop() {
Serial.println(" test ");
delay(1000);

}

kad kliknem na Verify

sve prodje OK i dobijam poruku Done compiling i nema nekih greski.

E sad me interesuje ovo:

posto arduino uno treba da stigne za neki dan hteo bih probati nesto sa modelom ARDUINO UNO u proteusu.Da bih probao naravno treba da u model ubacim HEX file od probnog KODA. Uz sve napore HEX file ovoga KODA gore ne mogu da pronadjem.
Gde je taj FILE jer kompajliranje je proslo bez greske?
Reply
Ukljucis ovu opciju i pokazace ti gde se smestaju prevedeni fajlovi:


Attached Files Thumbnail(s)

Reply
Ovde na snimku je sve lepo objasnjeno gde se nalazi HEX. file Smile


https://www.youtube.com/watch?v=WYkTHvtrnLk
Reply
Hvala za pomoc, ali izgleda da ja imam neki problem koji ne kapiram.

Juce je stigao ARDUINO UNO 16u2 (imao sam problem oko drajvera stariji drajver i ima ga u old drivers to je reseno)

test KOD

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.println(" test ");
delay(1000);
}

URADIM upload na ARDUINO UNO i sve je OK

program radi (pratim kroz serial monitor)

E sad kad odem u folder gde je sacuvan ovaj probni KOD  Documents/Arduino/proba2
tu ima samo  proba2 INO File

opet nema HEX FILE valjda treba da budu dva standard i BOOT 
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)