Teraz jest niedziela, 10 stycznia 2021, 21:58

Strefa czasowa: UTC + 1




Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 552 ]  Przejdź na stronę Poprzednia strona  1, 2, 3, 4, 5, 6, 7 ... 28  Następna strona
Autor Wiadomość
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: piątek, 21 lutego 2014, 01:38 
Offline
modelarz
Avatar użytkownika

Dołączył(a): wtorek, 22 czerwca 2010, 21:01
Posty: 231
Wiek: 27
Lokalizacja: Pszczyna-Poręba
A oto moje dzisiejszy wypociny :D
Skleiłem część kodu obsługującego LCD i Pinga i dodałem trochę swoich głupot :).
Jeśli macie jakieś uwagi, walcie śmiało, pewnie dało się to zrobić sprawniej. W każdym razie jest to efekt kilku pierwszych godzin spędzonych z Arduino :).
Kupiłem kontroler I2C - także będzie szansa ograniczyć kablologie.

Wyjściem PWM ustawiłem sobie kontrast na wyświetlaczu. Zastanawia mnie natomiast jedna rzecz.
Tutaj jest ewidentnie wysyłany sygnał. Wcześniej natomiast miałem to podłączone w ten sposób:
V0 miałem podpięte przez rezystor 4,7k prosto do GND(porada znaleziona gdzieś na necie). Działało.
Czy w takim razie na pinie tym jest już jakieś napięcie ?
Czy w takim razie podając mu z drugiej strony (przez wyjście PWM) napięcie - zmniejszamy różnicę potencjałów i regulujemy tym napięcie na tym pinie ?
Wiem, że pewnie głupoty wypisuje, ale zastanawia mnie to.

W każdym razie radochy co nie miara :D
Na wyświetlaczu mam wyświetlaną odległość mierzoną ultradzwiękowym miernikiem odległości i w tym samym momencie zrobiłem sobie skalę (co prawda z zer, bo nie wiem jeszcze jak "odpalić" wszystkie piksele w danym polu), gdzie 10cm, to jedno "0". Czyli w moim zakresie (od 20 do 160), widze po ilości zer, jaka jest odległość (w tym moim przedziale). No i gdy mam odległość większą od 160 to wyświetla mi się "too far" a gdy mniejszą od 20 do wyświetla "too close" :).

// include the library code:
#include <LiquidCrystal.h>
#include <cmath>
#define echoPin 7
#define trigPin 8
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 6;
int i;
long duration;
float distance;
float letters;
void setup() {

lcd.begin(16, 2);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);

}

void loop() {
analogWrite(ledPin, 129);
lcd.clear();

digitalWrite(trigPin, LOW);
delayMicroseconds(2);

digitalWrite(trigPin, HIGH);
delayMicroseconds(10);

digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration/58.2;
letters = distance/10;
letters=floor(letters);
if(distance>160)
{
lcd.print("too far");
}
if(distance<20)
{
lcd.print("too close");
}
if(distance>=20&&distance<=160)
{for(i=1;i<=letters;i++)
{lcd.setCursor(i-1, 0);
lcd.print("0");}


lcd.setCursor(6, 1);
lcd.print(distance);}
delay(200);
}

_________________
Pozdrawiam,
Karol


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: piątek, 21 lutego 2014, 09:48 
Offline
Moderator
Avatar użytkownika

Dołączył(a): czwartek, 12 kwietnia 2012, 10:46
Posty: 5441
Wiek: 42
Lokalizacja: Kraków
Fajnie, że się wciągnąłęś :) ta zabawa rzeczywiście daje sporo radości i przynosi szybkie efekty :D

Co do wyświetlania znaczków na LCD to są dwa sposoby, jeden z nich to skorzystanie z gotowego znaku z tablicy ASCII w tym przypadku kody rozszerzone 176,177,178 i 219 czyli takie coś: ░ ▒ ▓ █
Tu jest cała tablica ASCII
Tu jest jak jej używać klik

A drugi sposób to rysowanie własnych symboli: klik A tu przykład użycia własnych symboli w tworzeniu progress bar'a klik

Tego opisu z PWM zupełnie nie zrozumiałem ale jeszcze nie piłem kawy więc może po niej będzie lepiej :D

edyta (parę kaw i godzin później): żeby nie przepisywać internetu, to tu jest parę dobrych zdań o sterowaniu kontrastem i jasnością tych wyświetlaczy: klik1 i klik2

_________________
pozdrawiam
Hubert
https://www.banggood.com/?p=WQ230911983820130156


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: sobota, 22 lutego 2014, 01:18 
Offline
modelarz
Avatar użytkownika

Dołączył(a): wtorek, 22 czerwca 2010, 21:01
Posty: 231
Wiek: 27
Lokalizacja: Pszczyna-Poręba
Dzięki za linki - ASCII ogarnąłem i wyświetlają mi się ładne pełne, czarne pola :D. (Trzeba było skorzystać z tablicy znaków pod HD44780, bo ta rozszerzona tablica ASCII nie pokrywała się).
Linki o kontraście zaraz przejrzę, natomiast chodziło mi o kilka typowo technicznych pytać "jak to działa".
Czytam teraz o komunikacji "1-Wire".
Mamy taki oto schemat:
Obrazek
(Pożyczone z internetu)

Rozumiem, że od Vcc do DQ płynie mały prąd (ograniczony rezystorem), wywołując stały stan WYSOKI na wejściu. Jeśli chce nadać zero, czyli "zabrać" całe napięcie z linii, łączy dany pin z masą(czyli prąd najkrótszą drogą przeleci przez rezystor, pin i wewnątrz kontrolera puści go do GND).
(tyle jeśli chodzi o prace MASTERa)

Teraz mam natomiast pytanie, jak działa dokładnie sposób wywołania stanu niskiego przez SLAVE'a. Jak czytam o tym, to piszą, że zwiera on linię danych z masą.
I tutaj mam do Was pytanie - jak to się odbywa (dokładna droga prądu i co się z nim dzieje). Rozumiem, że następuje "zwarcie" w SLAVie, ale dlaczego prąd w tym momencie woli płynąć od Vcc przez rezystor do np. czujnika temp. i tam zwarty do masy, zamiast mimo wszystko dalej zasilać pin kontrolera ?
Powiedzmy, że z elektroniką dopiero zaczynam się bawić i póki co potrzebuje prosty odpowiedzi :).

_________________
Pozdrawiam,
Karol


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: sobota, 22 lutego 2014, 10:16 
Offline
Moderator
Avatar użytkownika

Dołączył(a): czwartek, 12 kwietnia 2012, 10:46
Posty: 5441
Wiek: 42
Lokalizacja: Kraków
Czy na sali jest doktor? Ekhm, tzn elektronik?? :lol: Mnie tam wystarczało, że działa, ale proszę bardzo:

W magistrali 1-Wire mamy 2 przewody idące między 1 układem z funkcją MASTER do wielu układów SLAVE (te 2 przewody to DQ oraz GND).
Gdy magistrala jest wolna i nic ciekawego się nie dzieje na linii DQ (czyli sygnałowej) utrzymywany jest stan wysoki czyli +5V. Służy to zasilaniu układów SLAVE. Tu rządzi zawsze MASTER, więc to on rozpoczyna zabawę wysyłając sygnał reset stanem niskim trwającym od 480-960 us (nie, nie urząd skarbowy, a mikrosekunda) po tym resecie dołączone SLAVE'y odpowiadają sygnałem gotowości i nasłuchują dalej, co to będzie - a robią to ustawiając sygnał niski na 60-240 us oczywiście na linii DQ.
Po tym resecie gdy wszystkie SLAVE'y są w nasłuchu MASTER wysyła identyfikator urządzenia z którym chce pogadać wtedy reszta SLAVE'ów idzie spać do czasu następnego resetu oraz rozpoczyna się transmisja od wywołanego SLAVE'a.

Oooo, teraz dopiero sobie sprawdziłem, że strona, z której podpiąłeś rysunek to wszystko opisuje i nawet dają ładny wykresik stan/czas (http://www.1-wire.rms.biz.pl/). Ale tak btw to takie rzeczy to tylko na egzaminach są ważne ;) normalnie wystarcza: http://playground.arduino.cc/Learning/OneWire

A Twój rysunek przedstawia magistralę 2-Wire a nie 1-Wire.

_________________
pozdrawiam
Hubert
https://www.banggood.com/?p=WQ230911983820130156


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: sobota, 22 lutego 2014, 10:34 
Offline
modelarz
Avatar użytkownika

Dołączył(a): wtorek, 22 czerwca 2010, 21:01
Posty: 231
Wiek: 27
Lokalizacja: Pszczyna-Poręba
Dzięki za odpowiedź - ale to akurat właśnie wiem, gdzie znaleźć, ale dzięki za pomoc. Chodziło mi o samą zmiane stanu z wysokiego na niski, jak to działa (elektrycznie). Z tego co mi się wydaje - to 1-wire, to jest podłączenie Slave3, a te dwa pierwsze faktycznie 2-wire. Rozumiem, że jestem zbyt dociekliwy :P. Interesuje mnie po prostu, jak to sie odbywa. Chociaż zapewne bez tej wiedzy da się żyć ;).

_________________
Pozdrawiam,
Karol


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: sobota, 22 lutego 2014, 18:31 
Offline
Moderator
Avatar użytkownika

Dołączył(a): czwartek, 12 kwietnia 2012, 10:46
Posty: 5441
Wiek: 42
Lokalizacja: Kraków
Teraz będzie łatwiejszy temat: moduł CNT1 czyli dioda RGB, 3 oporniki i oczywiście Arduino:



I pare linijek kodu, można to zrobić na wiele sposobów, to jeden z nich:

Kod:
//pins for the LEDs:
const int redPin2 = 9;
const int greenPin2 = 10;
const int bluePin2 = 11;

void setup() {
// make the pins outputs:
pinMode(redPin2, OUTPUT);
pinMode(greenPin2, OUTPUT);
pinMode(bluePin2, OUTPUT);
}

void loop() {
// random next valid integer for red
int red2 = random(0, 255);
// do it again for green:
int green2 =  random(0, 255);
// do it again for blue:
int blue2 =  random(0, 255);

//send it:   
  analogWrite(redPin2, red2);
  analogWrite(greenPin2, green2);
  analogWrite(bluePin2, blue2);

//wait a bit (0.5s)
delay(500);
}

_________________
pozdrawiam
Hubert
https://www.banggood.com/?p=WQ230911983820130156


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: niedziela, 23 lutego 2014, 19:00 
Offline
modelarz
Avatar użytkownika

Dołączył(a): wtorek, 22 czerwca 2010, 21:01
Posty: 231
Wiek: 27
Lokalizacja: Pszczyna-Poręba
Bawię się i ja
Dzisiaj takie cudo wyszło: 2cyfrowy 7segmentowy wyświetlacz LED. Kupiłem wersję ze wspólną anodą i jest to wersja, która każdą diode ma na osobnym wyjściu, także możemy z nimi robić co chcemy . Dlatego też przyporządkowałem porty pod konkretne segmenty wyświetlacza. Duże litery - wyświetlacz po lewej, małe litery, wyświetlacz po prawej. Zajęło to aż 16 portów Arduino (!). Z kodu zauważymy, który port pod którego LEDa był podpięty. Pierwszy raz użyłem funkcji - fajna sprawa . Pomiędzy porty Arduino, a diody należy umieścić oporniki. Ja miałem oporniki różnej oporności, dlatego podaję zakres, jakiego użyłem i nic się nie spaliło :) : 1k-220ohm. Różnica w świeceniu jest słabo widoczna.
Tutaj schemacik:
Obrazek
a tutaj kodzik:
Kod:
int A=11;
int B=12;
int C=6;
int D=7;
int E=8;
int F=9;
int G=10;
int DP=5;
int a=A0;
int b=A1;
int c=1;
int d=3;
int e=4;
int f=13;
int g=2;
int dp=0;
int pins[16]={A, B, C, D, E, F, G, DP, a, b, c, d, e, f, g, dp};
byte counting_from_0_to_10[11][16]={{1,1,1,1,1,1,1,1, 0,0,0,0,0,0,1,1},//=0
                            {1,1,1,1,1,1,1,1, 1,0,0,1,1,1,1,1},    //=1
                            {1,1,1,1,1,1,1,1, 0,0,1,0,0,1,0,1},    //=2
                            {1,1,1,1,1,1,1,1, 0,0,0,0,1,1,0,1},    //=3
                            {1,1,1,1,1,1,1,1, 1,0,0,1,1,0,0,1},    //=4
                            {1,1,1,1,1,1,1,1, 0,1,0,0,1,0,0,1},    //=5 
                            {1,1,1,1,1,1,1,1, 0,1,0,0,0,0,0,1},    //=6
                            {1,1,1,1,1,1,1,1, 0,0,0,1,1,1,1,1},     //=7
                            {1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,1},     //=8
                            {1,1,1,1,1,1,1,1, 0,0,0,0,1,0,0,1},    //=9
                            {1,0,0,1,1,1,1,1, 0,0,0,0,0,0,1,1}};   //=10
int i;
int j;
int k;
int pin;
void setup() {               
 
for(j=0;j<=15;j++)     //Petla ktora ustawia wszystkie porty jako WYJSCIE
{pin=pins[j];
  pinMode(pin, OUTPUT);
}
for(i=0;i<=15;i++)      //Petla ktora ustawia wszystkie porty w stan WYSOKI
{digitalWrite(i, HIGH);}
}

void sevenSegWrite(byte digit) {                                            //Funkcja, ktora jest wywolywana w petli programu.
k=0;                                                                                 //ustawiamy zmienna k na pierwszy element tablicy "pins"
for (byte segCount = 0; segCount < 16; ++segCount) {              //Po wywolaniu funkcji ze zmienna  digit dostajemy, ktora cyfre (wiersz) z tablicy       
digitalWrite(pins[k], counting_from_0_to_10[digit][segCount]);     //   counting_from_0_to_10[digit][segCount] chcemy wyświetlić
++k;                                                                                  // i w digitalWrite podajemy dopasowany pin i wartosc z tablicy  counting_from_0_to_10  jaki chcemy odpalić :)
  }
}
void loop() {
  for (byte count = 11; count > 0; --count) {
   delay(1000);
   sevenSegWrite(count - 1);
  }
  delay(4000);
}


Jeśli nie chcemy czekać 4s, możemy wrzucić taki ładny pokaz :):
Kod:
void loop() {
  for (byte count = 11; count > 0; --count) {
   delay(1000);
   sevenSegWrite(count - 1);
  }
  delay(200);
  for(i=0;i<=15;i++)      //Petla ktora ustawia wszystkie porty w stan WYSOKI
{digitalWrite(i, HIGH);}

  for(i=0;i<=15;i++)
  { led=pins[i];             
  digitalWrite(led, LOW);
  delay(125);} 
 
  for(i=15;i>=0;i--)
  { led=pins[i];             
  digitalWrite(led, HIGH);
  delay(125);  }
}

Do kolegi Ellipsis - mam nadzieję, że nie przeszkadza, tym co wrzucam. Jeśli tak, to proszę o odpowiedź ;).

_________________
Pozdrawiam,
Karol


Ostatnio edytowano niedziela, 23 lutego 2014, 20:11 przez Karol93, łącznie edytowano 1 raz

Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: niedziela, 23 lutego 2014, 19:39 
Offline
Moderator
Avatar użytkownika

Dołączył(a): czwartek, 12 kwietnia 2012, 10:46
Posty: 5441
Wiek: 42
Lokalizacja: Kraków
Brawo, dobra robota :)

Przy okazji warto zwrócić uwagę na limity prądowe Arduino i innych uC. Przy zasilaniu 5V zalecają aby nie przekraczać 20mA na 1 pin wejścia/wyjścia. Tu można poczytać więcej. Czerwone diody (także te zespolone) "biorą" zazwyczaj 20-30mA więc spokojnie się mieszczą w limicie, potem trzeba już pomyśleć o jakimś tranzystorze czy ich zespolonej wersji.

_________________
pozdrawiam
Hubert
https://www.banggood.com/?p=WQ230911983820130156


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: niedziela, 23 lutego 2014, 19:40 
Offline
Administrator
Avatar użytkownika

Dołączył(a): sobota, 20 marca 2010, 17:16
Posty: 6583
Wiek: 38
Lokalizacja: Czechowice-Dziedzice
Karol super że się wciągłeś.

no to moje wypociny :D ,

Kod:
#include <LiquidCrystal_I2C.h>
#include <ProsteMenu.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
//#include <LiquidCrystal.h>
#include "RTClib.h"
#include "SoftwareSerial.h"
#include "SerLCD.h"



RTC_DS1307 RTC;

// PARAMETRY TEMPERATURA
#define  TEMP_MAX 31.0   // temperatura MAX po której właczam alarm
#define  TEMP_MIN 23.0   // temperatura MIN po której właczam alarm
#define  TEMP_OK 24.0    // temperatura ustalona poprawna


int grzalka = 8;
int wentylator = 9;
// czujnik temp. DS1820
#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

//PARAMERTY TIMERÓW
#define TIMMER1_ON 7:30     // godzina załączenia oświetlania głownego
#define TIMMER1_OFF 19:00   // godzina wyłączenia oświetlania głownego

#define TIMMER2_ON 18:30     // godzina załączenia oświetlania nocnego
#define TIMMER2_OFF 23:00   // godzina wyłączenia oświetlania nocnego

// PARAMETRY LCD
//LiquidCrystal lcd(11, 10, 5, 4, 3, 2);
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27,20,4);        // Define a 20x4 LCD with address of 0x27

// DODATKOWE ZNAKi - STRZALKI
byte arrowdown[8] = {B00000,B00000,B00000,B00000,B00000,B11111,B01110,B00100 };
byte arrowup[8] = {B00100,B01110,B11111,B00000,B00000,B00000,B00000,B00000};

// KEYPAD
byte arrows[8] = {B00100,B01110,B11111,B00000,B00000,B11111,B01110,B00100};

   int entertoMENU = -1;
   int pressHOLD = 3000;
   int timeHOLD = 0;
   
char *menu[]={"<   DATA/GODZINA   >",
              "<      TIMER 1     >",
              "<      TIMER 2     >",
              "<        PH        >",
              "<    TEMPERATURA   >",
              "<  WYJSCIE Z MENU  >"};

char *submenu[]={"ZMIANA DATY/GODZINY",
                 "WL/WYL TIMER 1     ","GODZINA ZAL. T1    ", "GODZINA WYL. T1    ",
                 "WL/WYL TIMER 2     ","GODZINA ZAL. T2    ", "GODZINA WYL. T2    ",
                 "WARTOSC MIN. PH    ","WARTOSC MAX. PH    ","WARTOSC OK. PH      ",
                 "WARTOSC MIN. TEMP. ","WARTOSC MAX. TEMP. ","WARTOSC OK. TEMP.   ",
                 "EXIT               "};
                 
                 
int iH=6;              // ilosc pozycji menu, literka H od w poziomie
int iV=19;             // ilosc pozycji dla submenu, literka V od w pionie
int tV[6]={1,3,3,3,3,1}; // tablica z ilosciami pozycji dla poszczegolnych submenu
char *komunikaty[]={"  "," ","...wcisnij OK      ","  Wykonano OK dla:  "};
// tablica komunikatów - 3 pierwsze na początek programu, ostatni po wybraniu OK
// --- tworzymy obiekt klasy ProsteMenu o nazwie moje: ------------------------
ProsteMenu moje (menu, submenu, iH, iV, tV, komunikaty);
// --- funkcje powitanie ------------------------------------------------------



void powitanie() // na Dzien Dobry programik przedstawia sie ladnie
{
//  lcd.clear();       
    lcd.setCursor(0,0);lcd.print("MENU:");
//  lcd.setCursor(0,0); lcd.print(komunikaty[0]);
//  lcd.setCursor(0,1); lcd.print(komunikaty[1]);
  delay(2000);  // czeka 2 sek. i wystawia kolmunkat do akcji
//  lcd.clear();
  lcd.setCursor(0,0); lcd.print(komunikaty[2]);
  do {} while(moje.stan_keyboard()==-1); // tu czekamy az nacisniesz klawisz OK
  moje.ok=0;      // zerujemy zmienna ok, bo jak nacisnales to miala wartosc =1
}
// --- funkcja klawiatura (komunikuje sie z klasa ProsteMenu) -----------------

int klawiatura()
{
//  lcd.clear();                                // opcjonalne, tylko wtedy gdy opcje maja nierowna dlugosc
  int x=moje.stan_keyboard();                 // sprawdzamy czy nacisnieto jakis klawisz
//  if(x!=-1)Serial.println(x);                 // to dla testów
  lcd.setCursor(0,0);lcd.print(moje.linia1);  // pierwsza linia wyswietla akt. menu
  lcd.setCursor(0,1);lcd.print(moje.linia2);  // druga linia akt. submenu 
lcd.setCursor(19,1);lcd.print((char)0);
  if(moje.ok==1) delay(700);moje.ok=0;        // zeruje ok, bo znowu bylo 1
  delay(20);                                  // to dajemy standardowo przy korzystaniu z wejsc analogowych
  return x;
}
// --------------------------------------------------------------------------------------------------

void data_czas(){
    lcd.setCursor(0, 0);
  DateTime now = RTC.now();
  if (now.hour()<10){ lcd.print("0"); } lcd.print(now.hour());
lcd.print(":");
  if (now.minute()<10){ lcd.print("0"); } lcd.print(now.minute()); 
lcd.print(":");
  if (now.second()<10){ lcd.print("0"); } lcd.print(now.second());   

lcd.print("  ");
if (now.day()<10){ lcd.print("0"); } lcd.print(now.day());
lcd.print("/");
if (now.month()<10){ lcd.print("0"); } lcd.print(now.month());
lcd.print("/");
if (now.year()<10){ lcd.print("0"); } lcd.print(now.year());
 
 
}

void odczyt_temp_ph(){
  sensors.requestTemperatures();
float aktualna_temp = sensors.getTempCByIndex(0);

// wyświetlanie TENP.
  lcd.setCursor(0, 1);
  lcd.print("TEMP. WODY: ");
  lcd.print(aktualna_temp,1);
  lcd.print((char)223);
  //lcd.blink("C");
  lcd.print("C");



// wyświetlanie TENP.
  lcd.setCursor(0, 3);
  lcd.print("TEMP. POW: ");
  lcd.print(aktualna_temp,1);
  lcd.print((char)223);
  //lcd.blink("C");
  lcd.print("C");
//  lcd.scrollDisplayLeft();
//  delay(150);

// Pomiar PH i wyświetlanie PH
   lcd.setCursor(0, 2);
   lcd.print("PH WODY:    7.23");
// delay(100);

  if(aktualna_temp > TEMP_OK+1){  // właczenie wentylatora jezeli temp wzrośnie powżej temp_ok +1
  lcd.setCursor(18, 1);
  lcd.print((char)1);
  digitalWrite(wentylator, HIGH);
    lcd.setCursor(0, 4);
//  lcd.print("Wentylator: ON");
  //lcd.print(TEMP_OK+1);
}
else if(aktualna_temp < TEMP_OK-1){ // właczenie grzałki jezeli temp spadnie ponizej temp_ok -1
  lcd.setCursor(18, 1);
  lcd.print((char)0);
  digitalWrite(grzalka, HIGH);
  lcd.setCursor(0, 4);
//  lcd.print("Grzałka: ON");
  //lcd.print(TEMP_OK-1);
}
else{
  digitalWrite(grzalka, LOW);
  digitalWrite(wentylator, LOW);
  lcd.setCursor(18, 1);
  lcd.print(" ");
  //lcd.clear();
}

  }

//////////////////////////////////////////////////////////////

void setup() {

  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();
 
 
pinMode(grzalka, OUTPUT);
pinMode(wentylator, OUTPUT);

lcd.begin(20,4);
lcd.createChar(0, arrowup);
lcd.createChar(1, arrowdown);
lcd.createChar(2, arrows);
 
Serial.begin(9600);
Wire.begin();
RTC.begin();
sensors.begin();
  if (! RTC.isrunning()) {
lcd.setCursor(0, 0);   
lcd.print("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}

void loop() {

   if (moje.ok == 1){
    timeHOLD = millis();
   }
   if(moje.ok == 1 && timeHOLD >= pressHOLD){
  lcd.clear();
   powitanie();
 
   switch(klawiatura())
  {
    case   0:  // MENU opcja 1/n
//    lcd.clear();
      break;
    // ....
    case 110: // MENU opcja 2/n
//    lcd.clear();
      break;
    // ....
    case  11: // MENU opcja 3/n itp.
//    lcd.clear();
      break;
  }
   }else{

     
   // pierwszy wiersz wyświetlenie godziny oraz daty 
   data_czas(); 
// Drugi wiersz pokazanie TEMP + PH
   odczyt_temp_ph();

//   lcd.setCursor(0, 4);
//   lcd.print(moje.ok);
//   lcd.setCursor(4, 4);
//   lcd.print(moje.stan_keyboard());
   
   } 

}


Niestety ostatnio brak czasu na klepanie programów.

_________________
To bzykanie coś oznacza. Takie bzyczące bzykanie nie bzyka bez powodu.

pozdrawiam Marcin


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: niedziela, 23 lutego 2014, 20:32 
Offline
modelarz
Avatar użytkownika

Dołączył(a): wtorek, 22 czerwca 2010, 21:01
Posty: 231
Wiek: 27
Lokalizacja: Pszczyna-Poręba
Mam do Was Panowie pytanie - czy wejścia analogowe, można ustawić jako wejścia cyfrowe ? Kolejne pytanie - czy z nauki takiego programowania można wyżyć ? :) Chodzi mi o to, że w Arduino programuje sie na wysokim poziomie, mając juz wszystko pod nosem (a przynajmniej mając prawie wszystko :) )
Jeszcze jedno pytanie - w trakcie komunikacji z DS18B20, musimy odczekać 750-1000ms. Czy jest możliwość, aby w trakcie tego oczekiwania zrobić coś innego z innym urządzeniem ? W moim poprzednim kodzie było to straszne spowolnienie.

_________________
Pozdrawiam,
Karol


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: niedziela, 23 lutego 2014, 20:53 
Offline
Administrator
Avatar użytkownika

Dołączył(a): sobota, 20 marca 2010, 17:16
Posty: 6583
Wiek: 38
Lokalizacja: Czechowice-Dziedzice
Karol93 napisał(a):
Mam do Was Panowie pytanie - czy wejścia analogowe, można ustawić jako wejścia cyfrowe ? Kolejne pytanie - czy z nauki takiego programowania można wyżyć ? :)



ad1/ ano można stan niski do PWM = 0 , stan wysoki to PWM = 255
ad2/ jak masz doby pomysł na jakiś program , urządzenie to pewnie że wyżyjesz a nawet dobrze zarobisz :D

_________________
To bzykanie coś oznacza. Takie bzyczące bzykanie nie bzyka bez powodu.

pozdrawiam Marcin


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: piątek, 28 lutego 2014, 23:00 
Offline
modelarz
Avatar użytkownika

Dołączył(a): wtorek, 22 czerwca 2010, 21:01
Posty: 231
Wiek: 27
Lokalizacja: Pszczyna-Poręba
Chwilowo żadnych nowości nie ma, bo rozgryzam temat :). Zacząłem interesować się przerwaniami i zacząłem nawet ich używać (przycisk, który ma przełączać po menu), ale doszedłem do tego, że trzeba mieć niejaki przerzutnik schmitta + kondensator, żeby wyrównać sygnał z przycisku. To wszytko rozumiem i jest całkiem proste. Interesuje mnie natomiast jedna rzecz.
Przeglądając różne kody w internecie, polecenie "attachinterrupt" dodają w różnych miejscach. Czasami w "setup",czasami wewnątrz pętli głównej, czasami w IF'ie. Jak to wygląda ? Dlaczego tak to robią ? Jaka jest różnica ? Jeśli wywołam przerwanie, jakaś tam zmienna zmieni swoją wartość, to gdzie ona trafi w kodzie - na sam początek pętli, czy do miejsca gdzie wpisałem "attachinterrupt" ?
Czytam książke "Mikrokontrolery AVR, język C, Podstawy programowania". Sporo takich właśnie podstaw autor tam wyjaśnia, ale niektóre rzeczy (jak powyższa), nie są tam wyjaśnione (a przynajmniej tego nie zauwazylem).
PS. Taki ten przerzutnik kupiłem, mam nadzieje, że kupiłem co trzeba :).

PS.2 Czy jesli wywolam przerwanie, bedzie sie wykonywac ISR, zablokuje wewnatrz niego komenda detachinterrupt wykonywanie nowych przerwan, i w tym momencie nacisne guzik, to czy zadziala to tak, jak bym NIGDY tego przycisku nie nacisnal ? Czy zapisze to gdzies i tylko zaczeka z wywolaniem przerwania az do momentu, kiedy z powrotem zapodam attach interrupt ?

_________________
Pozdrawiam,
Karol


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: niedziela, 2 marca 2014, 13:44 
Offline
Moderator
Avatar użytkownika

Dołączył(a): czwartek, 12 kwietnia 2012, 10:46
Posty: 5441
Wiek: 42
Lokalizacja: Kraków
A to czytałeś: http://majsterkowo.pl/forum/przerwania-dlaczego-jest-to-proste-t984.html

_________________
pozdrawiam
Hubert
https://www.banggood.com/?p=WQ230911983820130156


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: niedziela, 2 marca 2014, 19:15 
Offline
modelarz
Avatar użytkownika

Dołączył(a): wtorek, 22 czerwca 2010, 21:01
Posty: 231
Wiek: 27
Lokalizacja: Pszczyna-Poręba
Dzięki za linka - to co tam było, zdążyłem już w miedzyczasie wyczytać tutaj: http://www.gammon.com.au/forum/?id=11488.

"Interrupts events (that is, noticing the event) can occur at any time, and most are remembered by setting an "interrupt event" flag inside the processor. If interrupts are disabled, then that interrupt will be handled when they are enabled again, in priority order."

Dobrze rozumiem, że każde przerwanie może zostać zarejestrowane w rejestrze kiedykolwiek, ale funkcje wykonywane są tylko wtedy, kiedy mają na to pozwolenie ? Czyli moge naklikać mnóstwo przycisków, akurat w momencie kiedy np. przez 2s czytam temp z D18B20, a kiedy komunikacja się skonczy, on wykona te wszystkie przerwania, tak ?

_________________
Pozdrawiam,
Karol


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: poniedziałek, 3 marca 2014, 00:06 
Offline
Moderator
Avatar użytkownika

Dołączył(a): czwartek, 12 kwietnia 2012, 10:46
Posty: 5441
Wiek: 42
Lokalizacja: Kraków
Troochę tak :) ale raczej zawiesi komunikację z czujnikiem na rzecz przerwania.

Wyobraź sobie, że masz program tak napisany, że 1 przejście głównej pętli programu zajmuje 15 sekund. W tym momencie nie ma większego znaczenia co się tam dzieje w tej pętli. Ważne, że coś tam robi :)
Dodatkowo mamy zdefiniowane przerwanie na 1 nóżce, które ma zadziałać gdy na niej zmieni się stan na wysoki - wtedy ma coś się tam zmienić.

Bez względu na to, w którym miejscu głównej pętli programu jesteśmy - jeśli pojawi się stan wysoki przerwie wszystko i zrobi co mu kazaliśmy (w przerwaniu)

Gdybyśmy nie użyli przerwania a zamiast tego wykorzystali warunek sprawdzający IF to wtedy uzyskamy powyższy wynik tylko wtedy, jeśli akurat program będzie w tej linijce, sprawdzi stan nóżki i ten nadal będzie wysoki - czyli tak czy siak jest to możliwe 1 raz na 15 sekund.

_________________
pozdrawiam
Hubert
https://www.banggood.com/?p=WQ230911983820130156


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: poniedziałek, 3 marca 2014, 10:47 
Offline
modelarz
Avatar użytkownika

Dołączył(a): wtorek, 22 czerwca 2010, 21:01
Posty: 231
Wiek: 27
Lokalizacja: Pszczyna-Poręba
Dokładnie :). Napisałem właśnie program, który ma mi zmieniać co jest wyświetlane na LCD (temperatura, albo odległość), ale dopóki nie zastosowałem przerwania, musiałem tak długo trzymać ten przycisk, żeby trafiło akurat na linijkę kodu z warunkiem, czy na tym pinie jest stan wysoki i dopiero wtedy przełączał ;). Dlatego też kupiłem ten przerzutnik schmitta, żeby zrobić jak należy w końcu to przełączanie :).
Dzieki za pomoc :)

PS. Przerzutnik leci do mnie pocztą, ale czymś się trzeba zajmować :).
Czy macie może doświadczenie z zabawkowymi silnikami (takimi jak np. są w autkach na sterowanie, suszarkach itd), zwykłe komutatorowe. Czy wiecie, jaki max prąd są w stanie pociągnąć?
Niestety na wszystko kapusty nie ma i chciałem sam zbudować mostek H, żeby móc sterować silnikiem. Mam tranzystory, ale tylko do 500mA, a to wydaje mi się, przy takich silnikach może być za mało. Jeśli tak będzie, jaki będzie efekt - dym z tranzystora ? :) Bo z Arduino chyba nie może się nic stać...

_________________
Pozdrawiam,
Karol


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: wtorek, 4 marca 2014, 13:00 
Offline
Moderator
Avatar użytkownika

Dołączył(a): czwartek, 12 kwietnia 2012, 10:46
Posty: 5441
Wiek: 42
Lokalizacja: Kraków
Jeśli obciążysz za bardzo tranzytor to zobaczysz dym, najczęściej tylko on odchodzi.
Wydajny mostek lepiej zrobić z l298 wtedy spokojnie obsłużysz większość silników z rozbiórki. Bez względu od rozwiązania warto pomyśleć o radiatorze. A jeśli chcesz tylko w 1 stronę sterować silnikiem można zacząć od BUZ11 znosi sporo i jest tani.

_________________
pozdrawiam
Hubert
https://www.banggood.com/?p=WQ230911983820130156


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: środa, 5 marca 2014, 00:15 
Offline
modelarz
Avatar użytkownika

Dołączył(a): wtorek, 22 czerwca 2010, 21:01
Posty: 231
Wiek: 27
Lokalizacja: Pszczyna-Poręba
Własnie nad MOSFETem się zastanawiałem też, ale to jeszcze wyjdzie w praniu, jak bedą fundusze na kolejne zakupy ;).
Dzięki za odpowiedzi.

http://www.jeremyblum.com/2011/03/07/ar ... ebouncing/
Z tego miejsca można pobrać schemat do poskładania na płytce (potrzebny jest przerzutnik schmitta (ja mam taki: http://standby-shop.eu/photo/_pdf/SN7414.pdf)

W datasheecie mozna zobaczyć, gdzie należy podpiąć zasilanie (piny VCC i GND), a porty nalezy wybrać w ten sposób - wspólna cyfra, A oznacza wejście, a Y wyjście.
Tutaj mój kod do wykorzystania - najprostsze włączanie LEDa na 13pinie za pomocą przerwania - w pętli głownej nic nie ma :). Własnoręcznie napisany.


Kod:


int switchPin = 2;
int ledPin = 13;
int actual_state = HIGH;


void setup()
{ attachInterrupt(0,blink,RISING);
 
  pinMode(switchPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop()
{
 
  }
 



void blink()

    digitalWrite(13,actual_state);
   
   if(actual_state==HIGH)
   {
     actual_state=LOW;
     return;
   }
     if(actual_state==LOW)
        {
          actual_state=HIGH;
          return;
        } 
}



Mam pytanie co do komendy "return" - czy właściwym sposobem jest tutaj jej użycie ? Jako wymuszenie zakonczenia wykonywania funkcji ? Czy jest inny sposób, aby w tracie wykonywania funkcji ją zakończyć ?

Czy może jest jakaś sytuacja, w które taki kod by nie podołał ? Zbyt szybka zmiana stanu, itd ?

Jeśli wiecie, jak można to zrobić inaczej, lepiej, podajcie przykład. Ja często pisze programy tak, żeby działały, ale nie wiem, czy dałoby się to zrobić inaczej, lepiej. Czasami jest sporo zbędnego kodu - do tego już czasami uda mi się dojść. Cieszyłoby mnie, gdyby ktoś mi wytykał błędy - szybciej nauka wtedy idzie ;).

_________________
Pozdrawiam,
Karol


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: czwartek, 6 marca 2014, 12:45 
Offline
Moderator
Avatar użytkownika

Dołączył(a): czwartek, 12 kwietnia 2012, 10:46
Posty: 5441
Wiek: 42
Lokalizacja: Kraków
Arduino jest świetnym sposobem na zaczęcie zabawy, na testowanie pewnych rozwiązań, na wykonanie masy projektów małym kosztem i nakładem pracy. Powstało by być proste. Więc nie wymagaj od niego za dużo :D

Tu się trwoni pamięć i zasoby na każdym kroku. Wykorzystywanie m328 do mrugania 1 diodą nawet RGB, no halo :) Albo bardziej złożony przykład: deklarowanie pinów procesora jako integer.... dla płytki Arduino Due, int jest przechowywana jako zmienna 32-bit (4-byte). Czyli można do niej wpisać wartość od -2147483648 do 2147483647 (gdyż (2^31) - 1)) a pinów aż tyle to nie mamy :D

Co do Twojego kodu przyczepiłbym się tylko do tego: digitalWrite(13,actual_state);
Wcześniej deklarujesz nazwę dla pinu 13 więc raczej po to żeby jej używać ;)

I jeszcze w temacia zarabiania na uC: klik

_________________
pozdrawiam
Hubert
https://www.banggood.com/?p=WQ230911983820130156


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Arduino - jak zacząć.
PostNapisane: czwartek, 6 marca 2014, 14:53 
Offline
modelarz
Avatar użytkownika

Dołączył(a): piątek, 22 marca 2013, 02:24
Posty: 405
Wiek: 39
Lokalizacja: Wwa
dodatkowo dodam ze takie rzeczy jak "led pin" nie ma sensu deklarować jako zmienne, szkoda pamięci
W takim programiku to oczywiście nie robi znaczenia ale jak będzie wiekszy to mogą się zacząć problemy ze "zmieszczeniem" tego w pamięci.

_________________
--
Pozdrawiam, Adam
Quad FPV MultiWii, Hexa KFC32, Hexa AutoQuad!, MultiWii Y4, Quad Edward AutoQuad, Autoquad M4 x2, Pioneer 1400, Skysurfer 2000, DG-1000, ESA Ił2m3, ESA Hawker Typhoon, ESA Ki-61 Hien, DLG GROT, Breeze PRO EVO


Góra
 Zobacz profil Wyślij e-mail  
 
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 552 ]  Przejdź na stronę Poprzednia strona  1, 2, 3, 4, 5, 6, 7 ... 28  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  

77,169,020 Wyświetlone Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Przyjazne użytkownikom polskie wsparcie phpBB3 - phpBB3.PL