31-08-2017, 02:22
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
Będę bardzo wdzięczny
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

Będę bardzo wdzięczny

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