2 x DS18B20 + jeden FAN = problem

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
clonio
Młodszy majsterkowicz
Posty: 5
Rejestracja: 13 lip 2015, 10:51

2 x DS18B20 + jeden FAN = problem

Post autor: clonio » 13 lip 2015, 11:10

Witam wszystkich, jako nowy na forum i bardzo początkujący w temacie Arduino.

Zbudowałem sobie taki sterownik:
2 termometry DS18B20 - "zewnętrzny" i "wewnętrzny"
1 wentylator
wyświetlacz wskazujący temperaturę i obroty
dioda rgb zmieniająca kolory zależnie od temperatury.

Założenie jest aby przy wzroście temperatury na dowolnym termometrze zwiększały się obroty tego jednego wentylatora i zmieniał kolor diody. I to działa ... prawie :(
Odczyty temp są poprawne, wyswietlają się, natomiast zwiększenie obrotów wentylatora działa tylko przy wzroście temp jednego czujnika. Przy wzroście temp na drugim czujniku wentylator tylko drga - dostaje napięcie na <1s i potem pętla.
ALE - dioda RGB działa prawidłowo dla obu termometrów. Kombinuje na wszystkie sposoby i nie rozumiem co jest źle, pomóżcie bo nie ogarniam.

Kod: Zaznacz cały

#include <OneWire.h>
#include <DallasTemperature.h>

#include <ShiftLCD.h>
ShiftLCD lcd(2, 4, 3);

// dioda rgb piny
int RedPin = 8;
int GreenPin = 10;
int BluePin = 9;

   int fan = 11; // the pin where fan is
   int temp;
   int tempMin = 28; // the temperature to start the fan
   int tempMax = 50; // the maximum temperature when fan is at 100%
   int fanSpeed;
   int fanLCD;

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 1
#define TEMPERATURE_PRECISION 9

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// DeviceAddress insideThermometer, outsideThermometer;
  DeviceAddress insideThermometer = { 0x28, 0xD8, 0xBB, 0x50, 0x05, 0x0, 0x0, 0xA9 };
  DeviceAddress outsideThermometer  = { 0x28, 0xFF, 0x5C, 0x71, 0x12, 0x14, 0x0, 0x9 };

void setup()
{
  lcd.begin(16, 2);
// start serial port
  Serial.begin(9600);
  
// Start up the library
  sensors.begin(); // IC Default 9 bit. 

  pinMode(RedPin, OUTPUT);
  pinMode(GreenPin, OUTPUT);
  pinMode(BluePin, OUTPUT); 
   
   pinMode(fan, OUTPUT); 
}

void printTemperature(DeviceAddress deviceAddress)
{
 float tempC = sensors.getTempC(deviceAddress);

 Serial.print(tempC);
 

    if((sensors.getTempC(outsideThermometer) < tempMin) && (sensors.getTempC(insideThermometer) < tempMin )) {
    fanSpeed = 0; // fan is not spinning
    digitalWrite(fan, LOW);
    digitalWrite(RedPin, HIGH);
    digitalWrite(BluePin, HIGH);
    digitalWrite(GreenPin, LOW);
      }
    
    else
    if((sensors.getTempC(outsideThermometer) >= tempMin) && (sensors.getTempC(outsideThermometer) <= tempMax)) {
    fanSpeed = map(tempC, tempMin, tempMax, 35, 110); // the actual speed of fan
    fanLCD = map(tempC, tempMin, tempMax, 0, 100); // speed of fan to display on LCD
    analogWrite(fan, fanSpeed); // spin the fan at the fanSpeed speed
    digitalWrite(RedPin, HIGH);
    digitalWrite(BluePin, LOW);
    digitalWrite(GreenPin, HIGH);
    }
    
       else
    if((sensors.getTempC(insideThermometer) >= tempMin) && (sensors.getTempC(insideThermometer) <= tempMax)) { 
    fanSpeed = map(tempC, tempMin, tempMax, 35, 110); // the actual speed of fan
    fanLCD = map(tempC, tempMin, tempMax, 0, 100); // speed of fan to display on LCD
    analogWrite(fan, fanSpeed); // spin the fan at the fanSpeed speed
    digitalWrite(RedPin, HIGH);
    digitalWrite(BluePin, HIGH);
    digitalWrite(GreenPin, HIGH);
    } 
    
    else
    if((sensors.getTempC(outsideThermometer) >= tempMax) && (sensors.getTempC(insideThermometer)) >= tempMax ) {
    fanSpeed = map(tempC, tempMin, tempMax, 35, 110); // the actual speed of fan
    fanLCD = map(tempC, tempMin, tempMax, 0, 100); // speed of fan to display on LCD
    analogWrite(fan, fanSpeed); // spin the fan at the fanSpeed speed
    digitalWrite(RedPin, LOW);
    digitalWrite(BluePin, HIGH);
    digitalWrite(GreenPin, HIGH);
    }
 }
  

  void loop(void)
{ 

//  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
    
  Serial.print("Temperature for insideThermometer is: ");
 printTemperature(insideThermometer);
 Serial.println();

  Serial.print("Temperature for outsideThermometer is: ");
 printTemperature(outsideThermometer);
 Serial.println();

    // wait a bit for the entire message to arrive
  delay(1000);
    // clear the screen
    lcd.clear();
    // read all the available characters
 {
      // display each character to the LCD
      lcd.setCursor(0, 0);
      lcd.print("Temp out:");
      lcd.setCursor(11, 0);
      lcd.print(sensors.getTempC(outsideThermometer));
 
           lcd.setCursor(0, 1);
           lcd.print("Temp in:");
           lcd.setCursor(11, 1);
     lcd.print(sensors.getTempC(insideThermometer));
       delay(1700);
               lcd.clear();
               lcd.setCursor(0, 0);
               lcd.print("FANS: ");
               if (fanLCD <= 40)
              {lcd.print("LOW");
  }
 else
  if (fanLCD >= 100)
  {lcd.print("HIGH");}
  
  else
    { lcd.print(fanLCD); // display the fan speed
    lcd.print("%");}
           
}
}

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
dzasek
Młodszy majsterkowicz
Posty: 44
Rejestracja: 21 sty 2015, 09:24

Re: 2 x DS18B20 + jeden FAN = problem

Post autor: dzasek » 13 lip 2015, 12:04

fanLCD jakie wartości podawane są na wyświetlaczu
Awatar użytkownika
dzasek
Młodszy majsterkowicz
Posty: 44
Rejestracja: 21 sty 2015, 09:24

Re: 2 x DS18B20 + jeden FAN = problem

Post autor: dzasek » 13 lip 2015, 12:11

fanSpeed=map(tempC, tempMin,tempMax,60,255); spróbuj tego
clonio
Młodszy majsterkowicz
Posty: 5
Rejestracja: 13 lip 2015, 10:51

Re: 2 x DS18B20 + jeden FAN = problem

Post autor: clonio » 13 lip 2015, 12:15

FanLCD - ma wartości LOW ... wartości % obrotów .... High (zależnie od tempMin i tempMax)
Ale zmieniają się tylko dla wzrastającej temp "poprawnego termometru".
Gdy podnoszę temp na drugim czujniku to fanLCD daje mi zawsze LOW
Awatar użytkownika
dzasek
Młodszy majsterkowicz
Posty: 44
Rejestracja: 21 sty 2015, 09:24

Re: 2 x DS18B20 + jeden FAN = problem

Post autor: dzasek » 13 lip 2015, 13:19

Może w pierwszym if-e zmień z&& na || (czyli z i na lub)
clonio
Młodszy majsterkowicz
Posty: 5
Rejestracja: 13 lip 2015, 10:51

Re: 2 x DS18B20 + jeden FAN = problem

Post autor: clonio » 13 lip 2015, 13:33

Jak napisałem, wszystko działa OK dla jednego czujnika i zawsze każdy "if" działa dla diody RGB, tylko podanie napięcia na fan jest nietrwałe.
Awatar użytkownika
dzasek
Młodszy majsterkowicz
Posty: 44
Rejestracja: 21 sty 2015, 09:24

Re: 2 x DS18B20 + jeden FAN = problem

Post autor: dzasek » 13 lip 2015, 13:42

Może twoje arduino prądowo nie wyrabia?
razorxx100
Starszy majsterkowicz
Posty: 329
Rejestracja: 1 sie 2014, 22:57

Re: 2 x DS18B20 + jeden FAN = problem

Post autor: razorxx100 » 13 lip 2015, 14:06

Wentylator ma zapewne komputerowy, czyli jest na 12v(raczej nie zasili tego z arduino).Wyswietlac,dioda rgb i dwa czujniki to nie jest jednak taki duzy pobor pradu.Jakim zasilaczem zasilasz arduino?

@Edit
Na szybko sprawdzilem kod i czy to migotanie wentylatorem nie jest poprostu spowodowane on/off, czyli jak na jednym jest niska temp a na drugim wysoka, wtedy on poprostu daje on/off co iles tam millis i dlatego jest migotanie?
clonio
Młodszy majsterkowicz
Posty: 5
Rejestracja: 13 lip 2015, 10:51

Re: 2 x DS18B20 + jeden FAN = problem

Post autor: clonio » 13 lip 2015, 14:20

Fan dostaje 12v - sterowany tranzystorem na wyjściu PWM. Poza tym jak pisałem na jednym czujniku wentylator chodzi w pełnym zakresie prędkości. Klapa jest dla drugiego czujnika. Oczywiście wada czujnika i połączenia raczej wykluczona (zamiana miejsc w szeregu + zamiana adresacji)

wg mnie kod powinien wyłączać dopiero jeśli obydwa termometry są poniżej temMin (tam jest &&) . Ale dlatego dopytuje. I dlaczego dioda poprawnie zmienia kolory?
stiven
Złota rączka
Posty: 1593
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: 2 x DS18B20 + jeden FAN = problem

Post autor: stiven » 13 lip 2015, 16:14

Krapi warunki są napisane w taki sposób, że i tak zawsze tylko 1 będzie prawdziwy, więc to nie o to chodzi. Jakby miałoby być na raz spełnionych kilka warunków, to by to było bez sensu.

Właściwie to nie, jednak się mylę, masz rację, jeśli warunek drugi jest spełniony(temp zewnętrzna w przedziale 28 - 50 stopni), to warunek trzeci też może być prawdziwy, ale się nie wykona.

Ale teraz likwidując else i robiąc 4 niezależne ify, to znowu będzie źle, bo będą się wykonywać 2 ify, więc trzeba to jeszcze trochę inaczej zrobić, dopisać może dodatkowe warunki, tak żeby przewidziana była każda możliwa sytuacja.
clonio
Młodszy majsterkowicz
Posty: 5
Rejestracja: 13 lip 2015, 10:51

Re: 2 x DS18B20 + jeden FAN = problem

Post autor: clonio » 14 lip 2015, 00:34

Dzięki za podpowiedzi, ale obawiam się że tu chodzi o coś innego.
Jeśli zostawiam tylko dwa warunki taki:

Kod: Zaznacz cały

 
   if(((sensors.getTempC(insideThermometer) >= tempMin) && (sensors.getTempC(insideThermometer) <= tempMax)) || ((sensors.getTempC(outsideThermometer) >= tempMin) && (sensors.getTempC(outsideThermometer) <= tempMax))) { 
    fanSpeed = map(tempC, tempMin, tempMax, 40, 180); // the actual speed of fan
    fanLCD = map(tempC, tempMin, tempMax, 0, 100); // speed of fan to display on LCD
    analogWrite(fan, fanSpeed); // spin the fan at the fanSpeed speed
    digitalWrite(RedPin, HIGH);
  digitalWrite(BluePin, LOW);
  digitalWrite(GreenPin, HIGH);
    }
    else
   if((sensors.getTempC(outsideThermometer)) < tempMin && (sensors.getTempC(insideThermometer) < tempMin )) {
  fanSpeed = 0; // fan is not spinning
   digitalWrite(fan, LOW);
   digitalWrite(RedPin, HIGH);
  digitalWrite(GreenPin, LOW);
  digitalWrite(BluePin, HIGH);
   }
to i tak start wentylatora działa tylko na jednym sensorze.
Zamieniałem w warunku czujniki miejscami na taki zapis:

Kod: Zaznacz cały

 if(((sensors.getTempC(outsideThermometer) >= tempMin) && (sensors.getTempC(outsideThermometer) <= tempMax)) || ((sensors.getTempC(insideThermometer) >= tempMin) && (sensors.getTempC(insideThermometer) <= tempMax))) { 
    fanSpeed = map(tempC, tempMin, tempMax, 40, 180); // the actual speed of fan
    fanLCD = map(tempC, tempMin, tempMax, 0, 100); // speed of fan to display on LCD
    analogWrite(fan, fanSpeed); // spin the fan at the fanSpeed speed
    digitalWrite(RedPin, HIGH);
  digitalWrite(BluePin, LOW);
  digitalWrite(GreenPin, HIGH);
ale nadal ten sam jeden czujnik odpala wentylator a na drugim czujniku wentylator tylko pulsuje.
Natomiast jak zmienię miejscami przypisanie adresu tutaj:

Kod: Zaznacz cały

  DeviceAddress outsideThermometer = { 0x28, 0xD8, 0xBB, 0x50, 0x05, 0x0, 0x0, 0xA9 };
  DeviceAddress insideThermometer   = { 0x28, 0xFF, 0x5C, 0x71, 0x12, 0x14, 0x0, 0x9 };
to role czujników się odwracają
Poza tym, jak pisałem w pierwszym poście - kolory diody zmieniają się bezbłędnie dla obu czujników i wszystkich warunków. Jest tylko jakiś problem z utrzymaniem napięcia. Nie rozumiem.
stiven
Złota rączka
Posty: 1593
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: 2 x DS18B20 + jeden FAN = problem

Post autor: stiven » 14 lip 2015, 11:00

A no właśnie Krapi, w loop jest wywoływane coś takiego:

Kod: Zaznacz cały

  Serial.print("Temperature for insideThermometer is: ");
 printTemperature(insideThermometer);
 Serial.println();

  Serial.print("Temperature for outsideThermometer is: ");
 printTemperature(outsideThermometer);
 Serial.println();
I później w funkcji printTemperature() tempC jest zależne od tego parametru, który jest przy wywoływaniu funkcji w loop (czyli to float tempC = sensors.getTempC(deviceAddress) i potem mapowanie). W loop printTemperature(outsideThermometer) jest jako drugie, więc outsideThermometer ma większy wpływ na działanie wentylatora i pewnie to przy tym czujniku wentylator działa lepiej? (na ułamek sekundy ma wpływ insideThermometer, a potem outsideThermometer, ale outsideThermometer dużo większy, bo po printTemperature(outsideThermometer) jest jeszcze wyświetlanie na wyświetlaczu). Dlatego właśnie trzeba zmienić koncepcję, żeby nie było takiej sytuacji, że wentylator co ułamek sekundy dostaje 2 różne informację o prędkości. Wentylator ma zwiększyć prędkość, ale zaraz zmniejszyć, więc nie zdąża się nawet dobrze rozkręcić. Tylko zastanawia mnie dlaczego dioda nie mruga.
Poza tym kiedyś zauważyłem, że jest problem z warunkami w ifach, kiedy wartości porównywane są typu float.
ODPOWIEDZ

Strony partnerskie: