• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Serwo na przycisk oraz zegar
#1
Witam , prosty program który ma za zadanie wyświetlać godzinę oraz sterować serwem gdy załączony
zostaje przycisk. Obydwa układy działają osobno , kiedy chce je połączyć ze sobą w ten sposób to
występuje problem. Jak zrobic aby te fukcje void serwo oraz void czas zadziałały. Proszę o
wyrozumiałość zaczynam przygodę z arduino i programowaniem. Logikę programu jak na filmiku
https://www.youtube.com/watch?v=d_WaQ9Sszww 5:30
Kod:
#include "Wire.h"
#include "TimeLib.h"
#include "DS1307RTC.h"
#include "LiquidCrystal.h"
#include "Servo.h"
Servo myservo;



LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Definicja pinów do których podłaczamy wyprowadzenia ekranu

int godzina_ON = 17;
int minuta_ON = 35;
int sekunda_ON = 51;
int godzina_OFF = 17;
int minuta_OFF = 35;
int sekunda_OFF = 53;
int sygnal = 6;
int pos = 0;
int przycisk = 7;


void setup() {
  lcd.begin(16, 2);
  myservo.attach(9);  //Przyłaczenie serwomechanizmu do pinu 9 w Arduino
  pinMode(sygnal, OUTPUT);
  pinMode(przycisk, INPUT);


}

void loop() {
  czas();
  serwo1();
}

void czas () {
  tmElements_t tm; //Inicjalizacja zegara DS1307

  //Jeśli odczyt prawidłowy następuje wyświetlenie danych
  if (RTC.read(tm)) {
    lcd.setCursor(0, 0);
    print2digits(tm.Hour); //Wyswietlenie godzin
    lcd.print(":");
    print2digits(tm.Minute);//Minut
    lcd.print(":");
    print2digits(tm.Second);//Sekund
    lcd.setCursor(0, 1);

    //Wyświetlenie daty
    lcd.print(tm.Day);
    lcd.print('/');
    lcd.print(tm.Month);
    lcd.print('/');
    lcd.print(tmYearToCalendar(tm.Year));

    //W przypadku problemu z modułem wyswietla odpowiedni komunikat
  } else {
    if (RTC.chipPresent()) {
      lcd.setCursor(0, 0);
      lcd.print("Zegar zatrzymany!");

    } else {
      lcd.setCursor(0, 0);
      lcd.print("Blad odczytu!");
    }
  }
  delay(1000);

  if ((godzina_ON == tm.Hour) && (minuta_ON == tm.Minute) && (sekunda_ON == tm.Second))
  {
    digitalWrite(sygnal, HIGH);
  }


  if ((godzina_OFF == tm.Hour) && (minuta_OFF == tm.Minute) && (sekunda_OFF == tm.Second))
  {
    digitalWrite(sygnal, LOW);
  }
}

//Funkcja odpowiedzialna za wyswietlanie zer na pozycji
//poprzedzającej jesli cyfra jest mniejsza od 10
void print2digits(int number) {
  if (number >= 0 && number < 10) {
    lcd.print('0');
  }
  lcd.print(number);
}




void serwo1 ()
{
  if (digitalRead(przycisk) == HIGH) {

    for (pos = 0; pos <= 90; pos += 1) //Zmiana pozycji (dodawanie) do 180 stopni
    {
      myservo.write(pos); //ustawienie zadanej pozycji
      delay(15); //Czas na zmiane pozycji
    } delay(2000);

    //Analogiczne odejmowanie pozycji po osiągnięciu maksumum
    for (pos = 90; pos >= 0; pos -= 1)
    {
      myservo.write(pos);
      delay(15);
    }
  }
 
Odpowiedź
#2
W funkcji czas() masz delay(1000), w funkcji serwo1() masz delay(2000) i delay(15) x 90 = delay(1350).
Czyli Twój program w większości spędza czas na oczekiwaniu na zakończenie delaya.
Nie dziw się więc, że według Twojej percepcji zachowuje się jakby nie działał.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
(01-11-2019, 20:12)Robson Kerman napisał(a): W funkcji czas() masz delay(1000), w funkcji serwo1() masz delay(2000) i delay(15) x 90 = delay(1350).
Czyli Twój program w większości spędza czas na oczekiwaniu na zakończenie delaya.
Nie dziw się więc, że według Twojej percepcji zachowuje się jakby nie działał.
W fukcji serwo delaye sa do sterowania serwem delay(2000) zatrzymanie serwa na 2s po osiągnięciu krancowej pozycji  i delay(15) czas na zmiane pozycji (prędkość) w czasie tych delay zegar staje dlatego chciałem jakby dwie osobne pętle stworzyć. Da sie jakoś ten delay zamienić lub jakoś inaczej to rozwiązać ?
 
Odpowiedź
#4
Delay(2000) zatrzymuje cały program na dwie sekundy, a nie tyko serwo. Zainteresuj się funkcją millis() lub bibliotekami timers, timerone itp.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#5
W ostatniej lekcji kursu jest opisane działanie millis().
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości