arduino przekaźniki

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
stasiu835
Młodszy majsterkowicz
Posty: 1
Rejestracja: 13 cze 2018, 14:08

arduino przekaźniki

Post autor: stasiu835 » 13 cze 2018, 14:13

witam mam problem z przekaźnikami pod leonardo, kiedy pracuje program bez obciążenia to wszystko działa elegancko się przełącza, gdy podłączam obciążenie (pompę) to przekaźniki się wieszają zatrzymują się lub działa to niezgodnie z programem, szybsze wyłączenie/skoki ktoś ma jakiś pomysł ?

Program mierzy wilgotność 3 czujniki i 3 pompy do każdego czujnika oddatkowo jest serwo które steruje otwieraniem okna po odczytaniu temperatury.

kod programu :

Kod: Zaznacz cały

#include <Servo.h> //Biblioteka odpowiedzialna za serwa


// which analog pin to connect
#define THERMISTORPIN A0         
// resistance at 25 degrees C
#define THERMISTORNOMINAL 10000      
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25   
// how many samples to take and average, more takes longer
// but is more 'smooth'
#define NUMSAMPLES 5
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3950
// the value of the 'other' resistor
#define SERIESRESISTOR 10000   

#define limit 3

int czujka1 = A1;
int czujka2 = A2;
int czujka3 = A3;

int pompa1 = 2;
int pompa2 = 3;
int pompa3 = 4;

int srednia1 = 0;
int srednia2 = 0;
int srednia3 = 0;
int odczyt1 = 0;
int odczyt2 = 0;
int odczyt3 = 0;

int stan1 = 0;
int stan2 = 0;
int stan3 = 0;

int ilosc_odczytow = 0;


int D10 = 12; 
uint16_t samples[NUMSAMPLES];

Servo myservo;

int pos = 95;    //pozycja stop serva
int poso = 110;  //otwieranie okna
int posz = 82;  //zamykanie okna
int stano = 0;   //czy okno otwarte czy zamkniete

void setup() {

  Serial.begin(9600); 
  myservo.attach(9); //servo pin Cyfrowy 9
  
  pinMode(czujka1, INPUT);
  pinMode(pompa1, OUTPUT);
  
  pinMode(czujka2, INPUT);
  pinMode(pompa2, OUTPUT);
  
  pinMode(czujka3, INPUT);
  pinMode(pompa3, OUTPUT);

}

void loop() {

  myservo.write(pos); 

  delay(5000);
 

if (ilosc_odczytow <= limit){
  ilosc_odczytow += 1;

stan1 = digitalRead(czujka1);
stan2 = digitalRead(czujka2);
stan3 = digitalRead(czujka3);


odczyt1 += analogRead(czujka1);
srednia1 = (ceil(odczyt1/ilosc_odczytow)-23);


Serial.println(srednia1);

    if(srednia1 >= 500){
      delay(200);      
      Serial.println("podlewanie1");
      delay(200);
      digitalWrite(pompa1, HIGH);
      delay(2000);
      digitalWrite(pompa1, LOW);
      delay(200);

    }
odczyt2 +=analogRead(czujka2);
srednia2 = (ceil(odczyt2/ilosc_odczytow)-23);

Serial.println(srednia2);

    if(srednia2 >= 500){
      delay(200);
      Serial.println("podlewanie2");
      delay(200);
      digitalWrite(pompa2, HIGH);
      delay(2000);
      digitalWrite(pompa2, LOW);
      delay(200);
    }
    odczyt3 +=analogRead(czujka3);
srednia3 = (ceil(odczyt3/ilosc_odczytow)-23);

Serial.println(srednia3);

    if(srednia3 >= 500){
      delay(200);
      Serial.println("podlewanie3");
      delay(200);
      digitalWrite(pompa3, HIGH);
      delay(2000);
      digitalWrite(pompa3, LOW);
      delay(200);
    }
  }
  
if (ilosc_odczytow > limit){
  ilosc_odczytow = 0;
  odczyt1 = 0;
  odczyt2 = 0;
  odczyt3 = 0;

  }
   float reading;
  uint8_t i;

   for (i=0; i< NUMSAMPLES; i++) {
   samples[i] = analogRead(THERMISTORPIN);
   delay(10);
  }
//Do 1  reading = analogRead(THERMISTORPIN);

  reading = 0;
  for (i=0; i< NUMSAMPLES; i++) {
     reading += samples[i];
  }
  reading /= NUMSAMPLES;
 
  // convert the value to resistance
  reading = (1023 / reading)  - 1;     // (1023/ADC - 1) 
  reading = SERIESRESISTOR / reading;  // 10K / (1023/ADC - 1)

  float steinhart;
  steinhart = reading / THERMISTORNOMINAL;     // (R/Ro)
  steinhart = log(steinhart);                  // ln(R/Ro)
  steinhart /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
  steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
  steinhart = 1.0 / steinhart;                 // Invert
  steinhart -= 273.15;                         // convert to C
  Serial.print("Temperature "); 
  Serial.print(steinhart);
  Serial.println(" *C");

  Serial.println(stano);

  if (steinhart > 33.00)
  {
    if (stano == 0)
    {
    myservo.write(poso);
    delay(20000);
    stano = 1;
    Serial.println(stano);
    }
  }
  if (steinhart < 25.00)
  {    
    if (stano == 1)
    {
    myservo.write(posz);
    delay(21000);
    stano = 0;
    Serial.println(stano);
    }
  }
  
}

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


kaczakat
Młodszy majsterkowicz
Posty: 26
Rejestracja: 8 wrz 2017, 15:01

Re: arduino przekaźniki

Post autor: kaczakat » 6 lip 2018, 23:19

Problemem jest zapewne zasilanie. Czy program jest powodem sprawdzisz eliminując procesor, sterując przekaźnikami ręcznie. Nie napisałeś jak co zasilasz, nie ma schematu, a kod programu sugeruje, że programujesz od niedawna (nie doleciałeś do lekcji o millis - dużo delay, dokładnej analizy nie zrobię dzisiaj). Co do zasady Arduino powinno mieć swój zasilacz, płytka z przekaźnikami swój, a między nimi optoizolacja (nie osiągniesz tego płytkami przekaźników z Chin). Jaką moc mają pompy, jaki prąd pracy, jaki prąd rozruchowy, jaki prąd max mają przekaźniki ?
ODPOWIEDZ

Strony partnerskie: