Arduino Polska Forum

Pełna wersja: Jak zmusić uC do oczekiwania na argument (przycisk)
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3 4
Plan jest taki aby przez drabinkę rezystorową z podpiętymi przyciskami sterować wyjściami analogowymi kilkoma po kolei. W kwestii wyjaśnienia: drabinka rezystorową zmapowana zamiast potencjometru i zależności od wciśniętego przycisku program zadaje odpowiednie wypełnienie na kolejne wyjścia pwm.

Ktoś ma jakiś pomysł? 
Nie mam pomysłu jak zmusić program do oczekiwania na wciśnięcie przycisku. Jedyne co przychodzi mi do głowy to delay po poleceniu wciśnij przycisk na LCD i konieczność trzymania go do momentu zakończenia "delay" oraz następny delay aby nie przetrzymać i nie zaprogramować kolejnego wyjścia niechcący.

Chyba że zatrzymać pustą pętlą i zastosować przerwanie przez wciśnięcie przycisku.
Hm, nie za bardzo wyobrażam sobie co chcesz zrobić. Może jakiś schemacik blokowy chociaż, aby można było do czegoś się odnieść, zapytać.
Przecież to prosto jak budowa cepa.. Chcę odczytywać ADC I podzielić zakresy. Każdy zakres to inne wypełnienie PWM nawet nie trzeba funkcji mapowania... Odpowiednie flagi i bez przerwań może się odbyć...
Jarewa muszę zaznaczyć że jestem zielony i dlatego zadaje takie kuriozalne pytania. Chcę 1 klawiaturę wykorzystać do wysterowania wyjść w kolejnych kilku transoptorach podłączanych do wyjść adc w uC i wiedząc że program leci w kółko pragnę go zmusić do zapytania mnie jaka wartość chce mieć na 1 wyjściu i zaczekania aż wcisnę przycisk. To samo na następnych kilku wyjściach. Nie chcę robić sobie gry na czas czy zdążę zanim przeskoczy na następne wyjscie. Nie mogę znaleźć przykładu takiego kodu nawet na zapalenie diody dlatego pytam o pomysł.
Czyli "naduszasz" jakiś przycisk i program wchodzi w tryb ustawiania. Dalej "naduszsz" przycisk i program ustawia na pierwszym wyjściu PWM wartość odpowiadającą temu przyciskowi. Program następnie przechodzi do ustawienia kolejnego PWMa. Po drodze można jeszcze dać przycisk OK.
Najlepiej zrobić to tak.:
Naciskasz przycisk programowanie, wybierasz który PWM chcesz ustawić (przyciski od 1 do n) naciskasz OK. Teraz program pyta się jaką wartość chcesz "zapodać", naciskasz przycisk program pyta się czy taką chcesz jak się nie pomyliłeś to wciskasz OK jak paluszek nie trafił w odpowiedni klawisz to poprawiasz "zapodanie" naciskając inny przycisk. Jak już masz odpowiednią wartość naciskasz OK.
Do tego potrzebny jeszcze wyświetlacz abyś wiedział co się dzieje i gdzie jesteś w labiryncie programowania.
To wszystko da się zrobić bez delay, przerwań i nie trzeba się spieszyć, aby zdążyć. Program poczeka na Ciebie i całe wieki, chyba że dasz jakieś wytyczne po jakim czasie ma wyjść z trybu programowania, po ostatnim naciśnięciu klawiatury, oczywiście bez zapisywania ustawień.
Zapodaj jakiś schemacik to pomyślę jak będę miał czas i coś podpowiem. Jaka klawiatura, z iloma przyciskami.
poniżej coś na początek:
Kod:
// przykładowe przypisanie pinów 
#define PWM1 5 //nie analizowałem czy na tych pinach działa PWM
#define PWM2 6 //nie analizowałem czy na tych pinach działa PWM
#define PWM3 7 //nie analizowałem czy na tych pinach działa PWM
#define PWM4 8 //nie analizowałem czy na tych pinach działa PWM
#define PWM5 9 //nie analizowałem czy na tych pinach działa PWM

