Arduino и аквариум

Тема в разделе "Arduino & Shields", создана пользователем Алексей, 19 май 2012.

  1. seregareal2

    seregareal2 Нерд

    а у кого нибудь есть схема - подключения светодиодной летны к Arduino?
    мне поподается только схема подключения RGB летны которая мне не нужна
     
  2. Karabas

    Karabas Гик

    Нужен либо MOSFET либо реле. Лента будет нагрузкой.
    Собственно отличие в том, что используется один канал, а не три как в RGB.
    Если нужно регулировать яркость, то MOSFET и PWM выход Ардуины.
    [​IMG]
     
  3. seregareal2

    seregareal2 Нерд

    вотЪ
     

    Вложения:

  4. Karabas

    Karabas Гик

    1 Запитать Ардуину от шины 12В
    2 Прижать базу\затвор к земле (10-20 кОм)
    3 Между выходом и транзистором поставить резистор ом на сто.
    4 Рисовать нормальные, читаемые схемы :)
     

    Вложения:

    • 12345.jpg
      12345.jpg
      Размер файла:
      29,3 КБ
      Просмотров:
      946
  5. Vad33

    Vad33 Капитан-оригинал

    "Рисовать нормально читаемые схемы" имелось в виду "на коленке"? :D
     
  6. Karabas

    Karabas Гик

    Да хоть палочкой на песке, но не кажется ли вам, что обычная схема куда более удобочитаемая, чем "вермешель" из рисунков?
    И чем вам не понравилась моя схема, по моему- зашибись, почти по госту, хоть на стену вешай :D
     
    shpock нравится это.
  7. Vad33

    Vad33 Капитан-оригинал

    Схема "зашибись", особенно для начинающих. Главное понять, что за номиналы у элементов, какого типа канала транзистор и судя по схеме, подключение прямо к микросхеме контроллера к 9 выводу, который на кварц идет.
    ... а в остальном, прекрасная маркиза, ... :D

    Да, и еще вопрос, рисовать в графическом редакторе религия не позволяет? :)
     
    Последнее редактирование: 25 янв 2016
  8. seregareal2

    seregareal2 Нерд

    Вот только лента таким образом гаснет лишь на половину и опять включается
     
  9. seregareal2

    seregareal2 Нерд

    может стоит посмотреть в сторону использования в данной цепи резисторов?
     
  10. seregareal2

    seregareal2 Нерд

    всем привет
    все же почти приспособил Arduino к аквариуму, но есть одна проблемма с ds3231, время ведет себя хаотично, то выдает 78 - 89 секунд, то 753 секунды

    начальный код и схему подключения брал от сюда, на ней же и делал весь дальнейший код (хочу сразу же отметить что именно с этого кода уже были проблеммы с часами!!!)
    http://www.goodliffe.org.uk/arduino/i2c_devices.php

    [​IMG]


    а вот видео работы и мой код




    Сам код


    Код (C++):
    #include <OneWire.h>       //DS18B20
    #include <Wire.h>         // For the i2c devices
    #include <LiquidCrystal_I2C.h>  // For the LCD


    //Для установки времени
    //#include <iarduino_RTC.h>    //Для установки времени
    //iarduino_RTC time(RTC_DS1307);  //Для установки времени



    // LOW   реле включено
    // HIGH   реле выключено

    LiquidCrystal_I2C lcd(0x3F,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

    #define DS3231_I2C_ADDRESS 104    // RTC is connected, address is Hex68 (Decimal 104)

    // SCL - pin A5
    // SDA - pin A4
    // To set the clock, run the sketch and use the serial monitor.
    // Enter T1124154091014; the code will read this and set the clock. See the code for full details.
    //
    byte seconds, minutes, hours, day, date, month, year;
    char weekDay[4];

    byte tMSB, tLSB;

    // float my_temp; //Переменная для хранения показания температуры с DS3231

    char my_array[100];            // Character array for printing something.

    OneWire ds(2); // на пине 2 (нужен резистор 4.7 КОм) (DS18B20)


    void setup()
    {
     
      Wire.begin();
      lcd.init();                      // initialize the lcd

        //time.begin();
        //time.settime(0,59,8,7,11,16,1);  // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник



    //Выходы реле

    /* Пока ничего нет
    pinMode(2, OUTPUT); //Пусто
    pinMode(3, OUTPUT); //Пусто
    */



    pinMode(4, OUTPUT); //Лента
    pinMode(7, OUTPUT); //Мотор


    }

    void loop()
    {
      //watchConsole();


    //(DS18B20)

    byte data[2];
    ds.reset();
    ds.write(0xCC);
    ds.write(0x44);
    delay(750);
    ds.reset();
    ds.write(0xCC);
    ds.write(0xBE);
    data[0] = ds.read();
    data[1] = ds.read();
    int Temp = (data[1]<< 8)+data[0];
    Temp = Temp>>4;
    //Serial.println(Temp);


    // Вывод даты в сериал порт (Проверка времени + температура)

      get3231Date();

    /*
      Serial.print(weekDay); Serial.print(", "); Serial.print(date, DEC); Serial.print("/"); Serial.print(month, DEC);
      Serial.print("/"); Serial.print(year, DEC); Serial.print(" - ");
      Serial.print(hours, DEC); Serial.print(":"); Serial.print(minutes, DEC); Serial.print(":"); Serial.print(seconds, DEC);
    */



      // my_temp = (float)get3231Temp();
      // Serial.print(" - Temp: ");
      // Serial.println(my_temp);

      // NOTE: Arduino does NOT implement printing floats to a string.
      // If you use the std C function : sprintf(my_array, "Temp: %4.2f", my_temp), It will NOT CONVERT.
      // So I abandoned this, since I don't need to print the float to the LCD anyway.

    //Для таймера


    //Мотор

    if ( Temp >= 28 )
    {
      digitalWrite(7, LOW);
    }
    else
    {
      digitalWrite(7, HIGH);
    }


    //Лента

    if ( hours >= 9 && hours <= 22 ) //В 9 утра включить, в 22 00 выключить
    {
      digitalWrite(4, LOW);
    }
    else
    {
      digitalWrite(4, HIGH);
    }



     
    sprintf(my_array, "Time: %d-%d-%d", hours, minutes, seconds);

    // Print a message to the LCD.
      lcd.backlight();  //Включение подсветки
      lcd.setCursor(0,0); //Курсор в нулевую строку
      lcd.print(Temp); //Тект на экране - Температура с DS18B20
      lcd.print(" Temp in akva");
      lcd.setCursor(0,1); //Курсор в 1 строку
      lcd.print(my_array); //Вывод времени
      delay(1000);
    }

    // Convert normal decimal numbers to binary coded decimal
    byte decToBcd(byte val)
    {
      return ( (val/10*16) + (val%10) );
    }


    /*
    void watchConsole()
    {
      if (Serial.available()) {      // Look for char in serial queue and process if found
        if (Serial.read() == 84) {      //If command = "T" Set Date
          set3231Date();
          get3231Date();
          Serial.println(" ");
        }
      }
    }
    */




    void set3231Date()
    {
    //T(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year)
    //T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99)
    //Example: 02-Feb-09 @ 19:57:11 for the 3rd day of the week -> T1157193020209
    // T1124154091014
      seconds = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); // Use of (byte) type casting and ascii math to achieve result.
      minutes = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
      hours   = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
      //day     = (byte) (Serial.read() - 48);
      //date    = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
      //month   = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
      //year    = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
      Wire.beginTransmission(DS3231_I2C_ADDRESS);
      Wire.write(0x00);
      Wire.write(decToBcd(seconds));
      Wire.write(decToBcd(minutes));
      Wire.write(decToBcd(hours));
      //Wire.write(decToBcd(day));
      //Wire.write(decToBcd(date));
      //Wire.write(decToBcd(month));
      //Wire.write(decToBcd(year));
      Wire.endTransmission();
    }


    void get3231Date()
    {
      // send request to receive data starting at register 0
      Wire.beginTransmission(DS3231_I2C_ADDRESS); // 104 is DS3231 device address
      Wire.write(0x00); // start at register 0
      Wire.endTransmission();
      Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes

      if(Wire.available()) {
        seconds = Wire.read(); // get seconds
        minutes = Wire.read(); // get minutes
        hours   = Wire.read();   // get hours
        // day     = Wire.read();
        //date    = Wire.read();
        //month   = Wire.read(); //temp month
        //year    = Wire.read();
         
        seconds = (((seconds & B11110000)>>4)*10 + (seconds & B00001111)); // convert BCD to decimal
        minutes = (((minutes & B11110000)>>4)*10 + (minutes & B00001111)); // convert BCD to decimal
        hours   = (((hours & B00110000)>>4)*10 + (hours & B00001111)); // convert BCD to decimal (assume 24 hour mode)
        //day     = (day & B00000111); // 1-7
        //date    = (((date & B00110000)>>4)*10 + (date & B00001111)); // 1-31
        //month   = (((month & B00010000)>>4)*10 + (month & B00001111)); //msb7 is century overflow
        //year    = (((year & B11110000)>>4)*10 + (year & B00001111));
      }
      else {
        //oh noes, no data!
      }

    /* //Для кормушки, не работать в воскресение (Пока не реализованно)
      switch (day) {
        case 1:
          strcpy(weekDay, "Sun");
          break;
        case 2:
          strcpy(weekDay, "Mon");
          break;
        case 3:
          strcpy(weekDay, "Tue");
          break;
        case 4:
          strcpy(weekDay, "Wed");
          break;
        case 5:
          strcpy(weekDay, "Thu");
          break;
        case 6:
          strcpy(weekDay, "Fri");
          break;
        case 7:
          strcpy(weekDay, "Sat");
          break;
      }

    */


    }


    //Температурный датчик встроенный в часы (Пока не нужен)

    /*
    float get3231Temp()
    {
      float temp3231;
     
      //temp registers (11h-12h) get updated automatically every 64s
      Wire.beginTransmission(DS3231_I2C_ADDRESS);
      Wire.write(0x11);
      Wire.endTransmission();
      Wire.requestFrom(DS3231_I2C_ADDRESS, 2);
      if(Wire.available()) {
        tMSB = Wire.read(); //2's complement int portion
        tLSB = Wire.read(); //fraction portion
     
        temp3231 = (tMSB & B01111111); //do 2's math on Tmsb
        temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8
      }
      else {
        //oh noes, no data!
      }
     
      return temp3231;
    }
    */
     
  11. ostrov

    ostrov Гуру

    Добавьте незначащие нули.
     
  12. seregareal2

    seregareal2 Нерд

    что сделать))?
    я новичек в Arduino просто)
     
  13. ostrov

    ostrov Гуру

    Время выводит например так: 23-12-59 а потом: 1-5-8 в итоге все что правее остается тоже и получается 1-5-8-59, то есть ерунда, но если добавить незначащие нули, то должно получаться так: 01-05-08 и ничего лишнего не остается.
     
  14. seregareal2

    seregareal2 Нерд

    я не знаю как это сделать в коде :)
     
  15. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    sprintf(my_array, "Time: %02d-%02d-%02d", hours, minutes, seconds);
     
     
  16. seregareal2

    seregareal2 Нерд

    Имеется задумка подавать в аквариум со2, так то все просто, для перекрытия/подачи можно использовать простой клапан, а вот как измерять параметры со2 в акве с помощью arduino (нужен какой то погружаемый в воду датчик)?
     
  17. Tomasina

    Tomasina Сушитель лампочек Модератор

    а зачем? там нужен расход 1-2 пузырька в минуту.
     
  18. seregareal2

    seregareal2 Нерд

    На ночь его нужно отключать, а так же его нужно отключать и при достижении других параметров, т.ч его лучше мониторить и перекрывать вовремя
     
  19. Karabas

    Karabas Гик

    Ненужно искать себе лишние проблемы, все проще, как вам уже сказали, пара пузырьков, но включать только при наличии освещения.
     
  20. fogary

    fogary Гик

    Поправлю, не в минуту конечно же, а в секунду.

    При выборе скорости подачи газа, правильнее ориентироваться на показания дропчекера или ph-метра; 1-2 пуз./сек. скорее отправная точка.
    "Ведущие собаководы" советуют начинать подачу за 1-2 часа до включения света, но такие моменты лучше выяснить на профильном (аквариумном) форуме.