• 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
Sterownik pompy CO
#1
Witam.
Na wstępie chciałbym zaznaczyć że jestem początkującym i umie tyle ile mogłem nauczyć się z internetu oraz własnych doświadczeń.
Chciałbym przedstawić mój projekt sterownika pompy CO oraz poprosić o pomoc w rozwiązaniu pewnych problemów jakie zauważyłem. A mianowicie chodzi mi o odczyt wartości potencjometru który ma nastawiać docelową temperaturę załączania pompy. Odczyt jest opóźniony i często przekręcam wartość docelową i muszę "szukać" wartości jaką potrzebuję. Ponadto chciałbym zrobić ręczne załączenie pompy.

To kod:
Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define ONE_WIRE_BUS 11
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int odczytanaWartosc = A0;
float tempz = 0;

void setup(void)
{
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("T.Pieca    =");
  lcd.setCursor(0,1);
  lcd.print("T.Boilera  =");
  lcd.setCursor(0,2);
  lcd.print("Stan pompy =");
  lcd.setCursor(0,3);
  lcd.print("Start pompy");
sensors.begin();
}
void loop(void)
{
   odczytanaWartosc = analogRead(A0);
  tempz = odczytanaWartosc * (100.0/1024.0);
sensors.requestTemperatures();
lcd.setCursor(14,0);

lcd.print(sensors.getTempCByIndex(0));
lcd.setCursor(14,1);

lcd.print(sensors.getTempCByIndex(1));

if (sensors.getTempCByIndex(0)>=tempz){digitalWrite(12,LOW);
lcd.setCursor(14,2);
lcd.print("PRACA");

}
if (sensors.getTempCByIndex(0)<=tempz -6){digitalWrite(12,HIGH);
lcd.setCursor(14,2);

lcd.print("STOP ");
}

{lcd.setCursor(14,3);
lcd.print(tempz);}

delay(10);
}
 
Odpowiedź
#2
1. Analog odczytujesz na początku pętli loop() ale na wyświetlacz dajesz tę wartość pod koniec pętli.
2. Niepotrzebnie 3 razy czytasz z jednego czujnika(indeks 0). Pobierz wartość temperatury do zmiennej i operuj na tej zmiennej.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
Faktycznie pomogło i jest szybciej. A czy możesz podpowiedzieć jak zrobić sterowanie wyborem temperatury z przycisków?
 
Odpowiedź
#4
Wszystko jest w przykładzie button jak obsłużyć przyciski oraz musisz użyć obsługi eeprom do zapamiętania wartości.
A tak zmieniasz wartość
Kod:
if(s1==0){tempz++;}
if(s2==0){tempz--;}
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#5
Co tu jest nie w hallo. Nie działa mi to. Pogubiłem się w tym...



#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
const int A = 6;     
const int B = 7;      
int tempz = 50;         

void setup() 
{
 
  pinMode(A, INPUT_PULLUP);
  pinMode(B, INPUT_PULLUP);
  lcd.begin(16,2);
  lcd.setCursor(8,0);
  lcd.print(tempz);
}

void loop() 
{


 
    if(digitalRead(A)==LOW){tempz++;}
    if(digitalRead(B)==LOW){tempz--;}
}
 
Odpowiedź
#6
A gdzie w progamie reagujesz na zmianę tempz?
To co zamieściłeś w zasadzie "nic nie robi". Zamieszczaj cały program.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#7
(08-02-2017, 08:58)namok napisał(a): A gdzie w progamie reagujesz na zmianę tempz?
To co zamieściłeś w zasadzie "nic nie robi". Zamieszczaj cały program.

Witam. Ja ten algorytm później wpasuję sobie w program tylko problem jest w tym że to co wypociłem nie zmienia mi wartości  "tempz". Prosiłbym o poprawę kodu bo ( co tu owijać w bawełnę ) ja niedaję rady.
 
Odpowiedź
#8
(08-02-2017, 10:48)ferdricco napisał(a):
(08-02-2017, 08:58)namok napisał(a): A gdzie w progamie reagujesz na zmianę tempz?
To co zamieściłeś w zasadzie "nic nie robi". Zamieszczaj cały program.

