Jak dodać strefę histerezy do bieżącego kodu?

Jak dodać strefę histerezy do bieżącego kodu?
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
0
avabuy napisał(a):

rozumuje to tak , że wystarczy zastąpić stałą zmienną "humidity" na funkcję odnośnie odczytywania i mapowania wartości potencjometru czyli : humidity=usrednianieSkalowaniePomiaruPotencjometru() ?

Jeśli ta funkcja pobiera aktualną pozycję potencjometru i ją mapuje, to tak. Następnie bierzesz sobie większość wartości i obliczeń z zaproponowanych przez mnie stałych:

Kopiuj
const int size_range_x = 2;
const int size_range_b = 2;
 
const int state_x_left_min = humidity - size_range_b - size_range_x;
const int state_x_left_max = humidity - size_range_b;
 
const int state_x_right_min = humidity + size_range_b;
const int state_x_right_max = munidity + size_range_b + size_range_x;

i używasz ich pośrednio lub bezpośrednio w instrukcjach warunkowych. Problem polega na tym, że upierasz się przy drabince ifów i nie chcesz zaimplementować sobie funkcji określającej nowy stan. Jeśli wpakujesz te obliczenia do warunków, to wyjdzie Ci kupa – kod długi i totalnie nieczytelny.

Dlatego po pierwsze wydziel sobie ten fragment logiki do osobnej funkcji, a wyniki tych obliczeń wrzuć do pomocniczych, lokalnych zmiennych, tak aby warunki były krótkie i czytelne (czyli takie, jakie pokazałem w przykładowej funkcji getCurrentState).

AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

To nie tak że upieram się przy drabince if'ów aczkolwiek po prostu nie wiem o co Ci chodzi , jak te drabinkę jeszcze przerobić :D jak mam być szczery to nie wiem jak się do tego zabrać :D rozumuje to tak że :

  1. fragment kodu przekształcam w osobną funkcje
    np.
Kopiuj
void histereza()
{
    humidity = usrednianieSkalowaniePomiaruPotencjometru()
    const int size_range_x= 2;
    const int size_range_b = 2;

    const int state_x_left_min = humidity - size_range_b - size_range_x;
    const int state_x_left_max = humidity - size_range_b;

    const int state_x_right_min = humidity + size_range_b;
    const int state_x_right_max = munidity + size_range_b + size_range_x;
}
  1. "wyniki tych obliczeń wrzuć do pomocniczych, lokalnych zmiennych" - tutaj mam problem ze zrozumieniem bo wynik obliczenia już jest w zmiennej np. const int state_x_left_min ?
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
1

Pokazałem Ci jak pozbyć się tej drabinki i tym samym skrócić kod oraz zwiększyć jego czytelność:

Kopiuj
int newState = getCurrentState();
 
switch (newState)
{
  case state_a: setStateA(); break;
  case state_b: setStateB(); break;
  case state_c: setStateC(); break;
}

No ale Ty w kółko pokazujesz kolejne wersje kodu z drabinkami, od niedawna dodatkowo wyposażonymi w pętle, o których wcześniej nie było mowy. Dlatego też cofnij się do pierwszej strony tego wątku i jeszcze raz dokładnie przeczytaj zawartość tego posta.

Wszystkie instrukcje wykonywane po spełnieniu danego warunku powinny być (łącznie z pętlami) wydzielone do osobnej funkcji (w moim przykładzie są to setStateA/B/C, bo funkcja loop nie musi wiedzieć co dokładnie oznacza „włączenie stanu A” czy innego. A to króty stan należy włączyć, realizuje funkcja getCurrentState, zwracając jego liczbowe ID. I ona właśnie powinna implementować pobranie pozycji potencjometru, jej zmapowanie, porównanie z zakresami i zwrócenie ID nowego stanu. Sama też może wołać inne funkcje, a nawet powinna, bo tej z kolei nie obchodzi to w jaki sposób pozyskiwana jest wartość z potencjometru i skąd ona w ogóle pochodzi.


Przydałoby się zmienić nazwę funkcji getCurrentState na getNewState, bo bieżący stan w moim kodzie znajduje się w zmiennej state. No ale teraz to już za późno na poprawianie tamtego posta.

AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Czy to powinno wyglądać tak? :)

Kopiuj
const int stanPierwszy = 1;
const int stanDrugi = 2;
const int stanTrzeci = 3;

int stan = stanPierwszy;
wilgotnosc = dht.readHumidity();

void ustawStatusPierwszy()
{
    if (stan == stanPierwszy)
        return;

    u8g.firstPage();
    do {
        zwiekszanieWilgotnosci();
    } while (u8g.nextPage());

    warunekZwiekszanieWilgotnosci();
}

void ustawStatusDrugi()
{
    if (stan == stanDrugi)
        return;
    do {
        zmniejszanieWilgotnosci();
    } while (u8g.nextPage());

    warunekZmniejszanieWilgotnosci();
}

void ustawStatusTrzeci()
{
    if (stan == stanTrzeci)
        return;

    u8g.firstPage();
    do {
        strefaNieczulosci();
    } while (u8g.nextPage());

    warunekStrefaNieczulosci();
}

int pobierzNowyStatus()
{
    int status = usrednianieSkalowaniePomiaruPotencjometru()

        if (status > (wilgotnosc + 2)) return stanPierwszy;
    if (status > (wilgotnosc - 2))
        return stanDrugi;

    return stanTrzeci;
}

int nowyStatus = pobierzNowyStatus();

switch (nowyStatus) {
case stanPierwszy:
    ustawStatusPierwszy;
    break;
case stanDrugi:
    ustawStatusDrugi;
    break;
case stanTrzeci:
    ustawStatusTrzeci;
    break;
}
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
1

No mniej więcej tak. Teraz do funkcji pobierzNowyStatus trzeba dodać obliczenia związane z histerezą.

No i zadeklarować stałą o wartości 0 dla wartości znajdującej się w jednym z dwóch przedziałów histerezy. Według reszty stałych może mieć nazwę stanBezZmian (polskie nazwy są fuj…). W rezultacie powinieneś mieć cztery stałe:

Kopiuj
const int stanBezZmian = 0;
const int stanPierwszy = 1;
const int stanDrugi    = 2;
const int stanTrzeci   = 3;
AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Tak wiem, że te polskie nazwy Cie rażą w oczy jako profesjonalnego programistę ale przepraszam , tak mi łatwiej :D Dodałem te zmienne tylko teraz nie wiem jak dodać te warunki od histerezy? Np.

Kopiuj
if (status > (wilgotnosc + 2) && status >= statusMinimalnyXLewo && status <= statusMaksymalnyXPrawo)
        return stanPierwszy;

? Zastanawiam się też w którym miejscu uwzględnić zmienną const int stanBezZmian?

Kopiuj
int pobierzNowyStatus()
{
    int status = usrednianieSkalowaniePomiaruPotencjometru()
    const int zakresRozmiaruX = 2;
    const int zakresRozmiaruB = 2;

    const int statusMinimalnyXLewo = wilgotnosc - zakresRozmiaruB - zakresRozmiaruX;
    const int statusMaksymalnyXPrawo = wilgotnosc - zakresRozmiaruB;

    const int statusMinimalnyXPrawo = wilgotnosc + zakresRozmiaruB;
    const int statusMaksymalnyXLewo = wilgotnosc + zakresRozmiaruB + zakresRozmiaruX;

    if (status > (wilgotnosc + 2))
        return stanPierwszy;
    if (status > (wilgotnosc - 2))
        return stanDrugi;

    return stanTrzeci;
}
AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Poprawione, doradzisz z tym kodem jak byś miał chwilę? :)

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
1
Kopiuj
const int statusMinimalnyXLewo = wilgotnosc - zakresRozmiaruB - zakresRozmiaruX;
const int statusMaksymalnyXPrawo = wilgotnosc - zakresRozmiaruB;
 
