Skocz do zawartości

Prośba o sprawdzenie schematu obrotomierza


kellyq

Pomocna odpowiedź

(edytowany)
17 minut temu, kellyq napisał:

jak jest tylko zadeklarowany to robi się kaszana

Przy prawidłowym kodzie tak się nie dzieje.

Musisz go pokazać. Oczywiście jeśli chcesz uzyskać pomoc.

Edytowano przez jand
Link do komentarza
Share on other sites

(edytowany)
54 minuty temu, jand napisał:

Musisz go pokazać. Oczywiście jeśli chcesz uzyskać pomoc.

Kod

#include <Stepper.h>
#include <Preferences.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#define hallPin 4
#define czujnik_zasilania 35
#define i2c_Address 0x3c
#define SCREEN_WIDTH 128 
#define SCREEN_HEIGHT 64 
#define OLED_RESET -1   //   QT-PY / XIAO

Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
TaskHandle_t Task1;
const int stepsPerRevolution = 100;  
int poprzednieObroty = 0;

Stepper myStepper(stepsPerRevolution, 33, 26, 27, 25);

volatile  unsigned long start_time = millis();
volatile  unsigned long event_time = 0; 
boolean flaga = 0;
unsigned long oldTime = 0; 
float obroty;
volatile float obroty_smothed = 0;
int kroki = 0;
int poprzednieKroki = 0;
volatile int counter;
volatile float MTH = 0.0;

Preferences preferences;

volatile float dziesietne_czesci;
volatile float sumaMTH = 0.0;

void IRAM_ATTR Zapis(){
  preferences.putFloat("MTH", sumaMTH);          //zapis motogodzin do pamięci
  preferences.putInt("counter", counter); 
}

void setup(){  
 // Serial.begin(9600);
  xTaskCreatePinnedToCore(Task1code,"Task1",10000,NULL,0,&Task1,0);
  myStepper.setSpeed(50);

  pinMode(czujnik_zasilania, INPUT_PULLUP);
  attachInterrupt(czujnik_zasilania, Zapis, RISING);

  preferences.begin("ustawienia", false);
  //  if(preferences.getBool("kontrolna")!=2){     //zapis standardowych ustawień
  //    preferences.putBool("kontrolna", 2);      // zapis kontrolnej liczby żeby nie nadpisywać za każdym wgraniem szkicu
  //    preferences.putFloat("MTH", 5058.2);          //zapis motogodzin do pamięci
  //    preferences.putInt("counter", 0);
  //  }

  counter = preferences.getInt("counter");
  MTH = preferences.getFloat("MTH");
}
void loop(){

  //Serial.println(counter);

  // 1865 obroty znamionowe x 60 = 111900 obrotów na motogodzinę

  obroty_smothed = 0.08* obroty + (1-0.08)* obroty_smothed;
  if(obroty_smothed < 400) obroty_smothed = 400;
  if(obroty_smothed >= 400) {
    kroki = map(obroty_smothed, 400, 2800, 0, 311);
    poprzednieObroty = obroty_smothed;
    int finalKroki = kroki - poprzednieKroki;
    myStepper.step(finalKroki);
    poprzednieKroki = kroki;
   }
}

void IRAM_ATTR Przerwanie(){
  if (flaga == 0) {
    event_time = millis();
    flaga = 1;
    counter += 1000;
  }   
}
void Task1code( void * pvParameters ) {  // pracuje na rdzeniu 0
  //SETUP
  display.begin(i2c_Address, true); // Address 0x3C default
  display.clearDisplay();
  pinMode(hallPin, INPUT_PULLUP);            //czujnik hala, obroty silnika
  attachInterrupt(hallPin,Przerwanie,FALLING);

  for(;;) {     //LOOP

    noInterrupts(); 
    if(flaga == 1){
      obroty = 60000/(event_time-start_time); 
      start_time = event_time;
      flaga = 0;
    }
    else if(flaga == 0 && (millis()-event_time)> 2000){   //zerowanie licznika na postoju,
      obroty = 400;
    }
    interrupts();

    if(counter>111900){      
      MTH = MTH+1;
      counter = 0;          //resetowanie licznika obrotów
    }

    dziesietne_czesci = counter/111900.0; 
    sumaMTH = MTH + dziesietne_czesci; 

    if(millis()-oldTime>1000){    //aktualizacja motogodzin co 2 sek na lcd
      display.clearDisplay();
      display.setTextSize(2);
      display.setTextColor(SH110X_WHITE);
      display.setCursor(50, 40);
      display.println(sumaMTH,1); //jedno miejsce po przecinku
      display.display();
      oldTime = millis();
    }


  }
}

 

Edytowano przez kellyq
Link do komentarza
Share on other sites

Tak na szybko:

1. Nie powinno się używać w procedurze ISR funkcji które nie mają atrybutu IRAM_ATTR. A metody klasy Preferences tego nie mają. Tak więc w funkcji zapis() musisz ustawić tylko flagę, a sam zapis przeprowadzić w loop().

2. Linijkę:

 attachInterrupt(hallPin,Przerwanie,FALLING);

przeniósłbym do setup(), tuż obok 

attachInterrupt(czujnik_zasilania, Zapis, RISING);

 

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

Wyrzuciłem zapis do pamięci z przerwania i wreszcie to ruszyło 😉 Czyli tu był jednak błąd. Działa na tym kondensatorze co mam. Dzięki wielkie 🙂

Jeszcze tylko ogarnę aby na starcie delikatnie wskazówkę cofnęło do punktu zero i będzie bajka

 

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!

Gość
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.