Skocz do zawartości

Prośba o sprawdzenie schematu obrotomierza


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
(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

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);

 

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

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...