Wpis z mikrobloga

Mircy z #arduino (tak wiem ze mecze) ale wrocilem ostatnio do zabawy chcac porzerzyc horyzonty i poleglem :P
Pierwszy raz chce uzyc funkcji ktora cos mi "wypluje" zeby potem uzywac tego w innej funkcji. (cos jak obejscie tego ze zmiennej lokalnej nie da sie uzywac w innej funkcji)
Mam picrel.
Podam moj tok rozumowania a ktos mi moze powie gdzie mam w nim blad bo nie ogarniam tematu/

1-w setup zadeklarowalem zmienna oczka i przypisalem jej 1 (zrobilem to tylko po to zeby kazda funkcja wiedziala ze jest zmienna o tej nazwie).

2-w loop:
2.1 jesli guik nacisniety to wykonaj mruganie (funkcja powodujaca zalacanie i wylaczanie wyjsc)
2.2 przypisz zmiennej a 1, a zmiennej b 7.
2.3 wykonaj funkcje losowanie
2.4 jesli przycisk nie jest wcisniety wyrzuc na serialmonitora wartosc "oczka"

3 funkcja losowanie (to ta funkcja z ktorej chce dostac wartosc z przedzialu 1-6 i uzywac tej wartosci w innej funkcji)
3.1 wez parametry a i b (wczesniej zdefiniowane jako odpowiednio 1 i 7)
3.2 przypisz zmiennej oczka wartosc randoma z przedzialu a b
3.3 zwroc wartosc zmiennej oczka

I to nie dziala (na dole ekranu pluje sie ze oczka nie zostaly wczesniej zadeklarowane....)

Zalozenie jest takie ze jak trzymam guzik to mrygaja se diody a jak puszcze to sie ustali jakis stan i bedzie taki dopoki znow nie nacisne (bo bedzie spelniony drugi if czyli stan LOW. Czyli nie beda mrugac bo pierwszy nie bedzie spelniony, czyli randomowa wartosc zmiennej oczka sie nie zmieni bo sie nie wykona kolejny random.

Co tu jest nie tak?
Pobierz
źródło: comment_1621611267PHmBLnynybHHEUGcMSC2JD.jpg
  • 79
Nie. Korzystać może tylko funkcja loop.

Jak chcesz globalną, zadeklaruj na samym początku, jeszcze PRZED setup()

I pamiętaj, że zmienna oczka, zadeklarowana w loop oraz zmienna oczka zadeklarowana np, w losuj, to są dwie RÓŻNE zmienne o "przypadkowo" takiej samej nazwie.


@Portier-Harry_Portier: No i super ze wreszcie zaczynam sie dowiadywac jak to dziala (chyba) :)

Czyli jak losuj zwroci mi oczka a w loop dam ze wynik=oczka to wszystkie funkcje w
@Portier-Harry_Portier: W sumie to jak mi tyle wytlumaczyles to moze jeszcze starczy Ci sil i checi na kolejne pytanie :P (jak za bardzo mecze to powiedz albo daj na czarno :P)

Ktos zasugerowal ze to moze byc wina kompilatora wiec wrocilem na oryginalny z arduino. Wyszlo picrel (czyli nie wyszlo)

Dlaczego kompilator sie pluje ze nie zdeklarowano wczesniej skoro funkcja losowanie miala "returnac" int oczka wiec dlaczego Serial.println nie potrafi uzywac
Pobierz
źródło: comment_16216732378pI8BW93eJtG1ndeiAPHrF.jpg
Wklejak kod, nie zdjęcie kodu.


@Portier-Harry_Portier: spoko tylko sie nie przeraz-wkleje caly :P na poczatku duzo linijek bo definiuje piny

int licznik1=0;
int licznik2=0;
int dq1=23;
int dq2=25;
int dq3=27;
int dq4=29;
int dq5=31;
int dq6=33;
int dq7=35;
int dq8=22;
int dq9=24;
int dq10=26;
int dq11=28;
int dq12=30;
int dq13=32;
int dq14=34;
int di1=37;
int di2=39;
int di3=41;
int di4=43;
int di5=45;
int di6=47;
int di7=49;
int di8=36;
int di9=38;
int
@gorzki99: Cały czas to samo. Oczka jest zadeklarowane lokalnie tylko w funkcji losowanie int losowanie(int a, int b)
Poza tym gdzie argumenty? losowanie; //wykonaj funkcje losowanie
Zmień

int losowanie(int a, int b) //funkcja losowanie z wczesniej zdefiniowanym int a=1, int b=7 (jeszcze przed void setup)
{
int oczka=random (a,b); //int oczka ma miec randomowa wartosc <1,6>
return oczka; // funkcja ma zwrocic int oczka o wylosowanej wartosci
}

na

void losowanie()
albo druga metoda. w