Witam. Ja ten algorytm później wpasuję sobie w program tylko problem jest w tym że to co wypociłem nie zmienia mi wartości  "tempz".
Taki program(trzoszkę go zmodyfikowałem) musi działać
Kod PHP:
const int A 6;
const 
int B 7;
int tempz 50;

void setup()
{

 
   pinMode(AINPUT_PULLUP);
 
   pinMode(BINPUT_PULLUP);
 
   Serial.begin(9600);
}

void loop()
{
 
   if(digitalRead(A)==LOW) {
 
       tempz++;
 
   }
 
   if(digitalRead(B)==LOW) {
 
       tempz--;
 
   }
 
   
    Serial
.println(tempz);

Jeśli nie działa to albo jest uszkodzone wejście albo źle podpięte.
Taki program to w zasadzie abecadło. Jeśli z tym masz problemy to najwyższa pora przerobić jakiś kurs np. z forbot.pl
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#9
(08-02-2017, 14:38)namok napisał(a):
(08-02-2017, 10:48)ferdricco napisał(a):
(08-02-2017, 08:58)namok napisał(a): A gdzie w progamie reagujesz na zmianę tempz?
To co zamieściłeś w zasadzie "nic nie robi". Zamieszczaj cały program.

Witam. Ja ten algorytm później wpasuję sobie w program tylko problem jest w tym że to co wypociłem nie zmienia mi wartości  "tempz".
Taki program(trzoszkę go zmodyfikowałem) musi działać
Kod PHP:
const int A 6;
const 
int B 7;
int tempz 50;

void setup()
{

 
   pinMode(AINPUT_PULLUP);
 
   pinMode(BINPUT_PULLUP);
 
   Serial.begin(9600);
}

void loop()
{
 
   if(digitalRead(A)==LOW) {
 
       tempz++;
 
   }
 
   if(digitalRead(B)==LOW) {
 
       tempz--;
 
   }
 
   
    Serial
.println(tempz);

Jeśli nie działa to albo jest uszkodzone wejście albo źle podpięte.
Taki program to w zasadzie abecadło. Jeśli z tym masz problemy to najwyższa pora przerobić jakiś kurs np. z forbot.pl

Ok. Już widzę gdzie błąd popełniłem. Skupiłem swoją uwagę na czymś innym a zapomniałem o przesłaniu informacji na lcd. Dzięki za pomoc namok.
 
Odpowiedź
#10
Witam. I znów pojawił się  problem tym razem z funkcjonowaniem gotowego urządzenia. 
 Problem w tym że po około 1-2 godzinach pracy system się wiesza. Oba odczyty zatrzymują się na 60*C a pompa 
albo pracuje albo nie. Poza tym na wyświetlaczu pojawiają się dziwne znaki. Czasem odczyt temperatury na wyświetlaczu zmienia się na zapis z dwóch zer po przecinku na trzy zera po przecinku. 
 Oto finalny kod:

Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h> 
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define ONE_WIRE_BUS 11
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
const int A=6;
const int B=7;
float tempz = 50;

void setup(void)
{
  pinMode(A, INPUT_PULLUP);
  pinMode(B, INPUT_PULLUP);
  pinMode(12,OUTPUT);
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("T.Pieca    =");
  lcd.setCursor(0,1);
  lcd.print("T.Boilera  =");
  lcd.setCursor(0,2);
  lcd.print("Stan pompy =");
  lcd.setCursor(0,3);
  lcd.print("Start pompy=");
sensors.begin();


}
void loop(void)
{
   { if(digitalRead(A)==LOW){tempz++;}
    if(digitalRead(B)==LOW){tempz--;}
    lcd.setCursor(14,3); 
    lcd.print(tempz);
     delay(10);}
sensors.requestTemperatures();
lcd.setCursor(14,0);
lcd.print(sensors.getTempCByIndex(0));
lcd.setCursor(14,1);
lcd.print(sensors.getTempCByIndex(1));

if (sensors.getTempCByIndex(0)>=tempz){digitalWrite(12,LOW);
  lcd.setCursor(14,2);
  lcd.print("PRACA");
}
if (sensors.getTempCByIndex(0)<=tempz -6){digitalWrite(12,HIGH);
  lcd.setCursor(14,2);
  lcd.print("STOP ");
}
delay(10);
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości