• 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
wykrywanie obecności napięcia sieciowego - jakieś "zakłócenia"
#1
Witam. Zacznę od tego, że jestem amatorem, więc sam projekt (podstawa znaleziona w internecie, ale przerobiłem go i rozbudowałem dla własnych potrzeb), jak i realizacja może mieć wiele niedociągnięć ale w teorii i w emulatorze działa Smile
Chciałem zrobić układ dla pieca CO, który zliczałby ilość spalonego węgla (czas pracy podajnika 230V), wynik resetował co 24h, a odliczanie rozpoczynał od nowa. Dodatkowo na wyświetlaczu pokazuje spalanie z poprzedniego dnia oraz czas do końca dnia.
Ta część działa poprawnie, ale chciałem odliczać ilość spalonego węgla do czasu ponownego napełnienia zbiornika (przyciskiem reset pomiaru) i tutaj jest problem, bo wynik sam się resetuje co jakiś czas. Symulowanie pracy podajnika poprzez mostek działa poprawnie, ale gdy używam przekaźnika z cewką 230V resetuje pomiar. Po podmianie przekaźnika na gotowy układ wykrywający  napięcie sieciowe oraz dołożeniu rezystora podciągającego 10k delikatnie poprawiło sytuację, ale co jakieś kilkanaście przełączeń znów resetuje pomiar.
Prosiłbym o pomoc, co może być powodem, próbowałem zmiany sterowania potencjałem 0, 5V, zmiany wejścia, nawet przejście z płytki UNO (ewentualne uszkodzenie sterownika) na Mega 2560 nie pomogło. Skończyły mi się pomysły więc byłbym wdzięczny za Wasze sugestie.

Kod:
#include <LiquidCrystal.h>
uint8_t flaga1,flaga2;
uint32_t czasStart,czasStart2,czasStart3,czas3,czasStop,ssekundy,suma,hm,m,ssekundy3,suma3;
                                      //ssekundy3, suma3, suma4  (do zliczania calosci wegla)
int h;
float suma1, suma2, suma4;
const int przycisk=A0;
const int przycisk1=A3;               //przycisk resetowania calego wegla
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
void setup()
{
Serial.begin(9600);
pinMode(przycisk,INPUT_PULLUP);
pinMode(przycisk1,INPUT_PULLUP);       //przycisk resetowania calego wegla
pinMode(8, INPUT_PULLUP);
digitalWrite(8, HIGH);
czas3=86399000;
}
void loop()
{
czasStart2=millis();
if(!digitalRead(przycisk))
  {
  flaga1=1;  //sprawdzenie stanu przycisku, jeśli 0 wcisniety, uwaga - flaga1 ustawiam na 1
  }
else
  {
  flaga1=0;                        //jesli przycisk jest wcisniety i poprzednio nie byl to rozpoczynamy zliczanie sekund
  }
if(flaga1 && !flaga2)
  {
  czasStart=millis();                   //jesli przycisk nie jest wcisniety i poprzednio   byl to konczymy zliczanie zliczanie
  }
if(!flaga1 && flaga2)
  {
  czasStop=millis();
  ssekundy=(czasStop-czasStart);
  suma=(ssekundy+suma);                   // suma czasu pracy [ss]
  suma1=suma*0.00458;                     // ilość podawanego węgla (825g/3m => 4,58g/s => 0,00458g/ss)

  ssekundy3=(czasStop-czasStart);
  suma3=(ssekundy3+suma3);                // suma czasu pracy [ss] dla obliczania sumy spalania
  suma4=suma3*0.00458;                    // ilosc podawanego wegla dla obliczania sumy spalania
    {
    lcd.begin(16, 2);                     //Deklaracja typu
    lcd.setCursor(0, 0);                  //Ustawienie kursora
    lcd.print(suma1/1000);                //Wyświetlenie tekstu
    lcd.setCursor(5, 0);
    lcd.print("kg");

    lcd.setCursor(0, 1);                 
    lcd.print(suma2/1000);
    lcd.setCursor(5,1);
    lcd.print("kg");

    lcd.setCursor(8, 0);
    lcd.print(suma4/1000);
    lcd.setCursor(13,0);
    lcd.print(" ");
    lcd.setCursor(14, 0);
    lcd.print("kg");
      if (czasStart2 < 86400000)          //Odliczanie czasu do pierwszego wyzerowania
      {
          hm=((86400000-czasStart2)/60000);
          h=hm/60;
          m=hm-(h*60);
      lcd.setCursor(11,1);
      lcd.print(h);
      lcd.setCursor(13,1);
      lcd.print(':');
      lcd.setCursor(14,1);
      lcd.print(m);
      }
      else                                  //Odliczanie czasu do kolejnego wyzerowania
      {
          hm=((czas3-czasStart2)/60000);
          h=hm/60;
          m=hm-(h*60);                                   
      lcd.setCursor(11,1);
      lcd.print(m);
      lcd.setCursor(13,1);
      lcd.print(':');
      lcd.setCursor(14,1);
      lcd.print(m);
      }
    }
  }      
flaga2=flaga1;                          //aktualny stan przycisku przypisujemy do wartosci poprzedniego stanu
if (digitalRead(8) == LOW)
{
suma3=0;
ssekundy3=0; 
}
if (czasStart2 >= 86400000 & czas3 <86400000) //odmierzenie pierwszego pomieru
  {
  suma2=suma1;
  suma=0;
  ssekundy=0;
  czas3=czas3+1000;
  }
else                                    //odmierzenie kolejnych pomiarów
if (czas3 >= czasStart2-czas3)
  {
  suma2=suma1;
  czas3=czas3+86400000;
  suma=0;
  ssekundy=0;
  }
}
 
Odpowiedź
#2
Schematu nie dałeś a to wada esd jakiś zakłóceń niż programowa.

Już ten kanałowy moduł detektor ma wadę..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
[Obrazek: ChomikImage.aspx?e=JYZkmlxdwn-CCw18sYOXz...vnezU&pv=2]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości