Praktika 3 NUPP ja PHOTORESISTOR

3.1. Katse Nuppude ja Slideswitch’i kasutamise võimalus

1.- Näidis-nupp

// Nuppud.


const int button1Pin = 2;  //viik kunu on ühebdatud nupp1

const int button2Pin = 3; //viik kuhu on ühendatud nupp2

const int ledPin =  13;   

void setup()

{

  pinMode(button1Pin, INPUT); //algväärtuse nupu viigu sisendiks

  pinMode(button2Pin, INPUT); //algväärtuse nupu viigu sisendiks

  pinMode(ledPin, OUTPUT);   //algväärtuse LED viigu väljundiks
 

}

void loop()

{

  int button1State, button2State;  //nupu oleku muutujad

  button1State = digitalRead(button1Pin);// salvestame muutujasse nupu hetke väärtuse(HIGH või LOW)

  button2State = digitalRead(button2Pin);

  if (((button1State == LOW) || (button2State == LOW))   // kui nupu on alla vajutatud

      && !

      ((button1State == LOW) && (button2State == LOW))) // kui nupude on alla vajutatud

  {

    digitalWrite(ledPin, HIGH);  // lülitame LED sisse

  }

  else                          

  {

    digitalWrite(ledPin, LOW);  // lülitame LED välja

  }    	

  }

2.- Näidis- Slideswitch’i kasutamine

// C++ code
//
int swPin=4;
int ledPin=10;
int switchstate=0;
void setup()
{
  pinMode(swPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  switchstate=digitalRead(swPin);
  if(switchstate==HIGH)
  {
    digitalWrite(ledPin, HIGH);
  }
  else
  {
    digitalWrite(ledPin, LOW);
  }
}

3.2. Katse Photoresistor

// C++ code
//
const int sensorPin = 0;

const int ledPin = 9;

int lightLevel, high = 0, low = 1023; 

void setup()

{

  pinMode(ledPin, OUTPUT);

  Serial.begin(9600); // //Serial monitori seadistamine

}

void loop()

{

  // AnalogRead() kasutab väärtused vahemikus 0 (0 вольт) и 1023 (5 вольт).

  // AnalogWrite(),  kasutatakse, et LEDi sujuvalt sisselülitada 0(ei põle) kuni 255(põleb maksimalselt).
  lightLevel = analogRead(sensorPin); //loeme mõõdetud analoogväärtuse

  // Map() teisendab sisendi väärtused ühest vahemikust teisse. Näiteks, "from" 0-1023 "to" 0-255.

  // Constrain() saed muutujale kindlad piirväärtused.

  // Näiteks:  kui constrain() kohtub arvudega 1024, 1025, 1026.., siis ta teisendab need 1023, 1023, 1023..). Kui arvud vähem kui 0, siis teisendab need 0:. 

  // lightLevel = constrain(lightLevel, 0, 255);

  manualTune();  //

  //autoTune();  //

  analogWrite(ledPin, lightLevel);

  // Выражение выше, будет изменять яркость светодиода вместе с уровнем освещенности. Чтобы сделать наоборот, заменить в analogWrite(ledPin, lightLevel) "lightLevel" на "255-lightLevel". Теперь у нас получился ночник!

  Serial.print(lightLevel);     // prindime tulemused Serial Monitori (вывод данных с фоторезистора (0-1023))

  Serial.println("");          

  delay(1000);                

}

void manualTune()

{

  lightLevel = map(lightLevel, 300, 800, 0, 255); // kaardistame selle analoogväljundi vahemikku (будет от 300 темно, до 800 (светло)). 

  lightLevel = constrain(lightLevel, 0, 255);

} 

void autoTune()

{

   if (lightLevel < low)  

  {                      

    low = lightLevel;   

  }

  if (lightLevel > high)

  {

    high = lightLevel;

  }

  lightLevel = map(lightLevel, low+10, high-30, 0, 255);

  lightLevel = constrain(lightLevel, 0, 255);

}

Задание 3 Öölamp

Состав

1 синий светодиод

2 резистора на 220в и 1 на 10Kq

8 проводов

1 плата ARDUINO UNO

1 кнопка

1 breadboard small

Принцип работы “Ночника”

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

Процесс работы над проектом

  • Составляем схему “Ночника” На сайте “Tinkercad”.
  • Попутно все конспектируем
  • Программируем поведение “Ночника”.
  • Тестируем
  • Собираем “Ночник”
  • Переносим рабочий код на плату
  • Тестируем прототип
  • Фиксируем итог

Схема подключения

Код для “Ночника”

// C++ code
//
const int sensorPin = 0;
const int button1Pin = 2;  
const int ledPin =  9; 

int lightLevel, high = 0, low = 1023; // Создаем глобальные переменные для уровней яркости high (высокий), low (низкий)
int previousButtonState = LOW; // Переменная для отслеживания предыдущего состояния кнопки
bool lightState = false; // Переменная для отслеживания состояния света

void setup() {
  pinMode(button1Pin, INPUT);
  pinMode(ledPin, OUTPUT);   
  Serial.begin(9600); // Настройка для работы с последовательным портом (для отладки)
}

void light() {
  lightLevel = analogRead(sensorPin); 
  manualTune(); // Ручное изменение диапазона от светлого к темному.  
  analogWrite(ledPin, lightLevel); // Изменение яркости светодиода в зависимости от уровня освещенности
  Serial.print("Light level: ");
  Serial.println(lightLevel); // Вывод данных с фоторезистора (0-1023) 
}

void manualTune() {
  lightLevel = map(lightLevel, 300, 800, 0, 255); // Будет от 300 темно, до 800 (светло). 
  lightLevel = constrain(lightLevel, 0, 255);
}

void loop() {
  int button1State = digitalRead(button1Pin); // Считывание состояния кнопки
  
  if (button1State == HIGH && previousButtonState == LOW) { // Если кнопка нажата и предыдущее состояние не было HIGH
    // Переключение состояния света
    lightState = !lightState; // Инвертируем состояние света
    digitalWrite(ledPin, lightState ? HIGH : LOW); // Включаем или выключаем свет в зависимости от состояния
    delay(100); // Задержка для устранения дребезга контактов
  }
  
  previousButtonState = button1State; // Обновляем предыдущее состояние кнопки
  
  if (lightState) {
    light(); // Если свет включен, читаем и отображаем уровень освещенности
  }
}

Демонстрация “Ночника”

Возможности применения

  • Регулировка ярковсти света в комнате
  • Регулировка мощности чего-либо с зависимостью от уровня света
  • Переключение режимов работы устройств с зависимостью от уровня света
  • И тому подобное

Новые функции:

Serial.begin()

Функция инициирует последовательный обмен данными с микроконтроллером с фиксированной скоростью передачи данных. Она используется для установления соединения между микроконтроллером и компьютером или другими устройствами через последовательный порт (обычно используется для отладки и обмена данными). Перед использованием функций вывода (например, Serial.print()) необходимо вызвать Serial.begin(), чтобы установить скорость передачи данных.

analogRead()

Функция считывает значение аналогового сигнала с определенного аналогового вывода микроконтроллера. Как правило, микроконтроллеры имеют ограниченное количество аналоговых входов, и analogRead() позволяет измерять аналоговые значения этих выводов. Значение, возвращаемое этой функцией, находится в диапазоне от 0 до 1023, где 0 соответствует напряжению на выводе, равному 0 В, а 1023 – напряжению, равному опорному напряжению (обычно 5 В).

analogWrite()

используется для управления аналоговым выходом, таким как яркость светодиода или скорость мотора, с помощью широтно-импульсной модуляции (ШИМ).