void loop()
{
int stanguzika=digitalRead(di1); //int stan guzika sprawdza stan guzika
if ((stanguzika==HIGH)) //jesli guzik wcisniety
{ mruganie(); //wykonaj funkcje mruganie (naprzemienne mruganie diod)
losowanie; //wykonaj funkcje losowanie
Serial.println(oczka); //wyswietl na porcie szeregowym co wyszlo
delay(200);
}
}

zmień na

int oczka = losowanie(a, b); //wykonaj funkcje losowanie
@Portier-Harry_Portier: wykop cos daje dupy z powiadomieniami. wiec nie widzialem co odpowiedziales. W miedzyczasie kumpel mnie naprostowal:

"Zmienna oczka jest lokalna dla funkcji losowanie.
Nie masz prawa jej tykać spoza ciała tej funkcji.
Poprawnie zwróciłeś wartość z tej funkcji (return oczka).

Natomiast w funkcji loop jeśli chcesz dostać wynik zwracany przez funkcję losowanie porostu przypisz wynik jej wywołania do zmiennej

Int zmienna = losowanie(1, 6);

Do zmienna trafi to co zostało
@gorzki99: Czyli dokładnie to, co pisałem. Nie znam symulatora, nie symuluję tylko od razu na arduino wrzucam. Nano na płytce prototypowej mi się dość dobrze sprawdza przy małych projektach, tyle że mam wszystkie potrzebne do tego zaciskarki (czyli dupont i wszystkie jst) i mogę zmajstrować każdy potrzebny kabelek.
nie symuluję tylko od razu na arduino wrzucam


@Portier-Harry_Portier: ja za "cinki w uszach" jestem zeby sie tak bawic. Wolalbym najpierw miec pewnosc ze bedzie dialac niz milion razy wgrywac na plytke niedzialajacy kod* i kombinowac "co tym razem sie odjaniepawlilo"

No ale jestem w trakcie przygotowywania sobie "warsztatu" (czytaj miejsca gdzie bedzie taka mozliwosc ze bede sie mogl bawic) wiec chyba sie skonczy tak jak piszesz (wolalbym jednak dorwac jakis
@Portier-Harry_Portier: Pewno juz spisz ale mi to nie dalo spokoju i po calym dniu "rzezbienia" sobie miejsca wreszcie mam gdzie sie bawic wiec musialem poprostu fizycznie zbudowac uklad i potestowac. Arduino ma mnie we dupie :P
Ladnie diody sobie mrugaja, ladnie na seriala leca (pseudo)losowe liczby tylko ze... caly czas. Totalna zlewka "ifa"
Czy guzik wcisniety czy nie-po wgraniu kod sie wykonuje caly czas.
zmiana if ((stanguzika==HIGH)) na LOW tez nie
@Portier-Harry_Portier: wogole :P (przez wcisniety guzik mialem na mysli podanie high na pina -kabelkiem-jak zadziala to podepne guzik)

A najlepsze ze nawet takie cos:
void loop()
{
int stanwejscia=digitalRead(di1);
if (stanwejscia=HIGH)
{digitalWrite (dq1, HIGH);}
}

powoduje ze na wyjsciu jest ccaly czas stan wysoki-dioda sie swieci-a ja nie mam nic na wejscie podpiete
Czy guzik wcisniety czy nie-po wgraniu kod sie wykonuje caly czas


@gorzki99: Nie rozumiem. jak guzik nie jest podpięty, to jak ma działać?
pinMode(licznik2,INPUT) ustawia pin jako wejście
digitalWrite (dq1, HIGH) próbujesz zapisać do wejścia. z wejścia się czyta, zapis HIGH do wejścia włącza wewnętrzny rezystor pull-up podciągając pin do zasilania, czyli robi to samo co pinMode(licznik2,INPUT_PULLUP)
Żeby to zadziałało guzik musi być podpięty do tego pinu i do masy.
@Portier-Harry_Portier: Czekaj bo teraz ja nie rozumiem :p

"pinMode(licznik2,INPUT) ustawia pin jako wejście"

dokladnie. Piny 37-48 ustawiam jako wejscia (di1 to pin 37)

Piny 23-34 jako wyjscia (dq1 to pin 23)

Pod pin 23 podpinam diode.

I teraz jesli na di1 jest wysoki (czyli zapodam na ten pin 5V) to zapodaj 5V na pin 23-zaswiec diode.

Tymczasem dioda swieci obojetnie czy na di1 mam podane 5V czy nie mam nic podane
@Portier-Harry_Portier: Chyba mam zrypana plytke-albo jestem tak glupi ze czegos nie widze.
Napisalem najprostszy kod jaki sie dalo zeby maksymalnie uproscic i pominac ze moglem cos gdzies zrypac.

void setup() {

pinMode(37, INPUT);
pinMode(23, OUTPUT);
digitalWrite(37, LOW);
}

void loop()
{
if (digitalRead(37==HIGH))
{digitalWrite(23, HIGH);}
}

I teraz najsmieszniejsze:

Jak w pogrubionej linijce mam HIGH to dioda swieci caly czas. Obojetnie cy nic nie podaje na pin 37, czy podaje 5V,