Включение/выключение света с регулировкой яркости

Deffi
Offline
Зарегистрирован: 23.09.2015

Всем доброго времени суток. Простите если не туда, я новичёк, ещё не разобрался куда писать и как правильно задавать вопросы.

 

Вопрос в следующем. Есть код. Нажатием на кнопку мы включаем свет(пока светодиод), длительным удержанием уменьшаем яркость, повторным удержанием увеличиваем...

Мне нужно сделать несколько таких каналов. Тоесть каждая кнопка управляет своим светодиодом.

Ардуинку только осваиваю, не пойму как кланировать код в несколько раз. Помогите пожалуста.

 

Сам код:

 

int ledPin = 10;    // Выход ШИМ на диммер
int powerPin = 9; // Вход с кнопки

uint8_t pwmLevel = 255;
boolean pwmStat  = false;
boolean pwmInc   = true;

uint32_t ms, ms1 = 0;
boolean press_flag = false;
uint16_t press_cnt = 0;

void setup()
{
 
  pinMode(ledPin, OUTPUT);
  pinMode(powerPin, INPUT);

}

void loop()
{
  ms = millis();
  // Получаем сигнал от кнопки
  if (digitalRead(powerPin) == HIGH) {
    
      press_flag = true;
    }
    
  if ( ( ms - ms1 ) > 200 || ms < ms1 ) {
    // Если нажата клавиша
    if ( press_flag ) {
      press_cnt++;
      // Если лампа включена
      if ( pwmStat ) {
        // Инвертируем флаг уменьшения/увеличения
        if ( press_cnt == 5 ) {
          pwmInc = !pwmInc;
        }//pres_cnt = 0
        // Изменям значение диммера
        else if ( press_cnt > 5 ) {
          if ( pwmInc ) {
            if ( pwmLevel < 239 )pwmLevel += 16;
            else pwmLevel = 255;
          }//pwmInc
          else        {
            if ( pwmLevel > 50 )pwmLevel -= 16;
            else pwmLevel = 34;
          }// else pwmInc
        }
        Serial.print("Mode=");
        Serial.print(pwmInc);
        Serial.print(" level=");
        Serial.print(pwmLevel);
        Serial.print(" count=");
        Serial.println(press_cnt);
        analogWrite(ledPin, pwmLevel);
      }

    }
    else {
      // Короткое (менее 1 сек) нажатие клавиши
      if ( press_cnt > 0 && press_cnt < 5 ) {
        // Включение/отключение лампы
        pwmStat = !pwmStat;
        if ( pwmStat ) {
          digitalWrite(powerPin, HIGH);
          analogWrite(ledPin, pwmLevel);
        }
        else  {
          analogWrite(ledPin, 0);
          digitalWrite(powerPin, LOW);
        }
        Serial.print("Press=");
        Serial.print(pwmStat);
        Serial.print(" level=");
        Serial.print(pwmLevel);
        Serial.print(" count=");
        Serial.println(press_cnt);
      }

      press_cnt = 0;
    }
    ms1 = ms;
    press_flag = false;
  }
}
 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Для начала прочитать вот это - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

А потом ... скажите пожалуйста, а что Вам мешает обратиться к автору кода?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Deffi пишет:

Простите если не туда, я новичёк, ещё не разобрался куда писать 

Ничего, я Вам помогу.

Вам нужно разместить Вашу просьбу вот здесь - http://arduino.ru/forumy/ishchu-ispolnitelya

Deffi
Offline
Зарегистрирован: 23.09.2015

ЕвгенийП пишет:

Для начала прочитать вот это - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

А потом ... скажите пожалуйста, а что Вам мешает обратиться к автору кода?

По вставке кода спасибо что подсказали. Не знал. Впредь буду делать правильно.

А автора я не знаю. Нашёл где-то в инете, но скетч работал от пульта, я его подправил для работы от кнопки.

Deffi
Offline
Зарегистрирован: 23.09.2015

Всё. Мозг взорван...

Вроде всё заработало. Выключил, пришёл через час, пробую по новой вгружать, то ничего, просто экран без символов, то кракозябры, то что-то моргает... Что может быть?

Вод код который работал, а потом перестал.

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

// Init LCD
#define LCD_I2C_ADDR  0x3F
#define BACKLIGHT     3
#define LCD_EN        2
#define LCD_RW        1
#define LCD_RS        0
#define LCD_D4        4
#define LCD_D5        5
#define LCD_D6        6
#define LCD_D7        7

// Объект для работы с дисплеем
LiquidCrystal_I2C lcd(LCD_I2C_ADDR,
                      LCD_EN,
                      LCD_RW,
                      LCD_RS,
                      LCD_D4,
                      LCD_D5,
                      LCD_D6,
                      LCD_D7);

// Массив символов для шкалы
const uint8_t charBitmap[][8] = {
 { 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 },
 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 },
 { 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c },
 { 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e },
 { 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f }
};

// Настройка
void setup() {
// Создание символов из массива 
int charBitmapSize = (sizeof(charBitmap ) / sizeof (charBitmap[0]));  
// Последовательный порт
Serial.begin(9600);
// Аналоговый вход
pinMode(A0,INPUT);
// Запись созданных символов в дисплей
lcd.begin(20,4);

   for ( int i = 0; i < charBitmapSize; i++ )
   {
      lcd.createChar ( i, (uint8_t *)charBitmap[i] );
   }

// Настройка подсветки
lcd.setBacklightPin(BACKLIGHT,POSITIVE);
lcd.setBacklight(HIGH);
// Подготовка надписей
lcd.clear();
lcd.setCursor(0,1);
lcd.print("    Hello");

}

// Основной код
void loop() {
 
}

 

Deffi
Offline
Зарегистрирован: 23.09.2015

Извините, а как правильно добавлять библиотеки? В одном месте читал что в ручную кидаем в Documents\Arduino\libraries

В другом что Program Files\Arduino\libraries

В третьем что лучше устанавливать автоматически

В среде разработки Ардуино выберите меню Sketch > Import Library. В самом верху выпадающего списка выберите пункт Add Library (Добавить библиотеку).

 

 

Deffi
Offline
Зарегистрирован: 23.09.2015

Бред какой-то получается... Мучался мучался с библиотеками...  Всё удалил, потом поставил по новой. Вроде заработало. Попытался добавит фрагмент скетча с термометрами и библиотеку DallasTemperatu начало вё моргать и показывать бред. Опять всё удалил и вернул как было.... Каждая загрузка что-то новое. То кракозябры, то задом наперёд и буквы попутаны, то экран моргает...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Такое бывает обычно если:

1. В программе проблемы с памятью/указателями

2. Аппаратуры неправильно подключена (какие-то выводы "болтаются в воздухе и ловят помехи" и т.п.)

Deffi
Offline
Зарегистрирован: 23.09.2015

Вобщем разобрался. Глючный дисплей... Подключил другой, и всё заработало...

Deffi
Offline
Зарегистрирован: 23.09.2015

Господа модераторы, простите, попутал темы... Если можно, для порядка перенисите последние сообщения про настройку дисплея сюда http://arduino.ru/forum/apparatnye-voprosy/lcd-1602-i-i2c-pcf8574at#comm...

Deffi
Offline
Зарегистрирован: 23.09.2015

Люди добрые, помогите плисс с скетчем в первом посте. Ну баран я. Только учусь, не понимаю что надо делать, опытным путём пробую, но всё нетуда...