Začátečník
Re: Začátečník
Tak arduino přežilo, LED svítí a pro příště se poučím. Tak díky za trpělivost.
Re: Začátečník
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
Re: Začátečník
Ano, tu už mám, akorát jsem chtěl něco zkusit a ...
Re: Začátečník
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.
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.
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.
-
- Příspěvky: 385
- Registrován: 02 dub 2014, 15:30
Re: Začátečník
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.
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.
Re: Začátečník
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.
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.
-
- Příspěvky: 385
- Registrován: 02 dub 2014, 15:30
Re: Začátečník
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.
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.
-
- Příspěvky: 385
- Registrován: 02 dub 2014, 15:30
Re: Začátečník
tady posilam priklad osetreneho tlacitka na vstupu 2 (INT0)
po kazdem 5tem stisku se rozsviti LED.
tim si overis, ze tlacitko nedela zakmity.
-V66
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
}
}
//------------------------------