Skocz do zawartości

Zawieszanie arduino nano(klon), jestem amatorem szukam wskazówek/wsparcia w małym projekcie


czvrnymat

Pomocna odpowiedź

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define switchA 6
#define switchB 5
#define SCREEN_WIDTH 128  // OLED display width, in pixels
#define SCREEN_HEIGHT 64  // OLED display height, in pixels
#define OBWOD 0.63        // obwodkoła
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1  // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

int time = 50;
int ledstate = HIGH;
int num = 0;
bool hactive = 0;
float szer = 0;
float hektary = 0;
float predkosc = 0;
float velo = 0;
float droga = 0;
float czas = 0;
word obrot;
byte state;
int half_revolution_time = 0;
unsigned long last_event = 0;


void rpm_fan() {
  unsigned long current_time = millis();
  if (current_time - last_event < 40) {  // debounce
    return;
  }
  half_revolution_time = (millis() - last_event);
  last_event = current_time;
  droga += OBWOD / 1000;
}




void setup() {
  pinMode(4,OUTPUT);
  pinMode(switchA, INPUT_PULLUP);
  pinMode(switchB, INPUT_PULLUP);
  Serial.begin(115200);
  pinMode(2, INPUT);  // Aktywowanie rezystora podciÄgajÄcego na pinie 2
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextColor(WHITE);
  display.clearDisplay();
  attachInterrupt(digitalPinToInterrupt(2), rpm_fan, FALLING);
}

void loop() {
  unsigned long current_time = millis();
  if (num == 0) {
    display.clearDisplay();
    display.setTextSize(2);
    display.setCursor(20, 0);
    display.print("Renault");
    display.setCursor(30, 30);
    display.print("103-54");
    display.display();
    delay(500);
    num = 1;
  }
  
if (half_revolution_time != 0) {
    velo = predkosc;
    predkosc = (OBWOD / half_revolution_time) * 3600;
  } else {
    predkosc = 0;
  }

  if (current_time - last_event >= 3000) {
    predkosc = 0;
  }
 

  if (szer != 0 && hactive == 1) { /*funkcja dająca mozliwosc uruchomienia hektaromierza*/
    hektary = droga * szer / 10;
  }


  if (digitalRead(switchA) == LOW && hactive == 1) {
    delay(time);
    if (digitalRead(switchA) == LOW && hactive == 1) {
      if (num == 2) {
        num = 1;
      } else {
        num = 2;
      }
    }
  }
  if (digitalRead(switchB) == LOW && num == 1) {  //przelaczanie pomiedzy hektaromierzem, a dystanomierzem
    delay(time);
    if (digitalRead(switchB) == LOW && num == 1) {
      if (hactive == 1) {
        hactive = 0;
      } else {
        hactive = 1;
      }
    }
  }
  if (digitalRead(switchB) == LOW && num == 2) {  // ustawianie szerokosci roboczej
    delay(time);
    if (digitalRead(switchB) == LOW && num == 2) {
      szer += 0.1;
      if (szer > 4) {
        szer = 1;
      }
    }
  }

  if (digitalRead(switchA) == LOW && digitalRead(switchB) == LOW) {  // nacisniecie obu przyciskow powoduje wyzerowanie hektaromierza
    delay(time);
    if (digitalRead(switchA) == LOW && digitalRead(switchB) == LOW) {
      hektary = 0;
    }
  }


  if (millis() - czas >= 300) {
        display.clearDisplay();
    czas = millis();
    if (num == 1) {
      display.setCursor(15, 25);
      display.setTextSize(4);
      display.print(predkosc, 1);
      display.setTextSize(1);
      display.setCursor(80, 55);
      display.print(" km/h");
      if (hactive == 1) {
        display.setCursor(85, 5);
        display.setTextSize(1);
        display.print("UPRAWA");
        display.setCursor(15, 0);
        display.setTextSize(2);
        display.print(hektary, 3);  // hektary - obwód koła x szerokość maszyny podzielić przez hektar (10000m20
        display.setCursor(65, 5);
        display.setTextSize(1);
        display.print(" hA");
        display.display();
      } else {
          display.setCursor(85, 5);
  display.setTextSize(1);
  display.print("SZOSA");
  display.setCursor(5, 0);
  display.setTextSize(2);
  display.print(droga, 3);  // hektary - obwód koła x szerokość maszyny podzielić przez hektar (10000m20)
  display.setCursor(65, 5);
  display.setTextSize(1);
  display.print("km");
  display.drawLine(111, 40, 120, 0, WHITE);
  display.drawLine(110, 40, 121, 0, WHITE);
  display.drawLine(125, 40, 128, 4, WHITE);
  display.drawLine(118, 38, 119, 30, WHITE);
  display.drawLine(121, 22, 122, 14, WHITE);
  display.drawLine(123, 6, 124, 0, WHITE);
  display.display();
      }
    }
    if (num == 2) {
      display.setCursor(5, 0);
      display.setTextSize(2);
      display.print("SZEROKOSC:");
      display.drawLine(0, 20, 128, 20, WHITE);
      display.setCursor(35, 25);
      display.setTextSize(3);
      display.print(szer, 1);
      display.setTextSize(1);
      display.setCursor(60, 55);
      display.print("metr(y)");
      display.display();
    }
  }
}

to jest ten cały smieszny kod który napisałem po to by (nie)działał. Siedziałem bardzo długo szukając błedu który sprawia, że arduino nano się blokuje po 30-40 sek pracy. Co ciekawe, gdy pierwszy raz uruchamiałem program na plytce działał bez zarzutów, wszystko smigało. Dopiero gdy zabrałem się za montaż mojego licznika hektarów, nagle urządzenie przestało chcieć współpracować. Proszę niech ktoś pomoże, bo bardzo mi zależało, żeby zrobić ten licznik któy pracuje bez zarzutu. 

 

@SOYER

 

Edytowano przez czvrnymat
  • Lubię! 1
Link do komentarza
Share on other sites

Zmienne globalne, wykorzystywane w procedurze obsługi przerwania powinny mieć atrybut volatile, czyli

volatile float droga = 0;
volatile int half_revolution_time = 0;
volatile unsigned long last_event = 0;

 

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

(edytowany)

A czy taki blad ze strony programu, to moze byc wina plytki??? 
 

Zmienilem typy, na volatile tam gdzie faktczynie zachodza zmiany podczas przerwan, jednak bezskutecznie.

Musze jednoczesnie zaznaczyc, ze ciagle mysle o uszkodzonej plytce poniewaz byla ona wlutowana w plytke pcb, przy temperaturze ustawionej na amatorskiej stacji lutowniczej do 270 stopni. Jednak jest to tez druha plytke ktora ma ten sam problem. Nie wiem czy jest sens kupowac kolejną i znow testowac program ale tym razem bez lutowania tylko kupic koszyczek pod nano

 

(zdjecie-sorki za bajzel…)

Edytowano przez czvrnymat
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Jak dwie płytki zachowują się tak samo, to nie ma co kupować następnej.

Dla sprawdzenia możesz wgrać jakiś inny program (choćby mruganie diodą).

Link do komentarza
Share on other sites

Dnia 16.02.2024 o 00:05, czvrnymat napisał:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define switchA 6
#define switchB 5
#define SCREEN_WIDTH 128  // OLED display width, in pixels
#define SCREEN_HEIGHT 64  // OLED display height, in pixels
#define OBWOD 0.63        // obwodkoła
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1  // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

int time = 50;
int ledstate = HIGH;
int num = 0;
bool hactive = 0;
float szer = 0;
float hektary = 0;
float predkosc = 0;
float velo = 0;
float droga = 0;
float czas = 0;
word obrot;
byte state;
int half_revolution_time = 0;
unsigned long last_event = 0;


void rpm_fan() {
  unsigned long current_time = millis();
  if (current_time - last_event < 40) {  // debounce
    return;
  }
  half_revolution_time = (millis() - last_event);
  last_event = current_time;
  droga += OBWOD / 1000;
}




void setup() {
  pinMode(4,OUTPUT);
  pinMode(switchA, INPUT_PULLUP);
  pinMode(switchB, INPUT_PULLUP);
  Serial.begin(115200);
  pinMode(2, INPUT);  // Aktywowanie rezystora podciÄgajÄcego na pinie 2
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextColor(WHITE);
  display.clearDisplay();
  attachInterrupt(digitalPinToInterrupt(2), rpm_fan, FALLING);
}

void loop() {
  unsigned long current_time = millis();
  if (num == 0) {
    display.clearDisplay();
    display.setTextSize(2);
    display.setCursor(20, 0);
    display.print("Renault");
    display.setCursor(30, 30);
    display.print("103-54");
    display.display();
    delay(500);
    num = 1;
  }
  
if (half_revolution_time != 0) {
    velo = predkosc;
    predkosc = (OBWOD / half_revolution_time) * 3600;
  } else {
    predkosc = 0;
  }

  if (current_time - last_event >= 3000) {
    predkosc = 0;
  }
 

  if (szer != 0 && hactive == 1) { /*funkcja dająca mozliwosc uruchomienia hektaromierza*/
    hektary = droga * szer / 10;
  }


  if (digitalRead(switchA) == LOW && hactive == 1) {
    delay(time);
    if (digitalRead(switchA) == LOW && hactive == 1) {
      if (num == 2) {
        num = 1;
      } else {
        num = 2;
      }
    }
  }
  if (digitalRead(switchB) == LOW && num == 1) {  //przelaczanie pomiedzy hektaromierzem, a dystanomierzem
    delay(time);
    if (digitalRead(switchB) == LOW && num == 1) {
      if (hactive == 1) {
        hactive = 0;
      } else {
        hactive = 1;
      }
    }
  }
  if (digitalRead(switchB) == LOW && num == 2) {  // ustawianie szerokosci roboczej
    delay(time);
    if (digitalRead(switchB) == LOW && num == 2) {
      szer += 0.1;
      if (szer > 4) {
        szer = 1;
      }
    }
  }

  if (digitalRead(switchA) == LOW && digitalRead(switchB) == LOW) {  // nacisniecie obu przyciskow powoduje wyzerowanie hektaromierza
    delay(time);
    if (digitalRead(switchA) == LOW && digitalRead(switchB) == LOW) {
      hektary = 0;
    }
  }


  if (millis() - czas >= 300) {
        display.clearDisplay();
    czas = millis();
    if (num == 1) {
      display.setCursor(15, 25);
      display.setTextSize(4);
      display.print(predkosc, 1);
      display.setTextSize(1);
      display.setCursor(80, 55);
      display.print(" km/h");
      if (hactive == 1) {
        display.setCursor(85, 5);
        display.setTextSize(1);
        display.print("UPRAWA");
        display.setCursor(15, 0);
        display.setTextSize(2);
        display.print(hektary, 3);  // hektary - obwód koła x szerokość maszyny podzielić przez hektar (10000m20
        display.setCursor(65, 5);
        display.setTextSize(1);
        display.print(" hA");
        display.display();
      } else {
          display.setCursor(85, 5);
  display.setTextSize(1);
  display.print("SZOSA");
  display.setCursor(5, 0);
  display.setTextSize(2);
  display.print(droga, 3);  // hektary - obwód koła x szerokość maszyny podzielić przez hektar (10000m20)
  display.setCursor(65, 5);
  display.setTextSize(1);
  display.print("km");
  display.drawLine(111, 40, 120, 0, WHITE);
  display.drawLine(110, 40, 121, 0, WHITE);
  display.drawLine(125, 40, 128, 4, WHITE);
  display.drawLine(118, 38, 119, 30, WHITE);
  display.drawLine(121, 22, 122, 14, WHITE);
  display.drawLine(123, 6, 124, 0, WHITE);
  display.display();
      }
    }
    if (num == 2) {
      display.setCursor(5, 0);
      display.setTextSize(2);
      display.print("SZEROKOSC:");
      display.drawLine(0, 20, 128, 20, WHITE);
      display.setCursor(35, 25);
      display.setTextSize(3);
      display.print(szer, 1);
      display.setTextSize(1);
      display.setCursor(60, 55);
      display.print("metr(y)");
      display.display();
    }
  }
}

to jest ten cały smieszny kod który napisałem po to by (nie)działał. Siedziałem bardzo długo szukając błedu który sprawia, że arduino nano się blokuje po 30-40 sek pracy. Co ciekawe, gdy pierwszy raz uruchamiałem program na plytce działał bez zarzutów, wszystko smigało. Dopiero gdy zabrałem się za montaż mojego licznika hektarów, nagle urządzenie przestało chcieć współpracować. Proszę niech ktoś pomoże, bo bardzo mi zależało, żeby zrobić ten licznik któy pracuje bez zarzutu. 

 

@SOYER

 

Możesz też wstawić w kilku miejscach Twojego kodu Serial.println(ważne informacje);

gdzie wypisujesz w określonych miejscach kodu aktualny stan kluczowych zmiennych, wtedy widzisz czy program robi to co chcesz prawidłowo, albo po prostu w różnych miejscach kodu

Serial.println(„1”)

Serial.println(”2”)

Serial.println(”3”)

wtedy widzisz gdzie program utknął.

Link do komentarza
Share on other sites

(edytowany)

Myślę że problem występuje w obsłudze przerwania, na oko(tak wiem że słaba metodyka 😄) ta funkcja trwa zbyt długo, spróbuj ją zakomentować i sprawdź czy program nadal będzie się zawieszał, to da Ci wstępny namiar na miejsce wystąpienia problemu.

Jeszcze jedna rzecz związana z funkcją przerwania, czy na pewno potrzebujesz w niej obsługi drgań styków? Skąd przychodzą sygnały rpm_fan? Ja próbowałbym to uprościć do funkcji:

 droga += OBWOD / 1000f;


 

Edytowano przez _LM_
  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

 

Dzielenie   OBWOD / 1000.  jest i tak wykonywane na etapie kompilacji, bo obie wartości są wtedy juz znane.

 

46 minut temu, _LM_ napisał:

Skąd przychodzą sygnały rpm_fan?

Słuszna uwaga, bo sam pisałeś, że coś się zepsuło na etapie montażu.

Na czym ten montaż polegał?

Edytowano przez jand
  • Lubię! 2
Link do komentarza
Share on other sites

W przerwaniach nie powinno się wywoływać funkcji, bo to długo trwa, Ty wywołujesz dwa razy, tą samą, której wynik już wcześniej przypisałeś do zmiennej ulong.

Napisz tak loop by tam nie było delay po parę sekund, tylko po kilka us, raz na jakiś czas te 10ms by odświeżyć ekran oled - to trwa długo po i2C (upewnij się że i2c działa na 400kHz), w przerwaniu zaznaczaj tylko, że był kolejny impuls, wyliczaj to sobie w loop. Zresztą tym bardziej nie ma to sensu, gdy nie spodziewasz się impulsów częściej niż co 40ms, leniwy ten wiatraczek.

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define switchA 6
#define switchB 5
#define SCREEN_WIDTH 128  // OLED display width, in pixels
#define SCREEN_HEIGHT 64  // OLED display height, in pixels
#define OBWOD 0.63        // obwodkoła
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1  // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

volatile int time = 50;
int ledstate = HIGH;
int num = 0;
int hactive = 0;
float szer = 0;
float hektary = 0;
float predkosc = 0;
float velo = 0;
volatile float droga = 0;
float czas = 0;
word obrot;
byte state;
volatile int half_revolution_time = 0;
volatile unsigned long last_event = 0;
volatile unsigned long current_time = 0;
volatile unsigned long current = 0;

/*void rpm_fan() {
  current_time = millis();
  if (current_time - last_event < 40) {  // debounce
    return;
  }
  half_revolution_time = (millis() - last_event);
  last_event = current_time;
  droga += OBWOD;
}*/