byte programowanie = 0;
byte pwm1 = 0;
byte pwm2 = 0;
byte pwm3 = 0;
byte pwm4 = 0;
byte pwm5 = 0;

void setup()
{
  pinMode(4, INPUT_PULLUP);

}

void loop()
{
  // tu leci sobie program
  analogWrite(PWM1, pwm1);
  analogWrite(PWM2, pwm2);
  analogWrite(PWM3, pwm3);
  analogWrite(PWM4, pwm4);
  analogWrite(PWM5, pwm5);

  if (digitalRead(4) == LOW) // naciskasz przycisk programowanie
  {
    programowanie = 1; // zmieniasz stan flagi programowanie na 1
  }
  if (programowanie == 1) // tu program sprawdza czy chcesz programować
  {
    // tu cała procedura programowania pewuemów

    if (cos tam)
    {
      programowanie = 0; // program wychodzi z programowania
    }
  }
}
Ja jeszcze tylko dopiszę, że jak wchodzisz w jakieś menu (a do tego sprowadza się wybór i zmiana opcji) to wcale nie oznacza, że program ma stać w części programu menu i czekać na jakiś przycisk. Program ma po kolei realizować zadania w loop i dochodząc do funkcji "menu" ma wyświetlić aktualną pozycję/opcję na podstawie zapisanych w pamięci zmiennych i to tylko wtedy gdy ekran wygląda inaczej niż przy poprzednich odwiedzinach w tym miejscu. Kiedyś robiłem przegląd bibliotek do menu i robiłem taki test, w loop migający led co 100ms, jeśli po wejście w menu led zamierał, to takie menu jest nic nie warte. A takie też znalazłem. Dla kilku zmiennych nie jest potrzebne rozbudowane menu, wystarczy tablica.
Z kolei każde naciśnięcie przycisku powinno być rozpatrywane w kontekście jaka jest wartość zmiennej kursor, może być menu nieaktywne czy też kursor ustawiony na określonej pozycji menu, łatwo to powiązać i zmieniać właśnie tę zmienną.
Całość mogłaby się odbywać bez ekranu, to tylko wizualne odzwierciedlenie stanu menu.
Panowie sprawa widzę wymaga wyjaśnień. Chcę wysterować komputer sterujący kopalnianą maszyną transportową z silnikiem spalinowym. Silnik jest sprzęgnięty z pompą hydrauliczną, która daje medium na siłowniki hamulca, docisku kół, magistralę główną itd. Przetworników cisnienia jest 5. Chcę zasymulować komputerowi maszyny że silnik pracuje. Aby to zrobić muszę wysterować sygnały z przetworników cisnienia. Mając do dyspozycji 6 wyjść pwm chcę poprzez transoptory zasymulować komputerowi odczyty na odpowiednie wejścia. W poprzednim temacie prosiłem o pomoc w wysterowaniu transoptora, który w zależności od ustawienia potencjometru przepuści na 12V maksymalnie 6mA. Temat opanowany ale... Nie mogę wysterować transoptora bez mapowania sygnału z potencjometru. Kiedy przypisuję analogWrite(analogRead(A5)) transoptor działa poprawnie do połowy obrotu potencjometru tzn otwiera tranzystor od 0 do 100% ale kręcąc dalej zaczyna od nowa do ok 1/3 zakresu. Potencjometr 500ohm. Czy ma to związek z wartością potencjometru? Przy mapowaniu jestem w stanie to opanować. Myslałem o połączeniu kilku przycisków równolegle z 5V do adc przez rezystory różnych wartosci i w zależności od tego który wcisnę nadawać odpowiedni sygnał analogowy. Ale to moje nieszczęsne mapowanie... Jednak skoro program może na ten sygnał poczekać to widzę że dobrym i dokładniejszym sposobem jest zostać przy potencjometrze. No więc tak: odpalenie programu, pytanie o wartość na 1 przetworniku, ustawienie wartości potencjometrem, potwierdzenie wartości, przejście do następnego przetwornika (tzn pwm). Oprócz tego mam jeszcze na tym złomie czujniki temperatury i czujniki prędkości obrotowej silnika i prędkości jazdy ale na razie chcę opanowac przetworniki ciśnienia. Po jednym kroku naprzód bo nie chciałbym to dostać gotowca, z którego nic nie zrozumiem tylko czegoś się nauczyć. Dysponuje Arduino Uno, wyświetlaczem 2x16 ale bez przystawki do I2c więc muszę w deklaracji zmienić wyjścia i uwolnić te z pwmami. Mam też klawiaturę membranowa ale boję się za dużo wprowadzać dla siebie komplikacji. 

