• 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 grupowe - płynna regulacja mocy
#1
Witam.
Jestem początkującym użytkownikiem Arduino i jednocześnie początkującym "elektronikiem" i być może porwałem się na zbyt ambitny projekt. Ale trzeba sobie stawiać wysoko poprzeczkę Smile. Spędziłem już nad tym sporo czasu szukając rozwiązania przeczytałem wiele artykułów, i 2 książki o Arduino ale dalej nie mogę sobie poradzić z moim problemem. Niby teoria jest mi znana ale jak chcę ją użyć zaczynają się schody.
Przejdźmy do sedna sprawy. Postanowiłem stworzyć sterowanie mocą żarówki/grzałki/silnika w sposób płynny gdzie na wyświetlaczu 0 - wyłączone świecenie 100 max moc świecenia. Detekcja w "0".
Doszedłem do miejsca w którym mam sterowanie mocą do 70-80 kroków i uzyskuję max.
Może ktoś podpowie mi jak to ogarnąć, lub poda opis gdzie mógłbym o tym doczytać abym sobie z tym poradził.
Tworząc ten projekt korzystałem z następujących stron - i płytkę sterującą wykonałem
1) ściemniacz1 http://arduinotehniq.blogspot.com/2014/1...duino.html
2) ściemniacz2 https://arduinodiy.wordpress.com/2012/10...r-arduino/

Naciskając przyciski licznik na wyświetlaczu liczy po kolei od 0-100, ale płynne sterowanie jest od 0-80 (mierzę miernikiem)
Napięcie na poszczególnej jednostce licznika
0 - 0V
25 - 84V
50 - 176V
75 - 224V
80 - 227V - MAX MOC

Mój kod
Kod:
#include <SPI.h>
#include "U8glib.h"
#include <TimerOne.h> // Avaiable from http://www.arduino.cc/playground/Code/Timer1

U8GLIB_ST7920_128X64 u8g(8, 6, 7, U8G_PIN_NONE); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17

// ustawienia dotyczące sterowania zerem
volatile int i=0; // Variable to use as a counter
volatile boolean zero_cross=0; // Boolean to store a "switch" to tell us if we have crossed zero
int AC_pin = 3; // Output to Opto Triac
int buton1 = 0; // first button at pin 4
int buton2 = 5; // second button at pin 5
int counter = 100; // step for count;
int counter_1 = 100;
int freqStep = 105; // This is the delay-per-brightness step in microseconds for 50Hz (change the value in 65 for 60Hz)

void setup() {



Serial.begin(9600);
pinMode(buton1, INPUT); // set buton1 pin as input
pinMode(buton2, INPUT); // set buton1 pin as input
pinMode(AC_pin, OUTPUT); // Set the Triac pin as output
attachInterrupt(0, zero_cross_detect, RISING); // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
Timer1.initialize(freqStep); // Initialize TimerOne library for the freq we need
Timer1.attachInterrupt(counter_check, freqStep);



// assign default color value
u8g.getMode() == U8G_MODE_BW;
u8g.setColorIndex(1);

/*
if ( u8g.getMode() == U8G_MODE_R3G3B2 )
u8g.setColorIndex(255); // white
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
u8g.setColorIndex(3); // max intensity
else if ( u8g.getMode() == U8G_MODE_BW )
u8g.setColorIndex(1); // pixel on */
// USTAWIENIE KROJU CZCIONKI (CZCIONKI DOSTĘPNE W STEROWNIKU DO WYŚWIETLACZA)
// u8g.setFont(u8g_font_8x13);
u8g.setFont(u8g_font_6x12);
// u8g.setFont(u8g_font_helvR08);
// u8g.setFont(u8g_font_profont11);
}
// ----------------------------------- sterowanie zerem----------------------
void zero_cross_detect() {
zero_cross = true; // set the boolean to true to tell our dimming function that a zero cross has occured
i=0;
digitalWrite(AC_pin, LOW);
}

// Turn on the TRIAC at the appropriate time
void counter_check() {
if(zero_cross == true) {
if(i>=counter) {
digitalWrite(AC_pin, HIGH); // turn on light
i=0; // reset time step counter
zero_cross=false; // reset zero cross detection
}
else {i++; // increment time step counter
}
}}


// --------------------------------------------------------------- wykonanie programu ---------------------------------
void loop() {
// --------------------------------------------------- moc ---------------------------------------------
digitalWrite(buton1, HIGH);
digitalWrite(buton2, HIGH);

if (digitalRead(buton1) == LOW)
{if(counter>0) {counter--;} else if (counter==1){counter--;}
else if (counter==1); }

if (digitalRead(buton2) == LOW)
{if (counter<100) {counter++;} else if (counter==0){counter++; }
else if (counter==100); }

// Drukowanie na wyświetlaczu
// Drukowanie na wyświetlaczu
u8g.firstPage();
do {

u8g.drawStr( 0, 57, "MOC GRZANIA ");
u8g.setPrintPos( 80, 57);
u8g.print((counter_1 - counter));

} while( u8g.nextPage() );


// --------------------------------------------------- moc na serial ---------------------------------------------
Serial.println(counter_1 - counter);


}

W książce, którą napisał Pan Mirosław Kardaś (niebieska) doczytałem w rozdziale o sterowaniu silnikiem, że problem może być w szerokości szpilki i zmieniłem rezystor 10K na 30K ale też to nic nie dało.

Może być to jakiś banał a może (a nawet na pewno) robię coś źle i nigdy powyższy kod nie zadziała tak jak chciałbym.
Jeśli ktoś jest doświadczony w tym temacie, proszę o nakierowanie mnie abym mógł ruszyć dalej.
Z góry dziękuję za odpowiedzi.
 
Odpowiedź
  


Wiadomości w tym wątku
Sterowanie grupowe - płynna regulacja mocy - przez oloweczek - 27-01-2017, 01:28

Skocz do:


Przeglądający: 1 gości