void setup() {
  pinMode(switchA, INPUT_PULLUP);
  pinMode(switchB, INPUT_PULLUP);
  Serial.begin(115200);
  pinMode(2, INPUT);  // Aktywowanie rezystora podciÄgajÄcego na pinie 2
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextColor(WHITE);
  display.clearDisplay();
  //attachInterrupt(digitalPinToInterrupt(2), rpm_fan, FALLING);
}

void loop() {
  current = millis();
  if (num == 0) {
    display.clearDisplay();
    display.setTextSize(2);
    display.setCursor(20, 0);
    display.print("Renault");
    display.setCursor(30, 30);
    display.print("103-54");
    display.display();
    delay(500);
    num = 1;
  }

  if (half_revolution_time != 0) {
    velo = predkosc;
    predkosc = (OBWOD / half_revolution_time) * 3600;
  } else {
    predkosc = 0;
  }

  if (current - last_event >= 3000) {
    predkosc = 6;
  }
  if (current - last_event >= 10000) {
    predkosc = 7;
  }

  if (szer != 0 && hactive == 1) { /*funkcja dająca mozliwosc uruchomienia hektaromierza*/
    hektary = droga * szer / 10;
  }


  /*if (digitalRead(switchA) == LOW && hactive == 1) {
    time = millis();
    if (digitalRead((switchA) == LOW && hactive == 1) && millis()-time>=100) {
      if (num == 2) {
        num = 1;
      } else {
        num = 2;
      }
    }
  }*/
  if (digitalRead(switchB) == LOW /*&& num == 1*/) {  //przelaczanie pomiedzy hektaromierzem, a dystanomierzem
    time = millis();
    //if ((digitalRead(switchB) == LOW && num == 1) && millis() - time>=100) {
    if (hactive == 1) {
      hactive = 0;
    } else {
      hactive = 1;
    }
    //}
  }
  /*
  if (digitalRead(switchB) == LOW && num == 2) {  // ustawianie szerokosci roboczej
    delay(time);
    if (digitalRead(switchB) == LOW && num == 2) {
      szer += 0.1;
      if (szer > 4) {
        szer = 1;
      }
    }
  }*/

  /*if (digitalRead(switchA) == LOW && digitalRead(switchB) == LOW) {  // nacisniecie obu przyciskow powoduje wyzerowanie hektaromierza
    delay(time);
    if (digitalRead(switchA) == LOW && digitalRead(switchB) == LOW) {
      hektary = 0;
    }
  }*/


  if (millis() - czas >= 300) {
    display.clearDisplay();
    czas = millis();
    if (num == 1) {
      display.setCursor(15, 25);
      display.setTextSize(4);
      display.print(predkosc, 1);
      display.setTextSize(1);
      display.setCursor(80, 55);
      display.print(" km/h");
      if (hactive == 1) {
        display.setCursor(85, 5);
        display.setTextSize(1);
        display.print("UPRAWA");
        display.setCursor(15, 0);
        display.setTextSize(2);
        display.print(hektary, 3);  // hektary - obwód koła x szerokość maszyny podzielić przez hektar (10000m20
        display.setCursor(65, 5);
        display.setTextSize(1);
        display.print(" hA");
        display.display();
      } else {
        display.setCursor(85, 5);
        display.setTextSize(1);
        display.print("SZOSA");
        display.setCursor(5, 0);
        display.setTextSize(2);
        display.print(droga, 3);  // hektary - obwód koła x szerokość maszyny podzielić przez hektar (10000m20)
        display.setCursor(65, 5);
        display.setTextSize(1);
        display.print("km");
        display.drawLine(111, 40, 120, 0, WHITE);
        display.drawLine(110, 40, 121, 0, WHITE);
        display.drawLine(125, 40, 128, 4, WHITE);
        display.drawLine(118, 38, 119, 30, WHITE);
        display.drawLine(121, 22, 122, 14, WHITE);
        display.drawLine(123, 6, 124, 0, WHITE);
        display.display();
      }
    }
    if (num == 2) {
      display.setCursor(5, 0);
      display.setTextSize(2);
      display.print("SZEROKOSC:");
      display.drawLine(0, 20, 128, 20, WHITE);
      display.setCursor(35, 25);
      display.setTextSize(3);
      display.print(szer, 1);
      display.setTextSize(1);
      display.setCursor(60, 55);
      display.print("metr(y)");
      display.display();
    }
  }
}

jak widać duża część kodu w tej chwili została wyłączona, o dziwo przy pierwszym wgraniu i właczeniu program był wstanie przełączać się pomiedzy tym co ma zostać wyświetlone na ekranie, czyli szosa/hektary. Jednak po 3s predkosc ustawiła sie na 6km/h, wiec czekałem jak tylkko przestawi się na 7km/h. Ale moge sobie tak czekać i czekac

Jeżeli zaś chodzi, o jakiś prosty kod typu wgranie miganiem diody, działa.. 

Co do sugestii, czy ekran działa na 400kHz, troche nie wiem jak to mogę sprawdzić.

Chciałbym sprobować zmienić ten sposob, ze właśnie wykryto impuls, jednak narazie się zastanawiam w takim razie co w tej fukncji mogłoby się dziać.

z tej fukcji tak naprawdę interesuje mnie HALF_REVOLUTION_TIME, ponieważ to dzięki tej wartości jestem w stanie obliczać predkość z jaką porusza się ciągnik/kombajn

 

Edytowano przez czvrnymat
Link do komentarza
Share on other sites

(edytowany)

program działa około 10-20sek, zalezy jak mu się chce, powoli się poddaje, przy czym troszke lepiej gdy ustawiłem odswiezanie co 0,5sek

Edytowano przez czvrnymat
Link do komentarza
Share on other sites

(edytowany)

Myślę że jednym z problemów jest to 
 

float czas = 0;

próźniej robisz warunek 
 

  if (millis() - czas >= 300) {
    display.clearDisplay();
    czas = millis();

jest tutaj konflikt typów, aż dziwne że kompilator nie zgłasza błędów, zamień typ czas na uint32_t 

tak samo 

volatile int time = 50;

zmień na uint32_t 

Edytowano przez _LM_
Link do komentarza
Share on other sites

niestety problem nadal występuje

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define switchA 6
#define switchB 5
#define SCREEN_WIDTH 128  // OLED display width, in pixels
#define SCREEN_HEIGHT 64  // OLED display height, in pixels
#define OBWOD 0.63        // obwodkoła
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1  // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

uint32_t time = 50;
int ledstate = HIGH;
int num = 0;
int hactive = 0;
float szer = 0;
float hektary = 0;
float predkosc = 0;
float velo = 0;
volatile float droga = 0;
uint32_t czas = 0;
word obrot;
byte state;
volatile int half_revolution_time = 0;
volatile unsigned long last_event = 0;
volatile unsigned long current_time = 0;
volatile unsigned long current = 0;

/*void rpm_fan() {
  current_time = millis();
  if (current_time - last_event < 40) {  // debounce
    return;
  }
  half_revolution_time = (millis() - last_event);
  last_event = current_time;
  droga += OBWOD;
}*/




void setup() {
  pinMode(switchA, INPUT_PULLUP);
  pinMode(switchB, INPUT_PULLUP);
  Serial.begin(115200);
  //pinMode(2, INPUT);  // Aktywowanie rezystora podciÄgajÄcego na pinie 2
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextColor(WHITE);
  display.clearDisplay();
  //attachInterrupt(digitalPinToInterrupt(2), rpm_fan, FALLING);
}

void loop() {
  current = millis();
  if (num == 0) {
    display.clearDisplay();
    display.setTextSize(2);
    display.setCursor(20, 0);
    display.print("Renault");
    display.setCursor(30, 30);
    display.print("103-54");
    display.display();
    delay(500);
    num = 1;
  }

  if (half_revolution_time != 0) {
    velo = predkosc;
    predkosc = (OBWOD / half_revolution_time) * 3600;
  } else {
    predkosc = 0;
  }

  if (current - last_event >= 3000) {
    predkosc = 6;
  }
  if (current - last_event >= 10000) {
    predkosc = 7;
  }

  if (szer != 0 && hactive == 1) { /*funkcja dająca mozliwosc uruchomienia hektaromierza*/
    hektary = droga * szer / 10;
  }


  if (digitalRead(switchA) == LOW && hactive == 1) {
    //delay(time);
    //if (digitalRead(switchA) == LOW && hactive == 1) {
      if (num == 2) {
        num = 1;
      } else {
        num = 2;
      }
    //}
  }
  if (digitalRead(switchB) == LOW /*&& num == 1*/) {  //przelaczanie pomiedzy hektaromierzem, a dystanomierzem
    //time = millis();
    //if ((digitalRead(switchB) == LOW && num == 1) && millis() - time>=100) {
    if (hactive == 1) {
      hactive = 0;
    } else {
      hactive = 1;
    }
    //}
  }
  
  if (digitalRead(switchB) == LOW && num == 2) {  // ustawianie szerokosci roboczej
    //delay(time);
    //if (digitalRead(switchB) == LOW && num == 2) {
      szer += 0.1;
      if (szer > 4) {
        szer = 1;
      }
    //}
  }

  /*if (digitalRead(switchA) == LOW && digitalRead(switchB) == LOW) {  // nacisniecie obu przyciskow powoduje wyzerowanie hektaromierza
    delay(time);
    if (digitalRead(switchA) == LOW && digitalRead(switchB) == LOW) {
      hektary = 0;
    }
  }*/


  if (millis() - czas >= 100) {
    display.clearDisplay();
    czas = millis();
    if (num == 1) {
      display.setCursor(15, 25);
      display.setTextSize(4);
      display.print(predkosc, 1);
      display.setTextSize(1);
      display.setCursor(80, 55);
      display.print(" km/h");
      if (hactive == 1) {
        display.setCursor(85, 5);
        display.setTextSize(1);
        display.print("UPRAWA");
        display.setCursor(15, 0);
        display.setTextSize(2);
        display.print(hektary, 3);  // hektary - obwód koła x szerokość maszyny podzielić przez hektar (10000m20
        display.setCursor(65, 5);
        display.setTextSize(1);
        display.print(" hA");
        display.display();
      } else {
        display.setCursor(85, 5);
        display.setTextSize(1);
        display.print("SZOSA");
        display.setCursor(5, 0);
        display.setTextSize(2);
        display.print(droga, 3);  // hektary - obwód koła x szerokość maszyny podzielić przez hektar (10000m20)
        display.setCursor(65, 5);
        display.setTextSize(1);
        display.print("km");
        /*display.drawLine(111, 40, 120, 0, WHITE);
        display.drawLine(110, 40, 121, 0, WHITE);
        display.drawLine(125, 40, 128, 4, WHITE);
        display.drawLine(118, 38, 119, 30, WHITE);
        display.drawLine(121, 22, 122, 14, WHITE);
        display.drawLine(123, 6, 124, 0, WHITE);*/
        display.display();
      }
    }
    if (num == 2) {
      display.setCursor(5, 0);
      display.setTextSize(2);
      display.print("SZEROKOSC:");
      display.drawLine(0, 20, 128, 20, WHITE);
      display.setCursor(35, 25);
      display.setTextSize(3);
      display.print(szer, 1);
      display.setTextSize(1);
      display.setCursor(60, 55);
      display.print("metr(y)");
      display.display();
    }
  }
}

 

Link do komentarza
Share on other sites

@czvrnymat dopisz w loop() linijkę która będzie coś wyświetlać na wyswietlaczu, jakaś zmienna która się będzie zwiększać o jeden za każdym nowym obiegiem...wtedy się upewnimy czy program na pewno się zawiesił czy tylko nie wykonuje się odświeżanie ekranu

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.