To moje dotychczasowe wypociny:



#include <LiquidCrystal.h> //Dołączenie bilbioteki

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza

#define pwmPin 9

float odczytanaWartosc;


void setup() {

pinMode(13, OUTPUT);
pinMode(pwmPin, OUTPUT);

  Serial.begin(9600);//Uruchomienie komunikacji przez USART
lcd.clear();
}

void loop()

{
digitalWrite(13, LOW);
  odczytanaWartosc = analogRead(A5);//Odczytujemy wartość napięcia

odczytanaWartosc= map(odczytanaWartosc, 0, 1024, 0, 255);

analogWrite(pwmPin, odczytanaWartosc);
float serial = (odczytanaWartosc)*8.3/255;
Serial.println(serial);

  lcd.begin(16, 2); //Deklaracja typu
  lcd.setCursor(0, 0); //Ustawienie kursora
  lcd.print("Prad czujnika"); //Wyświetlenie tekstu
  lcd.setCursor(0, 1); //Ustawienie kursora
  lcd.print(serial);

delay(300);

if (odczytanaWartosc >=100){
digitalWrite(13, HIGH);

}
}

Zdaje sobie sprawę że kilka linijek jest tam niepotrzebnych ale to pierwsza testowa wersja na której próbowałem zrozumiec to i owo. Ten dziwny mnożnik 8.3/255 pozwala na LCD wskazać wartość prądu w obwodzie 12V transoptora. Wiem że długa droga przede mną...

Pozdrawiam
Hm dlaczego dziwisz się, że bez mapowania nie działa poprawnie. Przecież wartość odczytywana analogRead(A5) zmienia się od 0 do 1024 a wartości jakie można podstawiać do analogWrite to 0 do 255. Wartość potencjometru 500om wydaje się trochę mała w sensie, że niepotrzebnie płynie stosunkowo duży niepotrzebny prąd, 5V / 500om = 10mA . Wystarczyłby potencjometr 5kom.
Do wyświetlacza proponuję dokupić "przejściówkę" na I2C są gotowe tylko wlutować i działa. Jest to wygodniejsze rozwiązanie i pinów potrzebnych do innych zastosowań zostaje.
Do pomiaru obrotów zostaw sobie piny, które obsługują przerwania zewnętrzne, w UNO piny 2 i 3.
Teraz dodam, że PWMy wykorzystują timery wewnętrzne, które może trzeba będzie wykorzystać do pomiaru obrotów jak już do tego dojdziesz. Nie wiem czy nie lepiej od razu przejść na Arduino Mega ma więcej timerów. W tej kwestii niech wypowiedzą się jednak mądrzejsi. Może można to jakoś obejść albo pomiary obrotów zrobić inaczej.
W moim przypadku nie potrzebuje pomiaru obrotów a tylko impulsator o odpowiedniej częstotliwości. Muszę tylko sprawdzić parametry oryginalnego czujnika i rozmyślam nad układem na Ne555 tylko potrzebuje obejrzeć sprzęgło na pompie i zgadnąć ile impulsów przypada na obrót wału. Maszyna ma wyświetlacz pokazujący wyniki pomiarów.
Stron: 1 2 3 4