poniedziałek, 14 kwietnia 2014

Arduino TowerPro servo SG90

Wstęp:
Do skonstruowania tego schematu potrzebujemy dowolnego servo oraz jakiegokolwiek potencjometru.
Nie musimy także pobierać żadnej nowej biblioteki do obsługi projektu, ponieważ wszystkie komendy są już wgrane w Arduino IDE co dodatkowo upraszcza sprawę.

Zasada działania:
1. Arduino odbiera analogową wartość podłączonego do pinu (A0) potencjometru (0 - 1023)
2. Wartość z potencjometru jest przeliczana na kąt obrotu servomechanizmu (0-180 stopni)
3. Obracając gałką potencjometru zmieniamy wskazania na pinie (A0) i tym samym obracamy servem.

Kod programu do servo:
#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop()
{
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}

niedziela, 13 kwietnia 2014

Arduino ultradźwiękowy miernik odległości HC-SR04

Wstęp:
Kod do tego urządzenia nie należy do mnie. Szukałem na internecie najprostszego szkicu do sprawdzenia tego układu i znalazłem go na następującej stronie http://electronut.in/tag/arduino-2/ mimo wszystko pozwoliłem sobie zamieścić ten kod na tej stronie żeby w razie potrzeby móc szybko go znaleźć.

Zasada działania:
1. Czujnik HC-SR04 mierzy falami odległość do przeszkody.
2. Zmierzoną odległość (w cm) czujnik pokazuje nam na ekranie serial monitora.

Kod programu dla ultradźwiękowego miernika odległości HC-SR04
#include "Arduino.h"

int pinTrigger = 2;
int pinEcho = 4;

void setup()
{
  // initialize serial comms
  Serial.begin(9600);

  // set pins
  pinMode(pinTrigger, OUTPUT);
  pinMode(pinEcho, INPUT);
}

void loop()
{
  // send a 10us+ pulse
  digitalWrite(pinTrigger, LOW);
  delayMicroseconds(20);
  digitalWrite(pinTrigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(pinTrigger, LOW);
  delayMicroseconds(20);
 
  //  read duration of echo
  int duration = pulseIn(pinEcho, HIGH);

  if(duration > 0) {
    // dist = duration * speed of sound * 1/2
    // dist in cm = duration in us * 1 x 10^{-6} * 340.26 * 100 * 1/2
    // =  0.017*duration
    float dist = 0.017 * duration;
    Serial.println(dist);
  }
 
  // wait
  delay(200);

}

poniedziałek, 7 kwietnia 2014

Arduino miernik wilgotności podłoża

Wstęp:
Jako dodatkową informację chciałem powiedzieć o małym potencjometrze zamontowanym na płytce włączonej do układu.
Mianowicie potencjometr ten steruje dwoma diodami znajdującymi się na płytce, jego zadaniem jest zaświecenie diody w zależności od poziomu zawilgocenia płytki.
Np. można ustawić żeby dioda zaświeciła się w momencie jeśli na płytce znajdzie się choć jedna kropla wody, lub ustawić aby dioda zaświeciła się dopiero w momencie całkowitego zawilgocenia płytki.

Zasada działania:
1. Przez włożenie widełek do wody/gruntu następuje połączenie obu nóżek przez co nasze arduino odbiera na pinie analogowym  (A0) wartości pomiędzy ok 300 a 1023 informując nas o tym jak wilgotno jest w miejscu w którym znajdują się widełki.
2. Jeśli widełki są całkowicie zanurzone np. w wodzie otrzymamy wartość 300 natomiast jeśli wyjmiemy widełki z wody wartość rośnie do 1023. Nie testowałem jeszcze widełek w gruncie ale podejrzewam że będą działać równie sprawnie.

Kod programu dla miernika wilgotności podłoża:
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  delay(2000);
}

Arduino czujnik deszczu

Wstęp:
Jako dodatkową informację chciałem powiedzieć o małym potencjometrze zamontowanym na płytce włączonej do układu.
Mianowicie potencjometr ten steruje dwoma diodami znajdującymi się na płytce, jego zadaniem jest zaświecenie diody w zależności od poziomu zawilgocenia płytki.
Np. można ustawić żeby dioda zaświeciła się w momencie jeśli na płytce znajdzie się choć jedna kropla wody, lub ustawić aby dioda zaświeciła się dopiero w momencie całkowitego zawilgocenia płytki.

Zasada działania:
1. Padająca na czujnik wilgotności woda powoduje połączenie na czujniku przez co nasze arduino odbiera na pinie analogowym  (A0) wartości pomiędzy ok 300 a 1023 informując nas ile wody znajduje się na płytce.
2. Jeśli płytka jest całkowicie mokra otrzymujemy wartość 300 a jeśli całkowicie sucha to 1023, nie trzeba chyba tłumaczyć że w zależności od ilości wody można uzyskać wartości pośrednie np. częściowo zawilgacając płytkę można otrzymać np. 524 , 663 , 720 dzięki czemu mamy do dyspozycji bardzo profesjonalny czujnik deszczu.

Kod programu dla czujnika wilgoci:
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  delay(2000);

}

sobota, 29 marca 2014

Arduino sensor wilgoci i temperatury DHT11

Wstęp:
W celu prawidłowego działania sensora i kodu musimy pobrać i zainstalować bibliotekę obsługującą sensor DHT11 (biblioteka DHT11).
Poniżej przedstawiony kod jest identyczny z przykładem znajdującym się w tej bibliotece poza jedną zmianą, zmieniłem int pin = 4; na int pin = A1 aby pinem odczytującym wartości układu był analogowy pin A1.

