Skocz do zawartości

Sterownik silnika 1 przycisk pamieć po utracie zasilania


nebraska

Pomocna odpowiedź

Siemka

Chcę zrobić sterownik silnika 12V, sterować obrotami lewo, prawo z jednego przycisku.

Napisałem kod i działa ok. Sterowanie:

Przycisk Obroty lewo

Przycisk Stop

Przycisk Obroty w prawo

Przycisk Stop

Problem tylko jak dodać eprom żeby po utracie zasilania jak wcisnę przycisk silnik kręcił się w stronę przeciwną. Próbowałem na wiele sposobów i nie mogę.

#include <EEPROM.h>
const byte checkButton = 5;
const byte ledRelay = 12;
const byte ledRelay2 = 13;
bool flaga = false;
uint8_t ile = 0;
uint8_t save = 0;
unsigned long czas;


void setup() {
  Serial.begin(9600);
  EEPROM.begin(1024);
  pinMode(checkButton, INPUT_PULLUP);
  pinMode(ledRelay, OUTPUT);
  pinMode(ledRelay2, OUTPUT);
  digitalWrite(ledRelay, HIGH);
  digitalWrite(ledRelay2, HIGH);


//save=EEPROM.read(300);
//Serial.println(save);


delay(100);
}

void loop() {
  if (digitalRead(checkButton) == LOW) {           //  jesli wcisnieto przycisk
    delay(50);                                    //   odczekaj na drgania stykow
    if (digitalRead(checkButton) == LOW) {       //    jesli przycisk ciagle jest wcisniety
      while (digitalRead(checkButton) == LOW);  //     czekaj na puszczenie
      ile++;
      delay(10);

      if (ile == 1) {
        Serial.println("Przycisk Zamknij");
        digitalWrite(ledRelay, LOW);
        czas = millis();
        flaga = true;
        //save=1;
        //EEPROM.write(300, save);
       // EEPROM.commit();
      }
      else if (ile == 2 ) {
        Serial.println("Stop Zamknij");
        digitalWrite(ledRelay, HIGH);
        flaga = false;

 
      }
      else if (ile == 3) {
        Serial.println("Przycisk Otwórz");
        digitalWrite(ledRelay2, LOW);
        flaga = true;
        czas = millis();
      }
      else if (ile == 4) {
        Serial.println("Stop Otwórz");
        digitalWrite(ledRelay2, HIGH);
        flaga = false;
        ile = 0;
      }
    }
  }
  if (flaga) {
    if (millis() - czas >= 60000) { // Jesli nie bylo wylaczenia przyciskiem. Wylacz po okreslonym Czasie
      if (ile == 1) {
        ile = 2;
      }
      if (ile == 3) {
        ile = 4;
      }
    }
    if (ile == 2) {
      Serial.println("Stop Zamknij Po Okreslonym Czasie");
      digitalWrite(ledRelay, HIGH);
      flaga = false;
    }
    if (ile == 4) {
      Serial.println("Stop Otworz Po Okreslonym Czasie 222");
      digitalWrite(ledRelay2, HIGH);
      flaga = false;
      ile = 0;
    }
  }
}

 

Link do komentarza
Share on other sites

20 minut temu, kostuch napisał:

Jeżeli to esp, to eeprom i tak jest emulowany we flashu.

Są lepsze rozwiązania, np. biblioteka preferences. Albo plik json na littlefs.

Tak wiem że EPROM w ESP używa flasha w jakimś obszarze. Z tym preferences problem jest taki, że nie jest przenośne na boardy esp8266 ani na arduino.

 

 

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

A kto powiedział że ma być przenośne?

#ifdef AVR
  // kod dla Uno
#elif defined(ESP8266)
  // kod dla 8266
#elif defined(ESP32)
  // kod dla ESP32
#else
#error "co ty tam masz?"
#endif

 

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

To ma przetrwać wyłaczenie czy reset? Bo ESP bez eepromu czy frama reset przeżyje, ale żaden mikrokontroler nie przeżyje utraty zasilania.

A przenośne to będzie jak zajrzysz dwa posty wyżej.

Link do komentarza
Share on other sites

3 minuty temu, ethanak napisał:

To ma przetrwać wyłaczenie czy reset? Bo ESP bez eepromu czy frama reset przeżyje, ale żaden mikrokontroler nie przeżyje utraty zasilania.

A przenośne to będzie jak zajrzysz dwa posty wyżej.

Utratę zasilania.

Dzięki będę musiał spróbować preferences dotychczas używałem na esp32, bo na 8266 nie działało.

Link do komentarza
Share on other sites

No to tak:

Flash (ESP) przezyje 10k zapisów

ATmega z wbudowanym eepromem przeżyje 100k zapisów.

Pchełka za zeta przeżyje 10M zapisów.

To dane katalogowe. Wybierz rozwiazanie.

Tak przy okazji - kod z pchełką bedzie przenośny... nawet dla procków których nie znasz.

Link do komentarza
Share on other sites

(edytowany)
7 minut temu, ethanak napisał:

No to tak:

Flash (ESP) przezyje 10k zapisów

ATmega z wbudowanym eepromem przeżyje 100k zapisów.

Pchełka za zeta przeżyje 10M zapisów.

To dane katalogowe. Wybierz rozwiazanie.

Tak przy okazji - kod z pchełką bedzie przenośny... nawet dla procków których nie znasz.

Podałbyś linka do tej kości? jakieś bblioteki do niej się używa czyta ta prefernces?

To faktycznie trzeba będzie kupić.

Edytowano przez nebraska
Link do komentarza
Share on other sites

nie podam teraz linka, ale zanim zajdę do domu to sam znajdziesz na Aledrogo.

Nie, nie obsługuje preferences ani żadnych innych wynalazków, podpinasz cztery druty i gra.

Szukaj w okolicy 27C01

 

Link do komentarza
Share on other sites

Dzięki na przyszłość będzie, potestowałbym z ciekawości na pewno się przyda.

Musze pomyśleć bo w tym moim programie powinno się to rozwiązać bez epromu.

Jeśli zmienna ile==2 i utrata zasilania to program zaczyna od ile==1 czyli obroty kręcą się w stronę przeciwną, muszę tylko rozwiązać tą zmienną ile==1, żeby po utracie zasilania i wciśnięciu przycisku wchodizła  ile==2.

 

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

Ja już zacząłem temat o erpomie. Czy taka forma będzie ok w Atmedze? Program działa  tylko nie zajeżdże eprom? Użyłem update żeby zapisał tylko wtedy kiedy cyfra się zmieni.

 ile++;
  delay(50);

  if (ile == 1) {

    block_time = 2; 
    block_time2 = 1; 
    delay(100);
  }
  if (ile == 2) {
  
    block_time = 6;  
    block_time2 = 3; 
    delay(100);
  }
  if (ile == 3) {
  
    block_time = 10;   
    block_time2 = 5;  
    delay(100);
  }
  if (ile == 4) {
    
    block_time = 20;   
    block_time2 = 10;  
    delay(100);
  }
  if (ile == 5) {
    block_time = 40;    
    block_time2 = 20;  
    delay(100);
  }
  if (ile == 6) {
    block_time = 60;    
    block_time2 = 30; 
    delay(100);
  }
  if (ile == 7) {
    block_time = 113;      
    block_time2 = 60;     
    delay(100);
  }
  if (ile >= 7) {
    ile = 0;
  }
   EEPROM.update(0, block_time);
   EEPROM.update(1, block_time2);
   EEPROM.update(2, ile);
   delay(150);
}

 

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.