Skocz do zawartości
KaPl

Arduino – źle wyświetla temperaturę

Pomocna odpowiedź

Cześć

Przychodzę z problemem z Arduino. Mianowicie robię projekt od sterowania ogrzewaniem w domu i używam wyświetlacza 20x2(zwykły, bez I2C), czujnika temperatury LM35(będą używane 3, ale na czas pisania kodu używam tylko jednego) oraz modułu RTC DS3231(I2C). Problem polega na tym, że gdy podłącze wszystko razem wychodzi mi zła temperatura(45*C). W momencie, gdy odłączę RTC(który jest podpięty pod SDA,SCL) to temperatura pokazuję się dobra(28*C). I teraz nie wiem czy to kwestia obliczeń, które zapisałem w kodzie, czy czegoś innego. I jeszcze jakby ktoś mógł podpowiedzieć, chcę dodać zmianę czasu z letniego na zimowy. Miałem pomysł aby zrobić dwa voidy(jeden odpowiadałby za czas letni, drugi za zimowy), ale zrezygnowałem z tego pomysłu. Stąd drugie pytanie: Macie jakieś pomysły jak by to zrobić? 

Pozdrawiam

#include <DS3231.h>
#include <LiquidCrystal.h> // includes the LiquidCrystal Library

DS3231  rtc(SDA, SCL);
LiquidCrystal lcd(12,11,5,4,3,2); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)

void setup() { 
  rtc.begin(); // Initialize the rtc object
    // The following lines can be uncommented to set the date and time
    //rtc.setTime(18,3,20);     // Set the time to 12:00:00 (24hr format)
    //rtc.setDate(2, 11, 2019);   // Set the date to January 1st, 2014
  
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  
  Serial.begin(9600);
  
 lcd.begin(20,4); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display
}

void loop() {

    float odczyt = analogRead(A5);

    float temp = analogRead(A5) * (5.0/1024.0) * 10;

    Serial.print("Odczyt: ");
    Serial.println(odczyt);

    Serial.print("Temp: ");
    Serial.println(temp);
    
    delay(1000);

}

 

Udostępnij ten post


Link to post
Share on other sites

Może zacznij od zwykłego zmierzenia napięcia na pinie A5? Na podstawie danych katalogowych LM35 policz sobie najpierw czego powinieneś spodziewać się dla temperatury pokojowej (naprawdę masz tam 28°C?) i zwyczajnie to zweryfikuj. Zobacz, czy to napięcie zmienia się po podłączeniu LCD czy tam innych rzeczy i wyśledź dlaczego. A jeśli się nie zmienia a wyniki konwersji i owszem to znaczy, że zmienia się referencja przetwornika. W tym przypadku jest nią zasilanie 5V (we wzorze masz 5.0) więc może ono pływa? Je zmierz także i będziesz miał odpowiedź. A przyczynę to już sam znajdź. Ani nie wiemy co to za Arduino, ani z czego je zasilasz więc co tu zgadywać. Może głodzisz go 6V podawanymi na VIN, może masz jakąś bateryjkę która ledwo zipie i o Vcc=5V można tylko pomarzyć? Jak już wymyślisz gdzie tkwi problem to daj znać.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Hej, przecież piny A4 i A5 to to samo co SCL/SDA, nie możesz ich używać razem z I2C!

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites
7 godzin temu, KaPl napisał:

I jeszcze jakby ktoś mógł podpowiedzieć, chcę dodać zmianę czasu z letniego na zimowy.

Najpierw musisz zrobić wieczny kalendarz aby na podstawie daty określić czy masz ostatnią niedziele marca lub października. Dalej prosta sprawa, np dzień wcześniej ustawiasz flagę zmiany czasu. Gdy minie godzina 2:00 ostatniej niedzieli a flaga zmiany czasu ustawiona, dodajesz lub odejmujesz godzinę po czym kasujesz flagę zmiany czasu.

Udostępnij ten post


Link to post
Share on other sites
Dnia 16.11.2019 o 23:42, RFM napisał:

Najpierw musisz zrobić wieczny kalendarz aby na podstawie daty określić czy masz ostatnią niedziele marca lub października

Bez sensu - ile tych zmian czasu jeszcze nam zostało? Wystarczy wprowadzić tylko kilka.

Poza tym wiecznego kalendarza wcale nie trzeba robić, każda szanująca się biblioteka zwraca DayOfWeek, a wtedy wystarczy prosta funkcja:`

static int isDST(int month, int day, int hour, int dow)
{
    if (month < 3 || month > 10)  return 0;
    if (month > 3 && month < 10)  return 1;
    int previousSunday = day - dow;
    if (month == 3) {
        return (previousSunday >= 25 && (dow || hour >= 2));
    }
    if (month == 10) {
        return (previousSunday < 25 || (!dow && day >=25 && hour < 2));

    }
    return 0;
}

gdzie "dow" to dzień tygodnia (niedziela to zero) żeby wiedzieć, że trzeba dodać godzinę do wyświetlanego czasu.

Udostępnij ten post


Link to post
Share on other sites
5 godzin temu, ethanak napisał:

żeby wiedzieć, że trzeba dodać godzinę do wyświetlanego czasu.

A co z datą? Jak dodam godzinę o np 23:30, to wyświetli się 0:30 ale nie będzie dzień+.

Trzeba więc albo jednorazowo dodać/odjąć godzinę korzystając z flag albo operować na np czasie UNIX co wymaga konwersji, najpierw z YY-MM-DD mm:gg (RTC) na UNIX, dodanie godziny, ponowna konwersja z UNIX na YY-MM-DD mm:gg.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...