• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Użycie biblioteki Timers
#1
Witam
mam pewien problem z poprawnym użyciem biblioteki timers. Potrzebna jest mi obsługa kilku rzeczy w quadzie takich jak wyświetlenie temperatur, sterowanie lampą cofania i najważniejszy czujnik przechyłu który zgasi sprzęt w razie jakiegoś draki i lądowania na kierownicy. 

Każda część kodu z osobna działa bez problemu, zrobiłem sobie nawet płytkę drukowaną metodą termotransferu i całkiem fajnie wyszło ale kod w całości niestety nie działa. Czy moglibyście rzucić na to okiem, może akurat strzeliłem jakąś gafę i świeże spojrzenie pomoże Wink

Będę bardzo wdzięczny Smile

Kod:
 //Czujnik przechyłu
 int oczekiwanie = 0;
 int opoznienie = 5000; // opóźnienie po którym ma zostać wykonana akcja, czas w ms
 int minNapiecie = 3; // minimalne napięcie do warunku w woltach
 int napiecieOdczyt = 0;
 float napiecie = 0;
 
 //Czujniki temperatury
   #include <OneWire.h>
   #include <DS18B20.h>
   #include "SevenSegmentTM1637.h"
   #include <Timers.h>
   Timers <3> akcja;

 #define RollRelay 4 //Przekaźnik zapłonu
 
 #define ReverseSensor 2 //wejscie masy czujnika wstecznego
 #define ReverseSignal 7 //wyjście masy czujnika wstecznego
 #define ReverseLED 8    //wyjście sterowania tranzystora lampy wstecznego

 //czujniki
 #define ONEWIRE_PIN 3
 #define SENSORS_NUM 2
   const byte address[SENSORS_NUM][8] PROGMEM = {
     0x28, 0xB1, 0x6D, 0xA1, 0x3, 0x0, 0x0, 0x11,
     0x28, 0x87, 0x6A, 0xA1, 0x3, 0x0, 0x0, 0x1F};
 OneWire onewire(ONEWIRE_PIN);
 DS18B20 sensors(&onewire);

 //wyswietlacz
 const byte PIN_CLK = 11;
 const byte PIN_DIO = 12;
 SevenSegmentTM1637    display(PIN_CLK, PIN_DIO);
   
 
 void Roll(){
   napiecieOdczyt = analogRead(A0);
   napiecie = napiecieOdczyt * (5.0/1023.0); // odczyt napiecia
  // Serial.println(napiecie);
  // Serial.println(napiecie);
 
 
   // kiedy napiecie jest mniejsze i czas oczekiwania byl mniejszy niz wartosci okreslone
 if ((napiecie > minNapiecie) && (oczekiwanie < opoznienie)) {
   delay(100); // próbkowanie czasu żeby nie stopować programu
   oczekiwanie = oczekiwanie+100; //oczekiwanie zwieksza sie zawsze wtedy kiedy napiecie jest mniejsze od zadanego
   //Serial.println(oczekiwanie);

 }
 
 //warunek zerujący licznik jeżeli napięcie skoczy nawet na chwilę powyżej zadanej wartości lub będzie jej równy, żeby uniknąć sytuacji że napięcie było niższe "na raty" bo chodzi o ciągłość czasu
 if (napiecie <= minNapiecie) {
   oczekiwanie = 0;
   
 }

 // wlasciwy warunek do utrzymującego sie spadku napiecia
 if (oczekiwanie >= opoznienie) {
   digitalWrite(RollRelay, HIGH); // jezeli napięcie było mniejsze od wartości zadanej przez dłuższy czas, warunek spełniony i wykonaj akcję
   
   //oczekiwanie = 0; // wyzerowanie licznika po wykonaniu jednokrotnie akcji, program wraca w pętlę do funkcji while i liczy od nowa
 }
 
 
 }

 void Temp() {
   if (sensors.available())
   {
     for (byte i=0; i<SENSORS_NUM; i++)
      {
       float temperature = sensors.readTemperature(FA(address[0]));
       float temperature1 = sensors.readTemperature(FA(address[1]));
         for (int a=0; a<10; a++) {
           display.print(temperature);
           display.printRaw(B01001001, 3);
           delay(1000);
         }
         for (int b=0; b<5; b++) {
           display.print(temperature1);
           display.printRaw(B00110110, 3);
           delay(1000);
         }
      }
 }
 }

 void Reverse()  {
   if (digitalRead(ReverseSensor) == LOW) {
     digitalWrite(ReverseSignal, HIGH);
     digitalWrite(ReverseLED, HIGH); }

       else  {
           digitalWrite(ReverseSignal, LOW);
           delay(5000);
           digitalWrite(ReverseLED, LOW);
       }
   }
   
 void setup() {

 akcja.attach(0, 201, Roll);
 akcja.attach(1, 101, Temp);
 akcja.attach(2, 207, Reverse);

 pinMode(RollRelay, OUTPUT);
 pinMode(ReverseSignal, OUTPUT);
 pinMode(ReverseLED, OUTPUT);
 pinMode(ReverseSensor, INPUT_PULLUP);
 
 //czujniki
 sensors.begin();
 sensors.request();
 //wyswietlacz
 display.begin();
 display.setBacklight(100);
 
 }
 
void loop()
{
 akcja.process();
}

      
 
Odpowiedź
#2
Jeśli chcesz aby to działało to nie stosuj delay().
Wywołujesz funkcje czasowo:
Kod:
akcja.attach(1, 101, Temp);

a wewnątrz masz:
Kod:
delay(1000);
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości