Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję

Zegarem z wykorzystaniem lcd 1602, modułem rtc DS3231 i czujnikiem HC-SR04

Autor Wiadomość
jajaceek 



Posty: 3
Wysłany: 11-09-2017, 13:40   Zegarem z wykorzystaniem lcd 1602, modułem rtc DS3231 i czujnikiem HC-SR04

Witam,

Nie wiem czy w odpowiednim dziale zadaję pytanie ale siedzę jakiś czas z nad prostym zegarem z wykorzystaniem lcd 1602, modułem rtc DS3231 i czujnikiem HC-SR04. Idea jest taka: zegar zamontowany w kuchni pod szafką kuchenną i jak podchodzę to zaświeca podświetlenie tak, że można odczytać czas, dzień tygodnia i datę. Wykorzystałem kod z pomiaru odległości i włączania buzera (zamiast buzera włącza podświetlenie lcd z pinu 8) i działa to ok, ten kod wykorzystałem z kursu Arduino poziom 1. Jak koduje sam zegar to też jest ok. (czas i dzień tygodnia w pierwszym wierszu a data w drugim). Wyświetla wszystko zgodnie z oczekiwaniami. Natomiast jak próbuję połączyć to wszystko razem to niestety sypie się wyświetlanie danych, podświetlanie (reakcja na ruch) jest ok. Wyświetla tylko z przewijaniem. Nie wyświetla czasu i daty tak jak powinno.

Byłbym wdzięczny za sugestie jak to mogę poprawić.

Poniżej kod:

Kod programu: Zaznacz cały
 

#define trigPin 12
#define echoPin 11
#include <LiquidCrystal.h>
LiquidCrystal lcd(1, 2, 4, 5, 6, 7);
#include <DS3231.h>
DS3231  rtc(SDA, SCL);

 
void setup() {
  rtc.begin();
  lcd.begin(16, 2);
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
  pinMode(echoPin, INPUT); //a echo, jako wejście
  pinMode(8, OUTPUT); //Wyjście dla buzzera - podswietlenie lcd

}
 
void loop() { 

  zakres(15, 50); //Włącz alarm, jeśli w odległości od 10 do 25 cm od czujnika jest przeszkoda 
  delay(100);
}
 
int zmierzOdleglosc() {
  long czas, dystans;
 
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  czas = pulseIn(echoPin, HIGH);
  dystans = czas / 58;

 
  return dystans;


}
 
void zakres(int a, int b) {
  int jakDaleko = zmierzOdleglosc();
  if ((jakDaleko > a) && (jakDaleko < b)) {
      digitalWrite(8, LOW); //Włączamy buzzer
  } else {
      digitalWrite(8, HIGH); //Wyłączamy buzzer, gdy obiekt poza zakresem
  }

{

  lcd.setCursor(0,0);
  lcd.print("Czas: ");
  lcd.print(rtc.getTimeStr());

  lcd.setCursor(0,1);
  lcd.print("Data: ");
  lcd.print(rtc.getDateStr());


//  lcd.clear(); 
}

}



pozdrawiam i dzięki za pomoc.

Polecany artykuł » Kurs Intel Edison - #9 - Własny czujnik w chmurze


Postaw piwo autorowi tego posta
 
 
GrzybekM 



Posty: 1
Pomógł: 1 raz
Otrzymał 1 piw(a)
Skąd: Bochnia
Wysłany: 11-09-2017, 20:50   

Witam :)
Spróbuj najpierw zwiększyć czas w pierwszym delayu w funkcji loop, lub w ogóle przemyśl jeszcze raz sam pomiar odległości i czy nie lepiej byłoby gdyby na przykład czujnik wykrywał obiekt raz na 30(?) sekund, a potem włączał podświetlenie na 10 sekund (lub mniej), uniknąłbyś wtedy konfliktu który może powstawać jeśli już raz uruchomisz podświetlenie, a w zakresie działania czujnika nadal będzie znajdował się jakiś obiekt.
Nie jestem pewien czy to o to chodzi ale myślę, że powinieneś bardziej szczegółowo opisać problem
jajaceek napisał/a:
Nie wyświetla czasu i daty tak jak powinno
Czyli jak?

Postaw piwo autorowi tego posta
 
 
Więcej szczegółów
Wystawiono 1 piw(a):
jajaceek
Jamik 



Posty: 29
Pomógł: 5 razy
Otrzymał 4 piw(a)
Wysłany: 11-09-2017, 23:38   

Witam.
Usuń Serial.begin (9600), bo i tak nie używasz komunikacji szeregowej, a pin 1 pełni u Ciebie funkcję zarówno TX jak i pinu obsługującego wyświetlacz LCD. Nie wiem, czy to nie wywoła konfliktu.
I po co blok wyświetlania czasu i daty masz w nawiasach klamrowych?
Napisz jak powinno wyświetlać, a jak wyświetla komunikaty.
Pozdrawiam.

Postaw piwo autorowi tego posta
 
 
Więcej szczegółów
Wystawiono 1 piw(a):
jajaceek
jajaceek 



Posty: 3
Wysłany: 12-09-2017, 11:35   

Wielkie dzięki za pomoc.

Przeniosłem piny 1 i 2 na 2 i 3 oraz usunąłem Serial.begin i jest wszystko ok. Nie usunąłem bloku czasowego z nawiasów klamrowych. Nie wiem czy to ma znaczenie i czy powinienem je usunąć.

Problem polegał na tym, że czas (oraz data oraz wszystkie dane, które chciałem wyświetlać) były prawie poprawnie wyświetlane za pierwszym razem - tzn pewnie przy pierwszym odświeżeniu (przejściu) pętli, było tylko przesunięcie pozycji o jeden kursor w prawo. Następnie przy kolejnej pętli dane zamiast być wyświetlane na tej samej pozycji i zastępować poprzednie (np. aktualizacja czasu) to były wyświetlane sześć czy siedem kursorów w prawo czyli obok poprzednich danych. Było wrażenie srollowania danych. Nie wiem czy jasno to opisałem ale mam nadzieję, że przekazałem ideę tego jak to się wyświetlało.

Jeszcze raz dzięki.

Polecany artykuł » Podstawy mikrokontrolerów PIC. Bity konfiguracyjne.


Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Przysyłanie/Odbieran... Arduino, problem z o... Arduino i programowa... Arduino ATmega 328-k...
lub przeszukaj forum po wybranych tagach: 1602, czujnikiem, ds3231, hcsr04, lcd, modulem, rtc, wykorzystaniem, zegarem


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki