Помогите разобраться! Перестает функционировать Arduino UNO

Тема в разделе "Arduino & Shields", создана пользователем Swift, 14 окт 2014.

  1. Swift

    Swift Нуб

    Добрый день. Прошу помочь начинающему разобраться, программировании равно как и в электронике полный ноль, к сожалению..

    Задача простая - имеется Aruino UNO, датчик влажности почвы и желание чему нибудь научиться.
    Нужно определить степень влажности почвы и зажечь соответствующий светодиод (красный - сухо зеленый нормально синий мокро)

    Скетч такой:

    // Введём переменные для цифровых пинов лампочек.
    const int ledRed = 4;
    const int ledGreen = 5;
    const int ledBlue = 6;
    // Ещё одна переменная для аналогового пина датчика.
    const int sensorPin = 0;
    // Переменная для величины влажности почвы.
    int soil = 0;
    void setup()
    {
    // Инициализируем порт и выведем на экран небольшой заголовок.
    Serial.begin(9600);
    Serial.println(“Soil moisture sensor”);
    Serial.println(“——————–”);
    // Пины лампочек объявляем в качестве выходов.
    pinMode(ledRed, OUTPUT);
    pinMode(ledGreen, OUTPUT);
    pinMode(ledBlue, OUTPUT);
    }
    void loop()
    {
    // Сразу погасим все лампочки.
    digitalWrite(ledRed, LOW);
    digitalWrite(ledGreen, LOW);
    digitalWrite(ledBlue, LOW);
    // Считываем величину влажности почвы с датчика.
    soil = analogRead(sensorPin);
    // Напомним возможные показания датчика влажности:
    // 0 ~ 300 – сухая почва
    // 300 ~ 700 – влажная почва
    // 700 ~ 950 – датчик в воде
    // Если влажность не более 300, то зажигаем красную лампочку и
    / выводим текст, что почва суха. Цветок надо полить!
    if(soil <= 300)
    {
    Serial.print("The soil is DRY. Humidity is ");
    digitalWrite(ledRed, HIGH);
    }
    // Иначе если влажность в пределах от 300 до 700, то лампочка горит зелёным
    // цветом, выводим текст от нормальном состоянии почвы. Цветок счастлив!
    else if(soil > 300 && soil < 700)
    {
    Serial.print("The soil is HUMID. Humidity is ");
    digitalWrite(ledGreen, HIGH);
    }
    // Если же влажность принимает не рассмотренные ранее значения, то
    // растение переувлажнено, о чём сообщает текст и синяя лампочка.
    else
    {
    Serial.print("The soil is IN WATER. Humidity is ");
    digitalWrite(ledBlue, HIGH);
    }
    // Помимо текста выводим и непосредственно значение влажности.
    Serial.println(soil);
    // Задержка перед следующим считыванием данных о влажности. Одна из лампочек
    // будет гореть в течение этого времени, а потом погасится в начале loop.
    delay(2000);
    }

    Также прилагаю схему подключения: less21_arduino_minsk.jpg



    Проблема вот в чем, какое то время все работает как надо, но в какой то момент лампочка гаснет и все.. на arduino горит 13 светодиод и светодиод "on" по всей видимости программа не выполняется. При нажатии на reset тоже ничего не меняется, т. е. плата вроде как перезагружается, пару раз мигнет и опять ничего не работает.
    Очень интересно почему так происходит, не мог ли я сжечь что то, или где то фундаментально ошибся? очень надеюсь на помощь знающих людей..

    P.S.

    Совсем не в тему, но может кто нибудь знает почему не работает delay больше 30 000?
     
  2. zserg

    zserg Нерд

    А на консоль-то пишет? Большой delay сделать нельзя из-за ограничений встроенного таймера, но можно сделать функцию типа
    Код (Text):
    void delay_100(int d){
      int i;
      for(i=0; i<100; i++)
        delay(d);
    }
     
  3. 9xA59kK

    9xA59kK Гик

    Плату проверить легко- загрузи программу "БЛИНК" и сразу увидишь целая плата и все работает.
     
  4. Swift

    Swift Нуб

    На консоль выводит значения от 0 до 800, больше не видел. заметил важный момент, сенсор работает наоборот 0 - 300 вода, 300 - 700 все ок и 700 - 950 - сухо, может в этом дело? Чтобы загорались нужные лампочки просто перевоткнул провода от rgb led.
     
    Последнее редактирование: 14 окт 2014
  5. Swift

    Swift Нуб

    Мне так проще было понять алгоритм) я же правильно понял, то что они мигают в начале программы ни на что не влияет?
     
  6. Swift

    Swift Нуб

    Спасибо за разъяснение!) дико извиняюсь за нубство...
     
  7. Swift

    Swift Нуб

    Спасибо!
     
  8. Swift

    Swift Нуб

    Может с платой датчика что то не то, или неправильно подключил.. Там 4 пина - GND, VCC, TTL и AS.
    Я правильно понял - VCC - 5v а AS - analog in (A0) ? TTL не задействован.
     
  9. 9xA59kK

    9xA59kK Гик

    Так же проверь и плату датчика сверься со спецификацией распиновкой этой платы (что за плата и датчик тип) напиши программу только для этого датчика все остальное отключи. И проверь отдельно. ОЧ простой код и транслируй в сериал. Например:Если меньше 100 то Serial.print(переменная)
     
  10. zserg

    zserg Нерд

    Да, TTL там не задействован в данном случае. Правда я похожий датчик использовал, через месяц он весь облез и перестал работать. Сейчас пробую на двух гвоздях.

    А про гашение всех лампочек вначале - всё правильно, надо погасить, а потом зажечь ТОЛЬКО нужную. Если их погасить только в setup, то через какое-то время все три будут гореть ;)
     
  11. Swift

    Swift Нуб

    Даже не задумывался об этом)) спасибо большое, буду знать.

    А гвозди не окисляются от электролиза? Где то читал что лучший вариант - спицы из нержавейки, и напряжение подавать не постоянно, а скажем, раз в 15 минут, считывать показания датчика и опять не подавать напряжение. В этом случае такого датчика должно на долго хватить) Только я абсолютно не знаю как это реализовать))
     
  12. Swift

    Swift Нуб

    Ок, уже руки чешутся, жаль что на работе еще)
     
  13. zserg

    zserg Нерд

    Окисляются :) Даже если напряжение подавать не постоянно, а только при чтении. Нержавейку не пробовал. Вот припаять к ним провод - жуть сплошная, нужна паяльная кислота, видимо (я обошёлся уксусной, но ругался долго).
    Подавать напряжение вовремя несложно - +5 от датчика подключаем не к +5 на плату, а на D1, например и перед чтением (за полсекудны, например) выдаём туда HIGH, ну, а после чтения - LOW.
     
  14. Swift

    Swift Нуб

    Датчик этот - http://dvrobot.ru/238/380.html что за плата и тип не имею понятия((
     
  15. Swift

    Swift Нуб

    Блинк то работает , и та программа работает некоторое время, а потом вырубается(( Сегодня попробую поставить маячок на ночь, может и он вырубится.
     
  16. Swift

    Swift Нуб

    Навело на мысль, ставил ардуину с этим скетчем на ночь от батарейки, может быть такое что показания просто забили память микроконтроллера? Может стоит закомментить serial.print? Заранее извиняюсь если вопрос глупый, просто я пока совсем не понимаю как все устроено)
     
  17. 9xA59kK

    9xA59kK Гик

    Если все исправно, то надо разбирать код по запчастям. Если сомневаешься что что то не исправно, какой то выход не работает - то напиши программу типа блинк для этого порта и проверь его. Так можно проверить все входы и выходы по отдельности. Проверь аналоговые входы. Я твой код не разбирал , на вскидку мне не нравится условия которые ты там задал, особенно последнее "иначе" - оно у тебя означает "Иначе все что меньше либо равно 300 и больше либо равно 700" и в тоже время в начале первое Если проверяет меньше либо равно 300.
    Попробуй написать без иначе из одних только ЕСЛИ и посмотри как будет выглядеть код программы и работа условий. Заодно разберешься как работает логика.
     
    Последнее редактирование: 14 окт 2014
  18. Swift

    Swift Нуб

    С "Иначе" все должно быть ок, я конечно, ни в зуб ногой в программировании, но этот кусок я "взял" из аналогичного проекта где все работало)) Если бы изначально ничего не работало, я бы не удивился, это значило бы что я просто не правильно написал код, но вся суть в том что все работало, показания считывались адекватно, светодиоды мигали как задумано (ну почти, если не считать что это
    // 0 ~ 300 – сухая почва
    // 300 ~ 700 – влажная почва
    // 700 ~ 950 – датчик в воде
    работало с точностью до наоборот) А потом плата виснет и все, даже кнопка ресет не спасает((( После загрузки скетча ЮСБ выдергивался и питание поступало в автономном режиме. Может быть такое, что при подключении питания от батарейки а не от ЮСБ компьютера просто переполняется память МК? Ведь serial.print кудато что то пишет? или я думаю не в ту сторону?
     
  19. 9xA59kK

    9xA59kK Гик

    Все что занимает в памяти в данный момент это твоя программа ни больше не меньше. Память МК ПЗУ ты не используешь в своем коде и нечему переполняться. У тебя только переменные которые не увеличиваются до бесконечности. Если от УСБ все работает, то дело в питании от батареек. Как подключено питание и куда .? Сколько вольт подается от батареек? http://amperka.ru/product/arduino-uno
    Питание
    Arduino Uno может питаться как от USB подключения, так и от внешнего источника: батарейки или обычной электрической сети. Источник определяется автоматически.

    Платформа может работать при наличии напряжения от 6 до 20 В. Однако при напряжении менее 7 В работа может быть неустойчивой, а напряжение более 12 В может привести к перегреву и повреждению. Поэтому рекомендуемый диапазон: 7−12 В.
     
    Последнее редактирование: 14 окт 2014
  20. Swift

    Swift Нуб

    От ЮСБ не пробовал на долго оставлять, вечером сделаю. Помогите кто может с кодом, там то все нормально?