Помогите новичку со скетчем.

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем baryga30, 25 авг 2014.

  1. baryga30

    baryga30 Нуб

    В программировании я полный ноль.Вчера в первые взял ардуину в руки.Начал как и все с опытов со светодиодами.Даже смог сам написать скетч светофор.Но вот одного не пойму как сделать две независимые друг от друга функции.Например есть простой скетч для 1 светика в него дописал красным для второго светика.Но второй светик не загорится пока первый не выполнит свои действия.Например хочу сделать чтоб 1 светик просто моргал а второй висел на шиме и управлялся переменником.Собрал работает всё но только пока 1 светик не погаснет и снова загорится яркость второго не меняется.
    void setup()
    {
    pinMode(12, OUTPUT);
    pinMode(13, OUTPUT);
    }

    void loop()
    {
    digitalWrite(12, HIGH);
    delay(100);
    digitalWrite(12, LOW);
    delay(100);

    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(900);
    }
     
  2. geher

    geher Гуру

    Для этого надо сделать нечто вроде параллельного исполнения задач, для чего в свою очередь придется перейти на использование millis вместо delay
    Что-то вроде.
    Код (Text):
    unsigned long last_state_change_time12=0;
    unsigned long last_state_change_time13=0;
    int laststate12=LOW;
    int laststate13=LOW;

    void setup()
    {
      pinMode(12, OUTPUT);
      pinMode(13, OUTPUT);
      digitalWrite(12, HIGH); // начальное состояние
      digitalWrite(13, HIGH); // начальное состояние
      laststate12=HIGH;
      laststate13=HIGH;
    }

    void loop()
    {
      if ((laststate12==LOW)&&(millis()-last_state_change_time12>100)) {
        digitalWrite(12, HIGH);
        last_state_change_time12=millis();
        laststate12=HIGH;
      } else if ((laststate12==HIGH)&&(millis()-last_state_change_time12>100)) {
        digitalWrite(12, LOW);
        last_state_change_time12=millis();
        laststate12=LOW;
    }
      if ((laststate13==LOW)&&(millis()-last_state_change_time13>900)) {
        digitalWrite(13, HIGH);
        last_state_change_time13=millis();
        laststate13=HIGH;
      } else if ((laststate13==HIGH)&&(millis()-last_state_change_time13>100)) {
        digitalWrite(13, LOW);
        last_state_change_time13=millis();
        laststate13=LOW;
      }
    }
    Если второй диод должен управляться шимом, то его надо переключить на пин, поддерживающий шим, например. 11=й. Потенциометр, предположим, подключен к A0.
    Код будет примерно такой:
    Код (Text):
    unsigned long last_state_change_time13=0;
    int laststate13=LOW;

    void setup()
    {
      pinMode(11, OUTPUT);
      pinMode(13, OUTPUT);
      digitalWrite(13, HIGH); // начальное состояние
      laststate13=HIGH;
    }

    void loop()
    {
       int  val = analogRead(0);   // read the input pin
       analogWrite(11, val / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255

      if ((laststate13==LOW)&&(millis()-last_state_change_time13>900)) {
        digitalWrite(13, HIGH);
        last_state_change_time13=millis();
        laststate13=HIGH;
      } else if ((laststate13==HIGH)&&(millis()-last_state_change_time13>100)) {
        digitalWrite(13, LOW);
        last_state_change_time13=millis();
        laststate13=LOW;
      }
    }
     
  3. baryga30

    baryga30 Нуб

    Спасибо большое сам бы не когда до этого не дошел :)Выглядит всё очень сложно и совсем не понятно тёмный лес.Буду разбираться может что то пойму.И ещё вопросик есть модуль RTC DS3231 а скетч не заливается пишет ошибку и выделяет строку setSyncProvider(RTC.get);

    sketch_aug25a.ino: In function 'void setup()':
    sketch_aug25a:7: error: 'class DS1307RTC' has no member named 'get'
    sketch_aug25a:7: error: 'setSyncProvider' was not declared in this scope
    sketch_aug25a:10: error: 'setTime' was not declared in this scope
    sketch_aug25a:12: error: 'now' was not declared in this scope
    sketch_aug25a.ino: In function 'void loop()':
    sketch_aug25a:16: error: 'sleep' was not declared in this scope


    #Подключаем библиотеки:
    #include <Time.h>
    #include <Wire.h>
    #include <DS1307RTC.h>

    void setup() {
    setSyncProvider(RTC.get);//Устанавливаем время в формате://Часы, минуты, секунды, день, месяц, год
    setTime(14,50,0,12,4,2014);
    //Применяем:
    RTC.set(now());
    }
    void loop()
    {
    sleep(100);
    }
     
  4. geher

    geher Гуру

    Тут надо разбираться с конкретной библиотекой. Возможно, что она просто другая, с другими функциями.
    Компилятор сообщает, что у класса DS1307RTC нет метода get.
    Глядя на строку, на которой вылазит это сообщение, видим, что, скорее всего, RTC является переменной класса DS1307RTC (которые, в смысле переменная и класс, объявлены в одном из подключаемых заголовочных файлов, скорее всего DS1307RTC.h). И у этого класса нет метода get. Отсюда следует вывод, что стоит либо поискать библиотеку, соответствующую описанию, согласно которому была написана эта строка, либо ознакомиться с методами класса реально подключенной библиотеки и переписать все согласно ее требованиям.
    То же можно сказать относительно следующих трех сообщений, в именно что ни в одной из подключенных библиотек не объявлены функции setSyncProvider, setTime и now, т.е. надо смотреть, на основании чего были написаны эти вызовы, в какой библиотеке они должны быть, и не надо ли посмотреть описание подключенной библиотеки, чтобы заменить эти вызовы на аналоги, в ней имеющиеся.
    Более подробно по этому ничего не скажу. поскольку с этой библиотекой (требующей включения DS1307RTC.h) не сталкивался.

    А с этим предельно понятно. Не sleep, а delay.
     
  5. baryga30

    baryga30 Нуб

    Ясно спасибо за ответы.На сайте где этот скетч взял его тестили на DS3231 и этот скетч к нему подходит.Только у меня он чёт не работает да и много других перепробывал тоже ничего не вышло.Пока оставлю этот rtc и буду изучать опыты на светиках.
     
  6. baryga30

    baryga30 Нуб

    Наигравшись со светиками решил вновь вернуться к часикам за одно и подключил дисплей)
    Библиотеку ds3231 нашел из примеров которые в нём ни чё не работает.Собрал я вот такой скетч всё работает только время при отключении питания сбивается.Батарейка в норме проблема 100% в скетче.


    #include <Wire.h>
    #include <DS3231.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27,20,4);
    DS3231 Clock;
    bool Century=false;
    bool h12;
    bool PM;
    byte year, month, date, DoW, hour, minute, second;

    void setup()
    {
    Wire.begin();
    lcd.begin(20, 4);
    lcd.clear();
    lcd.setBacklight(HIGH);

    Clock.setSecond(50);//Set the second
    Clock.setMinute(59);//Set the minute
    Clock.setHour(10); //Set the hour
    Clock.setDoW(7); //Set the day of the week
    Clock.setDate(7); //Set the date of the month
    Clock.setMonth(10); //Set the month of the year
    Clock.setYear(14); //Set the year (Last two digits of the year)
    }

    void loop()
    {
    int second,minute,hour,date,month,year,temperature;

    year=Clock.getYear();
    month=Clock.getMonth(Century);
    date=Clock.getDate();
    hour=Clock.getHour(h12,PM);
    minute=Clock.getMinute();
    second=Clock.getSecond();
    temperature=Clock.getTemperature();

    lcd.print("Date ");
    if (date<10) lcd.print('0');
    lcd.print(date,DEC);
    lcd.print('-');
    if (month<10) lcd.print('0');
    lcd.print(month,DEC);
    lcd.print('-');
    lcd.print("20");
    lcd.print(year,DEC);
    lcd.setCursor(11, 3);
    lcd.print(" Vcore1.7");

    lcd.setCursor(0, 1);
    lcd.print("Time");
    lcd.setCursor(6, 1);
    if (hour<10) lcd.print('0');
    lcd.print(hour,DEC);
    lcd.print(':');
    if (minute<10) lcd.print('0');
    lcd.print(minute,DEC);
    lcd.print(':');
    if (second<10) lcd.print('0');
    lcd.print(second,DEC);
    lcd.print(' ');
    lcd.setCursor(0, 3);
    lcd.print("Temp:");
    lcd.print(temperature);
    delay(1);
    lcd.setCursor(0,0);
    }
     
  7. geher

    geher Гуру

    В setup:
    Clock.setSecond(50);//Set the second
    Clock.setMinute(59);//Set the minute
    Clock.setHour(10); //Set the hour
    Clock.setDoW(7); //Set the day of the week
    Clock.setDate(7); //Set the date of the month
    Clock.setMonth(10); //Set the month of the year
    Clock.setYear(14); //Set the year (Last two digits of the year)

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

    baryga30 Нуб

    Спасибо за подсказку.Чёт я сам не догадался.Взял просто удалил со скетча эти строки и теперь время не сбивается:D
    Ещё вопрос есть вот такие функции.Как сделать чтоб от отдельной кнопки управлять сразу 2мя пинами с одной кнопки?


    buttonState = digitalRead(buttonPin);
    if (buttonState == LOW){
    digitalWrite(ledPin, HIGH);
    }
    else{
    digitalWrite(ledPin, LOW);
    }
    {
    buttonState = digitalRead(buttonPin1);
    if (buttonState == LOW){
    digitalWrite(ledPin1, HIGH);
    }
    else {
    digitalWrite(ledPin1, LOW);
    }


    Пробовал так но при нажатии на кнопку диод моргает еле видно

    buttonState = digitalRead(buttonPin2);
    if (buttonState == LOW){
    digitalWrite(ledPin, HIGH), digitalWrite(ledPin1, HIGH);
    }
    else{
    digitalWrite(ledPin, LOW), digitalWrite(ledPin1, LOW);
    }
    {
    buttonState = digitalRead(buttonPin);
    if (buttonState == LOW){
    digitalWrite(ledPin, HIGH);
    }
    else {
    digitalWrite(ledPin, LOW);
    }
    {
    buttonState = digitalRead(buttonPin1);
    if (buttonState == LOW){
    digitalWrite(ledPin1, HIGH);
    }
    else {
    digitalWrite(ledPin1, LOW);
    }
     
  9. vvr

    vvr Инженерище

    Есть одиночное, двойное , длительное нажатие кнопки. Вот по этому принципу и управляйте пинами. Например одиночные нажатия - один пин, длительные - второй.