Zasada działania:
1. Miernik wilgoci i temperatury DHT11 wysyła sygnał pomiary tych dwóch wielkości.
2. Monitor seryjny pokazuje wartości pomiaru wilgoci i temperatury.

Kod programu dla sensora DHT11:
#include <DHT11.h>
int pin=A1;
DHT11 dht11(pin);
void setup()
{
   Serial.begin(9600);
  while (!Serial) {
      ; // wait for serial port to connect. Needed for Leonardo only
    }
}

void loop()
{
  int err;
  float temp, humi;
  if((err=dht11.read(humi, temp))==0)
  {
    Serial.print("temperature:");
    Serial.print(temp);
    Serial.print(" humidity:");
    Serial.print(humi);
    Serial.println();
  }
  else
  {
    Serial.println();
    Serial.print("Error No :");
    Serial.print(err);
    Serial.println();  
  }
  delay(DHT11_RETRY_DELAY); //delay for reread
}

wtorek, 4 marca 2014

Arduino nadajnik-odbiornik 433MHz RF

Wstęp:
Tytułem wstępu. Schemat łączenia zaczerpnąłem od Pana Elektro Maras z Youtuba a stronę stworzyłem aby nie zapomnieć jak to podłączyć i mieć to zawsze pod ręką. Polecam zajrzeć też na Youtuba.
http://www.youtube.com/watch?v=3rRlp79qHIs
Na uwagę zasługuje także projekt ze skrzynką pocztową wykorzystujący połaczenie RF
http://majsterkowo.pl/prosty-system-powiadamiania-o-nowych-listach-znajdujacych-sie-w-skrzynce-pocztowej/

Zasada działania:
1. Nadajnik wysyła sygnał z arduino sygnalizując wysyłanie miganiem diody L (sprzężonej z pinem 13).
2. Odbiornik z drugiego arduino odbiera sygnał potwierdzając odbiór miganiem diody L, oraz wyświetla pobierany sygnał na monitorze połączenia.
3. W celu prawidłowego działania systemu należy pobrać ze strony arduino bibliotekę VirtualWire.

Kod programu dla nadajnika:
#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);
    Serial.println("setup");

    vw_set_ptt_inverted(true);
    vw_setup(2000);
}

void loop()
{
    const char *msg = "hello";

    digitalWrite(13, true);
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();
    digitalWrite(13, false);
    delay(200);

}

Kod programu dla odbiornika:
#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);
    Serial.println("setup");

    vw_set_ptt_inverted(true);
    vw_setup(2000);

    vw_rx_start();
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen))
    {
int i;

        digitalWrite(13, true);
Serial.print("Got: ");

for (i = 0; i < buflen; i++)
{
   Serial.print(buf[i], HEX);
   Serial.print(" ");
}
Serial.println("");
        digitalWrite(13, false);
    }

}

środa, 12 lutego 2014

Arduino przycisk wielofunkcyjny

Zasada działania:
1. Ilość kliknięć wybiera nam numer programu który ma się uruchomić i mamy tu 3 programy:
     a)  1 kliknięcie - zaświeca się dioda czerwona a na ekranie widnieje napis "Wybrana funkcja nr 1"
     b)  2 kliknięcia - zaświeca się dioda żółta a na ekranie widnieje napis "Wybrana funkcja nr 2"
     c)  3 kliknięcia - zaświeca się dioda zielona a na ekranie widnieje napis "Wybrana funkcja nr 3"
2. W układzie zamontowano 4 diodę (zieloną a opcjonalnie może to być brzęczek) która informuje nam mrugnięciem o wciśnięciu przycisku co daje nam możliwość policzenia ile razy nacisnęliśmy przycisk.
3. Po wciśnięciu przycisku (np 2 razy), program odczekuje 3 sekundy a następnie włącza program 2 opisany powyżej.


Wady:
1.  nie dopisałem jeszcze funkcji odpowiedzialnej za przekroczenie ilości wciśnięć przycisku dlatego kiedy przekroczy się liczbę 3 klinknięć to arduino się zapętla i konieczny jest reset.

Kod programu:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int licznik;
int klikacz = 1;
int red = 10;
int yellow = 9;
int green = 8;
int info = 7;
int funkcja;
long czas;

void setup()

{
  Serial.begin(9600);
  pinMode(klikacz, INPUT_PULLUP);
  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(info, OUTPUT);
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("Wybrana funkcja");
}

void loop()
{
  if(digitalRead(klikacz) == LOW)
  {
    delay(20);
    licznik = licznik++;
    Serial.println(licznik);
    digitalWrite(info, HIGH);
    while(digitalRead(klikacz) == LOW);
    delay(20);
    digitalWrite(info, LOW);
    czas = millis()/1000;
  }
  if(millis()/1000-czas > 3 && funkcja < 4)
  {
    funkcja = licznik;
    licznik = 0;
  }
  switch(funkcja)
  {
    case 1:
    {
      digitalWrite(red, HIGH);
      digitalWrite(yellow, LOW);
      digitalWrite(green, LOW);
      lcd.setCursor(0,1);
      lcd.print("Nr 1");
      break;
    }
        case 2:
    {
      digitalWrite(red, LOW);
      digitalWrite(yellow, HIGH);
      digitalWrite(green, LOW);
      lcd.setCursor(0,1);
      lcd.print("Nr 2");
      break;
    }
        case 3:
    {
      digitalWrite(red, LOW);
      digitalWrite(yellow, LOW);
      digitalWrite(green, HIGH);
      lcd.setCursor(0,1);
      lcd.print("Nr 3");
      break;
    }
}
}