Začátečník

Noname123
Příspěvky: 6
Registrován: 13 led 2017, 18:02

Re: Začátečník

Příspěvek od Noname123 »

Tak arduino přežilo, LED svítí a pro příště se poučím. Tak díky za trpělivost.
Uživatelský avatar
jrt
Příspěvky: 1813
Registrován: 17 úno 2013, 17:13

Re: Začátečník

Příspěvek od jrt »

Na webu https://arduino.cz/ je zdarma ke stažení publikace "Průvodce světem Arduina", která dokáže začátečníkovi hodně pomoct.
jrt
jederobot.cz, hobbyrobot.cz, profirobot.cz
edurobot.cz, robodoupe.cz
Noname123
Příspěvky: 6
Registrován: 13 led 2017, 18:02

Re: Začátečník

Příspěvek od Noname123 »

Ano, tu už mám, akorát jsem chtěl něco zkusit a ...
daton
Příspěvky: 612
Registrován: 16 bře 2013, 16:12

Re: Začátečník

Příspěvek od daton »

Mám dotaz na kod který by měl vrátit průběh kodu do základní smyčky ale nějak se nedaří, V kodu jde o to že na displeji je menu, které se tlačítkem potvrdí a začne se vykonávat měření. Tak by to mělo fungovat ale nefunguje stále to skáče zpět do menu i bez stisku tlačítka a přitom by se měl kod ve smyčce opakovat dokud to tlačítko nebude stisknuté zde je důležitá část kodu prosí zkuste někdo poradit co s tím díky.

Kód: Vybrat vše

// 
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
//nastavíme adresu a typ displeje
int i=0;
int sensorU1;
int sensorU2;
int sensorU3;
int sensorU4;
int sensorU5;
float sensorI1;
float U1;
float U2;
float U3;
float U4;
float U5;
float I1;
float Umax1;
float Umax2;
float Umax3;
float Umax4;
float Umax5;
float Imax1;
int stav = 1; 
volatile int pryc = LOW;   

LiquidCrystal_I2C lcd(0x27,16,2);  // nastavení adresy (0x3F) je důležité!!!
void setup()
{
 pinMode(4,INPUT_PULLUP);
 pinMode(5,INPUT_PULLUP);
 lcd.begin();                      // initializace lcd 
 // Vypíšeme nějaké texty na jednotlivé řádky, adresace je od 0, ne od 1.
 lcd.backlight();
 lcd.setCursor ( 0, 0 );
 lcd.print("  ARDUINO meric  ");
 lcd.setCursor ( 0, 1 );
 lcd.print(" 5xU  1xI 1xrele   ");
delay (2000);
lcd.clear();
lcd.backlight();
 lcd.setCursor ( 0, 0 );
 lcd.print("  KALIBRACE  ");
 delay(650);
  lcd.setCursor ( 0, 1 );
  for (i=0; i <17; i++){
    lcd.print("X");
    lcd.setCursor(i,1);
    delay(90);} 
  
 delay(1000);

}

boolean ctiTL() {             // cteni tlacitek a posuny v menu
  int TL = 0;
  delay(500);
  do {
    if (digitalRead(4) == LOW) TL += 1;  // dalsi
    if (digitalRead(5) == LOW) TL += 2;  // enter
  } while (TL == 0);
  if (TL == 1) {
    stav ++;
    if (stav > 4) stav = 1;
   // pip(10);
  }
  if (TL == 2) {
    return true;             // byl enter na zvoleny stav
  } else {
    return false;            // nekorektni kombinace ignoruj
  }
}

void loop()
{
  lcd.clear();
  lcd.print("Vyber funkce:");
  lcd.setCursor(0, 1);
  switch (stav) {
    case 1:                  // Zmerit kapacitu
      lcd.print("Aktualni hod. U");
      if (ctiTL()) mereni();
      break;
    case 2:                  // Nabit
      lcd.print("Max. hod. U a I");
      if (ctiTL()) maxim();
      break;
    case 3:                  // Vybit
      lcd.print("Min. hod. U a I");
      if (ctiTL()) minim();
      break;
    case 4:                  // Formovat
      lcd.print("Formovat (2,5 V)");
      if (ctiTL()) formovat();
      break;
     
  } 
  
}
void mereni(){
..........
.........
delay (1000);
if (digitalRead(4)==LOW) {return;}
//if (ctiTL()) return;

// do {} while (!ctiTL());
//    return;  
}


Zakomentovaný řádek spustí smyčku a když se stiskne tlačítko vrátí se do menu ale já potřebuji a měření probíhalo dokud se to tlačítko nestiskne.
Vladimir66
Příspěvky: 353
Registrován: 02 dub 2014, 15:30

Re: Začátečník

Příspěvek od Vladimir66 »

Ahoj,
nemam ted cas to zapojit a vyzkouset u sebe na stole.
nicmene ti reknu, jak bych postupoval v odladeni:
- nez testujes tlacitko , jestli je zmacknute, vloz pred ni rutinu test tlacitka, ze je nejakou dobu ve stavu high.
- zkus si vypisovat na displej/seriovy monitor hlasky ci obsahy promenych.( nekdy zjistis, ze program bezi jinudy, nez ocekavas.)
- zakomentuj vsechno, co neni dulezite (nebo si vytvor pouze jadro funkce, ktera ti nefunguje.) a odlad pouze ten kousek kodu.
- pripadne se da zkusit pouzit/otestovat jiny vstup pro tlacitko
- podivej se na jine zdroje, jak resi tlacitka v menu a pouziji jiny algoritmus kodu.

pokud ti nebude fungovat uplne orezany kod, posli ho. -vzdy je dobre ho co nejlepe okomentovat !!
zkusim ho u sebe.


-V.
daton
Příspěvky: 612
Registrován: 16 bře 2013, 16:12

Re: Začátečník

Příspěvek od daton »

Dík za nápady některé jsem zkoušel například seriový monitor ale program jde jak má. jen to tlačítko reaguje neočekávaně. Mám základní otázku předpokládal jsem že pokud je vstup nakonfikurován takto

pinMode(4,INPUT_PULLUP);

tak že lze udělat dotaz zda je na vstupu vysoká nebo nízká hodnota tedy něco jako

if (digitalRead(4)==LOW) {return;}

tak že dojde k návratu do menu ale ono dojde k návratu hned tedy jako by byla LOW hodnota na to vstupu stále, ale měla by tam být vysoká protože tam je připnut PULLUP odpor. Pokud je tam kod

do {} while (!ctiTL()); return;

tak se to zasekne na té smyčce a a když se stiskne tlačítko tak dojde k návratu jenže já potřebuji aby kod probíhal ve smyčce hlavní nikoliv v while. Dík za jakýkoliv nápad.
Vladimir66
Příspěvky: 353
Registrován: 02 dub 2014, 15:30

Re: Začátečník

Příspěvek od Vladimir66 »

tak si myslim, ze problem je v osetreni tlacitka.
kdyz jsem tam nasazel delay(300); tak to chodi jak ma.
ty delaye jsou pred testovanim tlacitka a kdyz vyskocis z mereni,
tak znovu musis dat chvilku casu pro ustaleni zakmitu.
tu funkci mereni jsem dal do DO-WHILE, kde skoncis sepnutim tl4.
ono vstoupit do funkce a vyskocit z funkce stejnym tlacitkem vyzaduje mit dobre osetreny stavy.
spravne to chce merit ustaleny HIGH cas tlacitka. to si najdes na netu :)
mam v lonskem robotovi kod, kde je to osetreno v preruseni. kdyztak poslu vzorovy priklad.
ja pouzivam misto tlacitek optocleny a ty maji dobrou hysterezi, takze tam vetsinou zadny zakmit nehrozi.

vyzkousej tento priklad. kdyz zmacknu tlacitko tak to meri (vypis na serial monitoru).
kdyz ho znovu zmacknu, tak je konec mereni. atd.

Kód: Vybrat vše



//------------------------------
void setup() {
Serial.begin(9600);
pinMode(4,INPUT_PULLUP);

}
//-------------------------------
void loop() {
//delay (300);
if (digitalRead(4)==LOW) 
   {
    mereni(); 
   }

digitalWrite(13,LOW);  

}
//--------------------------------
void mereni(){
int count=0;  
delay(300);  // dulezity delay - aby vstupni LOW do mereni nebylo zaroven exitem mereni..
do {
count++;
Serial.println(count);
digitalWrite(13,HIGH);  
//delay(300);
  }
while (digitalRead(4)==HIGH);
delay(300);
  
}

Naposledy upravil(a) Vladimir66 dne 15 čer 2017, 01:29, celkem upraveno 1 x.
Vladimir66
Příspěvky: 353
Registrován: 02 dub 2014, 15:30

Re: Začátečník

Příspěvek od Vladimir66 »

tady posilam priklad osetreneho tlacitka na vstupu 2 (INT0)
po kazdem 5tem stisku se rozsviti LED.
tim si overis, ze tlacitko nedela zakmity.
-V66


Kód: Vybrat vše


byte sw=0;
byte interrupt0pin = 2;
int buttonState;

//------------------------------
void setup() {

pinMode(interrupt0pin, INPUT_PULLUP);
attachInterrupt(0, buttonUpdate, CHANGE); // calls buttonUpdate()  tlacitko musi byt na 2 (INT0)
//Serial.begin(9600);
}
//-------------------------------
void loop() {
//Serial.println(sw);
if (sw %5 ==0) digitalWrite(13,HIGH);
  else {digitalWrite(13,LOW);}
}
//------------------------------
void buttonUpdate(){

  buttonState = digitalRead(2);
  delay(50); // 50ms works for most switches - adjustable  

  if (buttonState) 
    {
    sw++ ;  // sw = sw + 1
    }
 }
 //------------------------------ 


Odpovědět