const int statusMinimalnyXPrawo = wilgotnosc + zakresRozmiaruB;
const int statusMaksymalnyXLewo = wilgotnosc + zakresRozmiaruB + zakresRozmiaruX;

Takie coś nie przejdzie – wartość stałej musi być znana w czasie kompilacji, a wilgotnosc to zmienna, której wartość określana jest dopiero po uruchomieniu programu. Pisałem Ci, że masz przenieść obliczenia do warunków, a Ty przeniosłeś deklaracje wszystkich stałych do środka funkcji i nic więcej.

Jedynych stałych jakich potrzebujesz to tych:

Kopiuj
const int zakresRozmiaruX = 2;
const int zakresRozmiaruB = 2;

Przenieś ich deklaracje na górę kodu programu, przed deklaracje zmiennych globalnych. W funkcji pobierzNowyStatus na podstawie zmiennej wilgotnosc przeprowadź obliczenia i zwróć nowy stan, tak jak sam pokazałem w swoim poście. Możesz te cztery podane stałe (z obliczeniami) zamienić na lokalne zmienne i ich użyć do warunków – przynajmniej wyjdą krótkie.

AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Poddaje się - nie mam pojęcia jak przeprowadzić te obliczenia... Na ten sposób? Przerobiłem te warunki ale czy o to chodzi to nie wiem :/

Kopiuj
const int stanBezZmian = 0;
const int stanPierwszy = 1;
const int stanDrugi = 2;
const int stanTrzeci = 3;

const int zakresRozmiaruX = 2;
const int zakresRozmiaruB = 2;

int stan = stanPierwszy;
wilgotnosc = dht.readHumidity();

void ustawStatusPierwszy()
{
    if (stan == stanPierwszy)
        return;

    u8g.firstPage();
    do {
        zwiekszanieWilgotnosci();
    } while (u8g.nextPage());

    warunekZwiekszanieWilgotnosci();
}

void ustawStatusDrugi()
{
    if (stan == stanDrugi)
        return;
    do {
        zmniejszanieWilgotnosci();
    } while (u8g.nextPage());

    warunekZmniejszanieWilgotnosci();
}

void ustawStatusTrzeci()
{
    if (stan == stanTrzeci)
        return;

    u8g.firstPage();
    do {
        strefaNieczulosci();
    } while (u8g.nextPage());

    warunekStrefaNieczulosci();
}

int pobierzNowyStatus()
{
    int status = usrednianieSkalowaniePomiaruPotencjometru()

        if (status >= wilgotnosc - zakresRozmiaruX - zakresRozmiaruB && status <= wilgotnosc - zakresRozmiaruB) 
        return stanBezZmian;
    if (status >= wilgotnosc + zakresRozmiaruB && status <= wilgotnosc + zakresRozmiaruB + zakresRozmiaruX)
        return stanBezZmian;
    if (status < wilgotnosc - zakresRozmiaruX - zakresRozmiaruB)
        return stanPierwszy;
    if (status > wilgotnosc + zakresRozmiaruB + zakresRozmiaruX)
        return stanTrzeci;

    return stanDrugi;
}

int nowyStatus = pobierzNowyStatus();

switch (nowyStatus) {
case stanPierwszy:
    ustawStatusPierwszy;
    break;
case stanDrugi:
    ustawStatusDrugi;
    break;
case stanTrzeci:
    ustawStatusTrzeci;
    break;
}
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
1

Ehh… jeśli dobrze rozumiem przeznaczenie tych zmiennych (w co wątpię) to powinno to wyglądać tak – stałe:

Kopiuj
const int stanBezZmian = 0;
const int stanPierwszy = 1;
const int stanDrugi    = 2;
const int stanTrzeci   = 3;
 
const int zakresRozmiaruX = 2;
const int zakresRozmiaruB = 2;

Następnie funkcja określająca nowy stan:

Kopiuj
int pobierzNowyStatus()
{
  int status = usrednianieSkalowaniePomiaruPotencjometru();
  
  int statusMinXLewo = wilgotnosc - zakresRozmiaruB - zakresRozmiaruX;
  int statusMaxXLewo = wilgotnosc - zakresRozmiaruB;
  
  int statusMinXPrawo = wilgotnosc + zakresRozmiaruB;
  int statusMaxXPrawo = wilgotnosc + zakresRozmiaruB + zakresRozmiaruX;
  
  if (status >= statusMinXLewo  && status <= statusMaxXLewo)  return stanBezZmian;
  if (status >= statisMinXPrawo && status <= statusMaxXPrawo) return stanBezZmian;
  
  if (status < statusMinXLewo)  return stanPierwszy;
  if (status > statusMaxXPrawo) return stanTrzeci;
  
  return stanDrugi;
}

I na koniec główna instrukcja wyboru:

Kopiuj
int nowyStatus = pobierzNowyStatus();
 
switch (nowyStatus)
{
  case stanPierwszy: ustawStatusPierwszy(); break;
  case stanDrugi:    ustawStatusDrugi();    break;
  case stanTrzeci:   ustawStatusTrzeci();   break;
}

Ale że te zmienne są tak cholernie nic nie mówiące, to ręki uciąć nie dam, że to będzie działać. I że to zrozumiesz. Dlatego właśnie nienawidzę polskich identyfikatorów i zawsze sugeruję, aby pisać kod w całości po angielsku. Nie dość że nazewnictwo polskie, to jeszcze kompletnie pomieszane znaczenie stanów ze statusami.

AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Dziękuje z całego serca! Jak tylko wrócę z uczelni (po południu) to od razu przetestuje kod :)

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
1

W razie problemów go wywal i napisz od nowa – tym razem po angielsku i z krótkimi nazwami. ;)

AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Po wgraniu całego kodu nie dzieje się zupełnie nic - nawet żadna dioda się nie świeci , potencjometr nie reaguje :D zmieniłem nazwy na angielskie tak jak mówiłeś, wiesz dlaczego to kompletnie nie działa? :D

Kopiuj
#include "DHT.h"
#include "U8glib.h"

#define LED_INFO_RADIATOR 4
#define LED_INFO_VAPORGENERATOR 13
#define LED_INFO_DEAD_ZONE 1
#define DHTPIN 2
#define DHTTYPE DHT22

const int stateX = 0;
const int stateA = 1;
const int stateB = 2;
const int stateC = 3;

int state = stateA;

const int sizeRangeX = 2;
const int sizeRangeB = 2;

int humidity;
float temperature;

unsigned long currentTime = 0;
unsigned long rememberedTime = 0;

int relayPin = 8;
int relayPin2 = 12;
int relayPin3 = 7;
int relayPin4 = 9;

int potentiometer = A0;
int valuePotentiometer = 0;
int data[5];
int i = 0;
int average;

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C(TWI)
DHT dht(DHTPIN, DHTTYPE, 6);
char str[10];

void setup()
{
    dht.begin();
    pinMode(potentiometer, INPUT);
    pinMode(relayPin, OUTPUT);
    pinMode(relayPin2, OUTPUT);
    pinMode(relayPin3, OUTPUT);
    pinMode(relayPin4, OUTPUT);
    digitalWrite(relayPin, HIGH);
    digitalWrite(relayPin2, HIGH);
    digitalWrite(relayPin3, HIGH);
    digitalWrite(relayPin4, HIGH);
    pinMode(LED_INFO_RADIATOR, OUTPUT);
    pinMode(LED_INFO_VAPORGENERATOR, OUTPUT);
    pinMode(LED_INFO_DEAD_ZONE, OUTPUT);
}

void decreaseHumidity(void)
{
    u8g.firstPage();
    do {
        u8g.setFont(u8g_font_helvB08);
        u8g.drawStr(2, 27, "Zmniejszanie wilgotnosci!");

        u8g.drawStr(2, 42, "Wilgotnosc :");
        u8g.drawStr(80, 42, dtostrf(humidity, 5, 2, str));
        u8g.drawStr(110, 42, "%");

        u8g.drawStr(2, 57, "Wilg. zad.:");
        u8g.drawStr(80, 57, dtostrf(valuePotentiometer, 5, 2, str));
        u8g.drawStr(110, 57, "%");
    } while (u8g.nextPage());
}

void increaseHumidity(void)
{
    u8g.firstPage();
    do {
        u8g.setFont(u8g_font_helvB08);
        u8g.drawStr(2, 27, "Zwiekszanie wilgotnosci!");

        u8g.drawStr(2, 42, "Wilgotnosc :");
        u8g.drawStr(80, 42, dtostrf(humidity, 5, 2, str));
        u8g.drawStr(110, 42, "%");

        u8g.drawStr(2, 57, "Wilg. zad.:");
        u8g.drawStr(80, 57, dtostrf(valuePotentiometer, 5, 2, str));
        u8g.drawStr(110, 57, "%");
    } while (u8g.nextPage());
}
void deadZone(void)
{
    u8g.firstPage();
    do {
        u8g.setFont(u8g_font_helvB08);
        u8g.drawStr(2, 27, "Strefa Nieczulosci");

        u8g.drawStr(2, 42, "Wilgotnosc :");
        u8g.drawStr(80, 42, dtostrf(humidity, 5, 2, str));
        u8g.drawStr(110, 42, "%");

        u8g.drawStr(2, 57, "Wilg. zad.:");
        u8g.drawStr(80, 57, dtostrf(valuePotentiometer, 5, 2, str));
        u8g.drawStr(110, 57, "%");
    } while (u8g.nextPage());
}

static void turnOnRadiator()
{
    digitalWrite(relayPin2, LOW);
    digitalWrite(LED_INFO_RADIATOR, HIGH);
}
static void turnOffRadiator()
{
    digitalWrite(relayPin2, HIGH);
    digitalWrite(LED_INFO_RADIATOR, LOW);
}
static void turnOnFan()
{
    digitalWrite(relayPin3, LOW);
    digitalWrite(relayPin4, LOW);
}
static void turnOffFan()
{
    digitalWrite(relayPin3, HIGH);
    digitalWrite(relayPin4, HIGH);
}

static void turnOnVaporGenerator()
{
    digitalWrite(relayPin, LOW);
    digitalWrite(LED_INFO_VAPORGENERATOR, HIGH);
}

static void turnOffVaporGenerator()
{
    digitalWrite(relayPin, HIGH);
    digitalWrite(LED_INFO_VAPORGENERATOR, LOW);
}
static void turnOffDeadZone()
{
    digitalWrite(LED_INFO_DEAD_ZONE, LOW);
}
static void turnOnDeadZone()
{
    digitalWrite(LED_INFO_DEAD_ZONE, HIGH);
}

int potentiometerMeasurement()
{
    data[i] = analogRead(A0);
    valuePotentiometer = map(data[i], 0, 1023, 0, 100);

    i = (i + 1) % 5;
    average = 0;

    for (int j = 0; j < 5; j++)
        average += data[j];

    average /= 5.0;
}

void timing()
{
    currentTime = millis();

    if (currentTime - rememberedTime >= 50UL) {

        rememberedTime = currentTime;
    }
}

void conditionIncreaseHumidity()
{
    turnOffFan();
    turnOnRadiator();
    turnOffVaporGenerator();
    turnOffDeadZone();
}
void conditionDecreaseHumidity()
{
    turnOnFan();
    turnOffRadiator();
    turnOnVaporGenerator();
    turnOffDeadZone();
}
void conditionDeadZone()
{
    turnOffVaporGenerator();
    turnOffRadiator();
    turnOffFan();
    turnOnDeadZone();
}

int getNewState()
{
    int value = potentiometerMeasurement();

    int stateXLeftMin = humidity - sizeRangeB - sizeRangeX;
    int stateXLeftMax = humidity - sizeRangeB;

    int stateXRightMin = humidity + sizeRangeB;
    int stateXRightMax = humidity + sizeRangeB + sizeRangeX;

    if (value >= stateXLeftMin && value <= stateXLeftMax)
        return stateX;
    if (value >= stateXRightMin && value <= stateXRightMax)
        return stateX;

    if (value < stateXLeftMin)
        return stateA;
    if (value > stateXRightMax)
        return stateC;

    return stateB;
}

void setStateA()
{
    if (state == stateA)
        return;

    u8g.firstPage();
    do {
        increaseHumidity();
    } while (u8g.nextPage());

    conditionIncreaseHumidity();
}

void setStateB()
{
    if (state == stateB)
        return;
    do {
        decreaseHumidity();
    } while (u8g.nextPage());

    conditionDecreaseHumidity();
}

void setStateC()
{
    if (state == stateC)
        return;

    u8g.firstPage();
    do {
        deadZone();
    } while (u8g.nextPage());

    conditionDeadZone();
}

void loop()
{

    humidity = dht.readHumidity();
    temperature = dht.readTemperature();

    timing();
    potentiometerMeasurement();

    int newState = getNewState();

    switch (newState) {
    case stateA:
        setStateA();
        break;
    case stateB:
        setStateB();
        break;
    case stateC:
        setStateC();
        break;
    }
}

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
1

Nie wiem dlaczego to nie działa. Nie znam się za bardzo na Arduino, jeszcze nie miałem okazji się nim pobawić, choć podstawy C mam, dialektu dla tych komputerków też (a ten jest bardzo prosty). W sumie to wtrąciłem się do tego wątku głównie dlatego, że nie było chętnych do pomocy. ;)

Masz jeszcze mały bajzel w tym kodzie – np. funkcja potentiometerMeasurement służy do pobrania i zwrócenia wartości położenia potencjometru, której używasz w funkcji getNewState, ale też niepotrzebnie wołasz ją w funkcji loop (wartość zwrócona nie jest używana). Źle też robisz, że nie nazywasz funkcji zaczynając od czasownika – przez to nie za bardzo wiadomo co one robią.

Nie wiem w jaki sposób debuguje się programy wrzucone do Arduino – jeszcze się nie interesowałem na tyle tym tematem. Jeśli sam też nie wiesz jak się to robi to sugeruję wrzucać ten program po kawałku, bo cały kod jest dość krótki. Najpierw wrzuć kod zawierający jedną funkcjonalność i sprawdź czy działa. Następnie dodaj do niego kolejną, wrzuć i przetestuj. I tak ze wszystkimi mniejszymi funkcjami. W ten sposób dojdziesz do tego co nie działa.

Ewentualnie możesz uruchomić ten program z podłączonym komputerkiem do PC i przesyłać dane do konsoli, tak aby wiedzieć mniej więcej co działa a co nie i jakie są dane wejściowe (i czy w ogóle jakieś są). W razie czego, dane do konsoli przesyła się za pomocą Serial.write.

AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

To znaczy kod sam działał, dopiero po dodaniu do niego elementu histerezy przestał całkowicie działać :D to może być spowodowane jakimś błędem w kodzie ale pytanie gdzie jest błąd :D taki zaawansowany programista jak Ty raczej błędu nie zrobił - dziwna sprawa :D

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
1

Wrzuć do komputerka jakąś prostą demówkę (np. blink) i sprawdź czy się nie zepsuł. :D

AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Nie nie , wszystko działa jak wgrałem ten kod całkowicie bez histerezy (czyli "kod bazowy") :D ciężko to logicznie wytłumaczyć czemu to nie "trybi" na kod z histerezą :D

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
1

No to w rakim razie na 100% kod zawiera błędy. ;)

Dopisz sobie w kodzie funkcji getNewState instrukcje Serial.write i wyślij do konsoli zawartość wszystkich zmiennych, z których ta funkcja korzysta (łącznie z globalnymi). Powinieneś zauważyć coś niepokojącego.

AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Z tego co wyczytałem użycie funkcji serial.write() możliwe jest wyłącznie dla zmiennych typu: byte, char, unsigned char, signed char i bool i dlatego chyba nie działa w moim przypadku bo mam zmienne typu integer :D

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
0

Serial.write – przeczytaj jeszcze raz. Do dyspozycji są trzy wersje tej funkcji, jedna służy do wysłania pojedynczego bajtu, druga do wysłania ciągu znaków o dowolnej długości, a trzecia do przesłania dowolnego bloku bajtów o zadanym w drugim parametrze rozmiarze. Ty powinieneś skorzystać z trzeciej wersji, do przesłania dużych intów.


Edit: w sumie to można skorzystać z dwóch opcji. Jedną z nich jest rozbicie zmiennej typu int na dwa bajty (młodszy i starszy) i przesłanie ich pojedynczo, za pomocą pierwszej wersji funkcji (dla pojedynczych bajtów):

Kopiuj
int value = 1234;

serial.write(value / 256);
serial.write(value % 256);

Ewentualnie to samo można uzyskać za pomocą przesunięcia bitowego i bitowej koniunkcji (szybsze w działaniu). A drugi sposób to przesłanie dwóch bajtów od razu, za pomocą trzeciej wersji funkcji (dla dowolnych bloków):

Kopiuj
serial.write(&value, 2);

Oba sposoby powinny działać. Podpatrzone stąd: http://forum.arduino.cc/index.php?topic=39873

Oczywiście możesz też skorzystać z serial.print lub serial.println.

AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Zarówno w pierwszym jak i drugim sposobie wyskakują błędy :D co do drugiego to wyskakuje błąd o treści: no matching function for call to 'HardwareSerial::write(int*, int) :D

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
1

No sam zobacz – https://www.arduino.cc/en/Serial/write – są trzy wersje, ostatnia pobiera dwa parametry. Przeczytaj sobie cały podlinkowany przeze mnie wątek, tamten OP też miał z tym problemy, ale w koncu mu się udało.

Choć aby widzieć ładnie sformatowane dane w konsoli, powinieneś użyć serial.print i serial.println.

AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Tamten wątek przeczytany - każda składnia przetestowana jednak na monitorze portu szeregowego nie pokazuje się totalnie nic :D tak ale z tego co jest napisane ostatnia wersja odnosi się do tablic ;) chyba jednak nic z tego nie będzie :D

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
1

A co z serial.print? Nie mów, że też nie działa. ;)

AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Ale metoda serial.print umożliwia wysyłanie informacji przez port a nie ich odbieranie? ;)

EDIT : źle zrozumiałem ,już sprawdzam :D

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
1

No przecież masz wysłać dane z komputerka do peceta, żeby widzieć w konsoli jak wyglądają wartości zmiennych.

AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Coś jest totalnie nie tak bo serial.print również nie działa ,żadnej informacji na monitorze - tak jakby ten kod zawieszał całe arduino i na nic nie reaguje :D

Hmm chyba nic z tego nie będzie :/ mimo to dzięki wielkie za całą pomoc! Pozostanie sama strefa nieczułości skoro nic innego nie działa ;)

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
1

A podczas pracy komputerka, przewód USB masz cały czas podpięty pod PC i włączony Serial Monitor w IDE? W razie czego pooglądaj sobie tutoriale w sieci na temat używania tych instrukcji.

Przykład (również dla intów): Arduino Lesson 6 - Serial Printing.

AV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Do funkcji getNewState() dopisałem dla sprawdzenia przykładowy kod Serial.println("Hello word"); - kod ten jest poprawnie wyświetlany na monitorze , jednak jeżeli chodzi o wyświetlenie zmiennych to żadna nie zostaje wyświetlona :D

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12312
1

W takim razie masz buble w nowym kodzie. Zrób tak jak pisałem wcześniej – wrzucaj ten program po kawałku, funkcja po funkcji i testuj przepływ przesyłając dane do konsoli. Inaczej nic z tego nie będzie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.