Проблема с работой программы

Тема в разделе "Arduino & Shields", создана пользователем starfighter1, 20 мар 2016.

  1. starfighter1

    starfighter1 Нуб

    Приветствую народ! Глючит данный скетч. По работе программы в идеале как я задумал. По RTC часам и состоянию геркон-поплавка(Poplavok1_PIN притянут к земле и установлен в LOW) включается нагрузка на rele1, при достижении контрольного времени, или замыкании геркона Poplavok1_PIN нагрузка отключается и происходит перелив во вторую ёмкость, в которой срабатывает Poplavok2_PIN и активирует rele2. Проблема в том, что програма работает не стабильно, бывает 2 дня нормально, а бывает выставляет все выходы в хай и зависает намертво. Поплавки руками замыкал во время "удачных" пусков по таймеру - работали. сама плата ардуино уно р3 мега32у4 + мега328 дип питается от кренки и от необслуживаемой батареи 12в, поплавки герконы через резистор 10к подтянуты к земле. модуль ds1307 готовый китайчатинка, проверял на другой самоделке - работает. и собственно сам код

    Код (C++):
    #include <Wire.h>
    #define DS1307_I2C_ADDRESS 0x68
    int Poplavok1_PIN = 4;
    int Poplavok2_PIN = 5;
    int rele1 = 6;
    int rele2 = 7;
    int val = 0;

    /////////// часы
    byte decToBcd(byte val) {
    return ( (val / 10 * 16) + (val % 10) );
    }

    byte bcdToDec(byte val) {
    return ( (val / 16 * 10) + (val % 16) );
    }
    void getDateDs1307(byte *second,
    byte *minute,
    byte *hour,
    byte *dayOfWeek,
    byte *dayOfMonth,
    byte *month,
    byte *year)
    {

    Wire.beginTransmission(DS1307_I2C_ADDRESS);
    Wire.write(0);
    Wire.endTransmission();

    Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

    *second = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *hour = bcdToDec(Wire.read() & 0x3f);
    *dayOfWeek = bcdToDec(Wire.read());
    *dayOfMonth = bcdToDec(Wire.read());
    *month = bcdToDec(Wire.read());
    *year = bcdToDec(Wire.read());
    }

    void setup() {
    Wire.begin();
    pinMode(rele1, OUTPUT);
    digitalWrite(rele1, LOW);
    pinMode(rele2, OUTPUT);
    pinMode(Poplavok1_PIN, INPUT);
    pinMode(Poplavok2_PIN, INPUT);

    }

    void loop() {
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

    int currentTime = hour * 60 + minute;

    int tOn1 = 540;
    int tOff1 = 548;
    if (currentTime >= tOn1 && digitalRead(Poplavok1_PIN) == LOW) {

    digitalWrite(rele1, HIGH);
    }
    if (currentTime >= tOff1 || digitalRead(Poplavok1_PIN) == HIGH)
    {
    digitalWrite(rele1, LOW);
    }

    //first timer

    int tOn2 = 720;
    int tOff2 = 728;
    if (currentTime >= tOn2 && digitalRead(Poplavok1_PIN) == LOW) {

    digitalWrite(rele1, HIGH);
    }
    if (currentTime >= tOff2 || digitalRead(Poplavok1_PIN) == HIGH)
    {
    digitalWrite(rele1, LOW);
    }
    //second timer

    int tOn3 = 900;
    int tOff3 = 908;
    if (currentTime >= tOn3 && digitalRead(Poplavok1_PIN) == LOW) {

    digitalWrite(rele1, HIGH);
    }
    if (currentTime >= tOff3 || digitalRead(Poplavok1_PIN) == HIGH)
    {
    digitalWrite(rele1, LOW);
    }
    // 3 timer

    int tOn4 = 1080;
    int tOff4 = 1088;
    if (currentTime >= tOn4 && digitalRead(Poplavok1_PIN) == LOW) {

    digitalWrite(rele1, HIGH);
    }
    if (currentTime >= tOff4 || digitalRead(Poplavok1_PIN) == HIGH)
    {
    digitalWrite(rele1, LOW);
    }
    //4 timer

    val = digitalRead(Poplavok2_PIN);
    digitalWrite(rele2, val);

    }
     
    Последнее редактирование: 20 мар 2016
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    1. В Arduino IDE нажмите Ctrl+T.
    2. Вставьте код в тэг при помощи кнопки "<>" в форумном редакторе.