• 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
Sterowanie temperatury z LCD
#1
Witam. Troszkę poszukałem na forum, niestety nie znalazłem odpowiedzi na mój problem. Może gdzieś i jest bo i postów jest za dużo żeby wszystko znaleźć. Może dla niektórych osób wyda się to banalne - jeśli tak to mam nadzieje ze ktoś szybko odpowie.. no ale do rzeczy:

Mam zbudowany taki projekcik kotła - sterowanie poziomem wody, grzałka wyświetlacz pare LEDów.
Mam problem ze zrobieniem sterowania temperatury z przycisków: chcę zrobić tak żeby na wyświetlaczu była wartość zadana (set) i wartość odczytana (read) temperatury. 2 przyciski jednym zwiększamy wartość temp  o 1, drugim zmniejszamy.

Uwarunkować sama inkrementację czy dekrementację przy samym naciśnięciu przycisku potrafię zrobić, ale nie mam pojęcia jak to zamknąć w przedziale ( temperatura np. od 20stopni do - 80 stopni). Pewnie jakas petla by się przydała?
no i później jak tym załączać grzałkę?

Na dole kod całego programu - narazie bez okreslonych przyciskow , i z temperatura ustaloną w programie.
Kod:
//*****************************************************
#include <OneWire.h>
#include <Wire.h>
#include <Timers.h>
#include <LiquidCrystal_I2C.h>
#include <DallasTemperature.h>
//*****************************************************
Timers <2> akcja;
LiquidCrystal_I2C lcd (0x27,16,2);

#define ODSTEP 1000
#define ONEWIRE_PIN 10

OneWire oneWire(ONEWIRE_PIN);
DallasTemperature sensors(&oneWire);

float Celsius = 0;
float Fahrenheit = 0;

int czujka1 = 3;
int czujka2 = 4;
int pompa = 5;
int grzalka = 6;
int ledgrzalka = 8;
int ledpompa= 9;
int ledp = 11;
int ledpw = 12;


int stan1 = 0;
int stan2 = 0;
int licznik = 0;

unsigned long czas_poprzedni = 0;

void setup() {
        Serial.begin(9600);
        delay(2000);    
        pinMode(czujka1, INPUT);
        pinMode(czujka2, INPUT);
          pinMode(pompa, OUTPUT);
        pinMode(grzalka, OUTPUT);
        pinMode(ledp, OUTPUT);
        pinMode(ledpw, OUTPUT);
        pinMode(ledpompa, OUTPUT);
        pinMode(ledgrzalka, OUTPUT);
        digitalWrite(grzalka,LOW);
        sensors.begin();
        Serial.println("Program START");
        //*****************************************************
        akcja.attach(0, 2001, woda);
        akcja.attach(1, 5001, temperatura);
        akcja.attach(2, 50000000, alarmy);
        //*****************************************************       
        lcd.init();
        lcd.backlight();
       
   

}

void loop()
{
  sensors.requestTemperatures();
  Celsius = sensors.getTempCByIndex(0);
  Fahrenheit = sensors.toFahrenheit(Celsius);
  lcd.setCursor(0, 0);
  lcd.print("Temperature");
  lcd.setCursor(0, 1);
  lcd.print(Celsius);
  lcd.setCursor(6,1);
  lcd.print((char)223);
  lcd.print("Celsius");


  akcja.process(); //aktywujemy wątki
    unsigned long czas_aktualny = millis();
    if(czas_aktualny - czas_poprzedni > ODSTEP)
    
    {
    czas_poprzedni = czas_aktualny;
        licznik = licznik + 1;
    }

}



void woda()
{
   stan1 = digitalRead(czujka1);
   stan2 = digitalRead(czujka2);
   
   if (stan1==1 && stan2==1)
   {
    digitalWrite (pompa,HIGH);
    Serial.println("Pompka OFF");
   }
    else if (stan1==0 && stan2==0)
   {
   digitalWrite (pompa, LOW);
   
   Serial.println("Pompka ON");
   }
   if (digitalRead (pompa) == LOW)
   {
    digitalWrite (ledpompa,HIGH);
   }
   else
   {
    digitalWrite (ledpompa,LOW);
   }
}


void temperatura()
{
  stan1 = digitalRead(czujka1);
  Serial.println(sensors.getTempCByIndex(0));
 
  if (Celsius >= 40.00 || stan1==0)
    {
    digitalWrite(grzalka,HIGH);
    Serial.print("Grzalka OFF");
    }
    else
    {
      digitalWrite(grzalka,LOW);
      Serial.println("Grzalka ON");
    }
    if (digitalRead (grzalka) == LOW)
   {
    digitalWrite (ledgrzalka,HIGH);
   }
   else
   {
    digitalWrite (ledgrzalka,LOW);
   }
}

void alarmy()
{
if (digitalRead(czujka1) == 0 && digitalRead(czujka2) == 0)
{
  digitalWrite(ledp, HIGH);
  }
  else
  {
    digitalWrite(ledp, LOW);
    }
    if (digitalRead(czujka1) == 1 && digitalRead(czujka2) == 1)
    {
    digitalWrite(ledpw, HIGH);
    }
    else
    {
      digitalWrite(ledpw, LOW);
    }
}
 
Odpowiedź
#2
Zrob w ifie, gdy wartość zadana będzie mniejsza niż 19 to wykonaj zmianę na 20 i tyle.
A jak przekroczy 80 to ustaw 80.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości