Potencjometr Arduino

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
misiakool12
Młodszy majsterkowicz
Posty: 29
Rejestracja: 4 maja 2018, 12:51

Potencjometr Arduino

Post autor: misiakool12 » 10 sie 2018, 18:57

Witam ponownie. Mam takowe pytanie : podłączyłem potencjometr do płytki stykowej. Na płytce stykowej znajduję się również czujnik wilgotności DHT22 oraz wyświetlacz OLED 0,96'' 128x64px I2C. Napisałem program , który ma za zadanie wyświetlać mi aktualną wartość wilgotności zmierzoną przez czujnik ( działa jak należy) oraz wyświetlić wartość ustawioną za pomocą potencjometru w procentach(od 0 do 100 ). Problemem jest to iż program wyświetla wartość ustawioną potencjometrem lecz nie wyświetla tego w czasie rzeczywistym, tzn. wyświetla się napis "wilgotnośc" oraz "wilg.zad" przy czym "kręcąc" potencjometrem wartość nie jest aktualizowana na bieżąco tylko wyświetla się dopiero po ponownym załączeniu obrazu 2( tzn. najpierw wyświetla się parę sekund obraz 1(wilgotność i temperatura) a następnie obraz 2(wilgotność i wilg.zad). Czy jest możliwość aby wartość ta aktualizowała się w czasie rzeczywistym? Tzn. kręcąc potencjometrem wartość stale się zmienia i wyświetla na ekranie wyświetlacza OLED?
Program prezentuje się następująco:

Kod: Zaznacz cały

#include "DHT.h"                          // biblioteka DHT
#include "U8glib.h"                       // bibioteka OLED I2C

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);  // I2C / TWI 

#define DHTPIN 2                          // definicja PIN dla DHT
#define DHTTYPE DHT22                     // DHT 11
DHT dht(DHTPIN, DHTTYPE, 6);                  // deklaracja DHT
char str[10];                         // znak stopni celsujsza i procent
float WILG;                           // zmienna wilgotnosc
float TEMP;                           // zmienna temperatura w stopniach C
int potencjometr = A0;                // odczyt napiecia z potentcjometru pinem analogowym 0
int wartosc = 0;                       // zmienna przechowujaca wartosc napiecia odczytanego
  
void setup()
{
 dht.begin();                          // inicjalizacja DHT
 pinMode(potencjometr, INPUT); //pin A0 (pot) jako wejście
}

void clearOLED () { 
    u8g.firstPage ();  
    do { 
    } while (u8g.nextPage ()); 
} 

 
// glowna petla programu
 
void loop() {
 
 delay(100);                            // odczekaj - pomiar trwa ok 250 mS
 WILG = dht.readHumidity();                     // odczytaj wilgotnosc
 TEMP = dht.readTemperature();                  // odczytaj temp
 wartosc = analogRead(A0);
 wartosc  = map(wartosc, 0, 1023, 0, 100);           // skalowanie od 0 do 100             
 
// petla obrazu
 u8g.firstPage();              // PIERWSZY OBRAZ
 do {
 u8g.setFont(u8g_font_helvB08);               // ustaw mniejsza czcionke
 u8g.drawStr( 2, 27, "Wilgotnosc :");             // w pozycji 2/47 wyswietl txt
 u8g.drawStr( 80, 27, dtostrf(WILG, 5, 2, str));  // w pozycji 80/47 wartosc wilgotnosci
 u8g.drawStr( 110, 27, "%");                      // w pozycji 120/47 dopisz symbol %
 
 u8g.drawStr( 0, 42, "Temperatura :");            // analogicznie tylko w innej linii - temp
 u8g.drawStr( 80, 42, dtostrf(TEMP, 5, 2, str));
 u8g.drawStr( 110, 42, "\260C");
 } while( u8g.nextPage() );                       // koniec petli obrazu
delay(4000);
 u8g.firstPage(); // DRUGI OBRAZ
 do {
 u8g.setFont(u8g_font_helvB08);               // ustaw mniejsza czcionke
 u8g.drawStr( 2, 27, "Wilgotnosc :");             // w pozycji 2/47 wyswietl txt
 u8g.drawStr( 80, 27, dtostrf(WILG, 5, 2, str));  // w pozycji 80/47 wartosc wilgotnosci
 u8g.drawStr( 110, 27, "%");                      // w pozycji 120/47 dopisz symbol %
 
 u8g.drawStr( 0, 42, "Wilg. zad.:");            // analogicznie tylko w innej linii - temp
 u8g.drawStr( 80, 42, dtostrf(wartosc, 5, 2, str));
 u8g.drawStr( 110, 42, "%");
 delay(200); //kolejny odczyt za 0.2s
 } while( u8g.nextPage() );                       // koniec petli obrazu
delay(12000); // OPOZNIENIE - JAK DLUGO SIE WYSWIETLA 2 OBRAZ
}

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


Awatar użytkownika
Marhef
Złota rączka
Posty: 1022
Rejestracja: 18 lis 2011, 02:18

Re: Potencjometr Arduino

Post autor: Marhef » 11 sie 2018, 09:02

Pewnie, że się da. Ale nie w ten sposób!
Używasz delay(12000) - 12 sekund! w czasie których arduino robi NIC.
Jeśli chcesz, żeby wyświetlało się na bieżąco, musisz zrobić tak:
1) pozbyć się paskudnego delay(12000) (np. zastępując funckją millis() - do poszukania na stronie arduino.cc)
2) w ciągu tych 12 sekund odczytywać wartość z potencjometru - np. dwa razy na sekundę, myślę, że to wystarczy
3) po każdym odczycie wartości wyświetlić ją na wyświetlaczu
4) sprawdzić, czy minęło już 12 sekund. Jeśli nie, powtórzyć punkty 2-4
misiakool12
Młodszy majsterkowicz
Posty: 29
Rejestracja: 4 maja 2018, 12:51

Re: Potencjometr Arduino

Post autor: misiakool12 » 11 sie 2018, 09:11

Te 12 s używam po to aby wyświetlić drugi ekran - niewiedzialem w jaki inny sposób to zrobić. Czy mógłbyś mi pomóc z kodem odnośnie tego co napisałeś? Bo niewiem zabardzo jak to napisać.

Edit: edytowałem kod i zmieniłem go do wyświetlania wszystkiego w jednym obrazie ( dla ułatwienia). Mimo to potencjometr nadal nadal nie działa jak należy - wartość ustawiona potencjometrem "wariuje" - ustawiłem np.na 87% i stale waha się miedzy 86 a 87. Czy można temu zapobiec? Tym wahaniom?

Kod: Zaznacz cały

#include "DHT.h"                          // biblioteka DHT
#include "U8glib.h"                       // bibioteka OLED I2C

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);  // I2C / TWI 

#define DHTPIN 2                          // definicja PIN dla DHT
#define DHTTYPE DHT22                     // DHT 11
DHT dht(DHTPIN, DHTTYPE, 6);                  // deklaracja DHT
char str[10];                         // znak stopni celsujsza i procent
float WILG;                           // zmienna wilgotnosc
float TEMP;  // zmienna temperatura w stopniach C

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;

int potencjometr = A0;                // odczyt napiecia z potentcjometru pinem analogowym 0
int wartosc = 0;                       // zmienna przechowujaca wartosc napiecia odczytanego
  
void setup()
{
 dht.begin();                          // inicjalizacja DHT
 pinMode(potencjometr, INPUT); //pin A0 (pot) jako wejście
}
 
// glowna petla programu
 
void loop() {
 aktualnyCzas = millis();


 if (aktualnyCzas - zapamietanyCzas >= 50UL) {
    //Zapamietaj aktualny czas
    zapamietanyCzas = aktualnyCzas;
 }

                          // odczekaj - pomiar trwa ok 250 mS
 WILG = dht.readHumidity();                     // odczytaj wilgotnosc
 TEMP = dht.readTemperature();                  // odczytaj temp
 wartosc = analogRead(A0);
 wartosc  = map(wartosc, 0, 1023, 0, 100);           // skalowanie od 0 do 100             
 
// petla obrazu
 u8g.firstPage();              // PIERWSZY OBRAZ
 do {
 u8g.setFont(u8g_font_helvB08);               // ustaw mniejsza czcionke
 u8g.drawStr( 2, 27, "Wilgotnosc :");             // w pozycji 2/47 wyswietl txt
 u8g.drawStr( 80, 27, dtostrf(WILG, 5, 2, str));  // w pozycji 80/47 wartosc wilgotnosci
 u8g.drawStr( 110, 27, "%");                      // w pozycji 120/47 dopisz symbol %
 
 u8g.drawStr( 2, 42, "Temperatura :");            // analogicznie tylko w innej linii - temp
 u8g.drawStr( 80, 42, dtostrf(TEMP, 5, 2, str));
 u8g.drawStr( 110, 42, "\260C");

 u8g.drawStr( 2, 57, "Wilg. zad.:");            // analogicznie tylko w innej linii - temp
 u8g.drawStr( 80, 57, dtostrf(wartosc, 5, 2, str));
 u8g.drawStr( 110, 57, "%");
 
 } while( u8g.nextPage() );                       // koniec petli obrazu

 }
Awatar użytkownika
Marhef
Złota rączka
Posty: 1022
Rejestracja: 18 lis 2011, 02:18

Re: Potencjometr Arduino

Post autor: Marhef » 11 sie 2018, 13:24

Można. Na przykład ustawiając dokładniej wartość potencjometrem. Albo dodając filtrowanie sygnału z potencjometru. Albo uśredniając wartość mierzoną.

Jak długo używasz arduino?
misiakool12
Młodszy majsterkowicz
Posty: 29
Rejestracja: 4 maja 2018, 12:51

Re: Potencjometr Arduino

Post autor: misiakool12 » 11 sie 2018, 15:51

Jak dodać filtrowanie sygnału z potencjometru albo uśrednić wartość mierzoną? Jestem początkujący :)
misiakool12
Młodszy majsterkowicz
Posty: 29
Rejestracja: 4 maja 2018, 12:51

Re: Potencjometr Arduino

Post autor: misiakool12 » 12 sie 2018, 17:21

Ktoś pomoże? :)
pawel_123
Młodszy majsterkowicz
Posty: 7
Rejestracja: 6 sie 2018, 12:32

Re: Potencjometr Arduino

Post autor: pawel_123 » 13 sie 2018, 14:03

Co to za potencjometr i jak go masz podłączonego?
Uśredniać możesz tak:
robisz pomiary i trzymasz odczyty w tablicy, na przykład 5 pomiarów, wykonując nowy zapisujesz go do tablicy zamiast najstarszego, wyświetlasz średnią ze wszystkich wartosci w tablicy.
misiakool12
Młodszy majsterkowicz
Posty: 29
Rejestracja: 4 maja 2018, 12:51

Re: Potencjometr Arduino

Post autor: misiakool12 » 13 sie 2018, 18:47

Potencjometr obrotowy 10kΩ liniowy 1/8W. Plus do plusa zasilania z szyny , minus do minusa i tam środkowy pin do pinu arduino. Ups , nie jestem jakiś świetny z programowania i może być problem z tą tablicą. Nie ma innego sposobu? :)lub czy pomogłbyś mi z tą tablicą?
pawel_123
Młodszy majsterkowicz
Posty: 7
Rejestracja: 6 sie 2018, 12:32

Re: Potencjometr Arduino

Post autor: pawel_123 » 14 sie 2018, 15:28

Spróbuj jeszcze zamiast funkcji map napisać tak:

Kod: Zaznacz cały

float wartosc=0.0;
.....

wartosc=100.0*analogRead(A0)/1023.0;
i napisz jak się wahaja odczyty, przyznam, że nigdy nie miałem takiego problemu z potencjometrami i ciężko mi sobie wyobrazić co jest nie tak.

Odnośnie uśredniania:

podejście 1) w którym robimy 5 pomiarów i dopiero liczymy średnią

Kod: Zaznacz cały

float dane[5];
int i=0;
float srednia;
...
//tu robisz pomiar
dane[i]=wartosc;
i++;
if(i==5){
	i=0;
	for(int j=0;j<5;j++){
		srednia+=dane[j];
	}
	srednia/=5.0;
}

podejście 2) srednia liczymy z kazdym pomiarem z ostatnich 5ciu

Kod: Zaznacz cały

float dane[5];
int i=0;
float srednia;
...
//tu robisz pomiar
dane[i]=wartosc;
i++;
if(i==5){
	i=0;
}
for(int j=0;j<5;j++){
	srednia+=dane[j];
}
srednia/=5.0;
misiakool12
Młodszy majsterkowicz
Posty: 29
Rejestracja: 4 maja 2018, 12:51

Re: Potencjometr Arduino

Post autor: misiakool12 » wczoraj, 14:05

Dzięki za pomoc - czasami się jeszcze "zawaha" ale ogólnie działa dużo lepiej :)
ODPOWIEDZ

Strony partnerskie: