Что будет, если подключить к земле анод светодиода вместо катода?
Эксперимент 1. Маячок
В этом эксперименте мы просто мигаем светодиодом.
Схема
Код
void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
delay (100);
digitalWrite(13, LOW);
delay (900);
}
Контрольные вопросы
Что будет, если подключить к земле анод светодиода вместо катода?
Ток в цепи течь не будет, светодиод не будет светиться.
2. Что будет если подключить светодиод с резистором большего номинала (например 10кОм)?
Ток не потечет через этот резистор, светодиод не загорится.
Что будет если подключить светодиод без резистора?
Через светодиод потечёт ток, больше допустимого значения, и светодиод может выйти из строя. Это также может вывести из строя порт микроконтроллера.
Зачем нужна встроенная функция pinMode? Какие параметры она принимает?
Функция pinMode настраивает определённый порт на режим выхода или входа. Соответственно она принимает параметры pin(номер порта) и value(INPUT, OUTPUT).
Зачем нужна встроенная функция digitalWrite? Какие параметры она принимает?
Функция digitalWrite не возвращает никакого значения и принимает два параметра:
Pin – номер цифрового порта на который мы отправляем сигнал
Value – значение которое мы отправляем на порт (HIGH, LOW).
С помощью какой встроенной функции можно заставить микроконтроллер ничего не делать?
С помощью функции delay можно остановить работу микроконтроллера на определённый промежуток времени.
В каких единицах задается длительность паузы для этой функции?
Длительность паузы для функции delay задаётся в миллисекундах.
Задания для самостоятельного решения
Сделайте так, чтобы маячок светился полсекунды, а пауза между вспышками была равна одной секунде
void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
delay (500);
digitalWrite(13, LOW);
delay (1000);
}
2.Измените код примера так, чтобы маячок включался на три секунды после запуска устройства, а затем мигал в стандартном режиме
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
delay (3000);
digitalWrite(13, LOW);
}
void loop()
{
digitalWrite(13, HIGH);
delay (100);
digitalWrite(13, LOW);
delay (900);
}
Эксперимент 2. Маячок с нарастающей яркостью
В этом эксперименте мы задаем различные уровни яркости светодиода.
Схема
Код
#define LED_PIN 9
void setup()
{
pinMode(LED_PIN, OUTPUT);
}
void loop()
{
analogWrite(LED_PIN, 85);
delay(250);
analogWrite(LED_PIN, 170);
delay(250);
analogWrite(LED_PIN, 255);
delay(250); }
Вопросы для проверки себя
Какие из следующих идентификаторов корректны и не вызовут ошибку?
13pin
MOTOR_1
контакт_светодиода
sensor value
leftServo
my-var
distance_eval2
Так как идентификаторы могут состоять только из латинских букв, цифр и символов подчеркивания_, и при этом не могут начинаться с цифр, то ошибки не вызовут идентификаторы:
MOTOR_1
leftServo
distance_eval2
Что произойдет, если создать директиву #define HIGH LOW?
Деректива заменит все значения LOW на HIGH, таким образом мы не сможем задавать нулевое значение на выходах микроконтроллера.
Почему мы не сможем регулировать яркость светодиода, подключенного к порту 7?
Вывод 7 не поддерживает ШИМ-сигнал, то есть на нём нельзя регулировать напряжение.
Какое усреднённое напряжение мы получим на пине 6, если вызовем функцию analogWrite(6, 153)?
На 6 пине получим напряжение 3В.
Какое значение параметра value нужно передать функции analogWrite, чтобы получить усреднённое напряжение 2 В?
Value=102
Задания для самостоятельного решения
Возьмите еще один светодиод, резистор на 220 Ом и соберите аналогичную схему на этой же макетке, подключив светодиод к пину номер 3 и другому входу GND, измените программу так, чтобы светодиоды мигали в противофазу: первый выключен, второй горит максимально ярко и до противоположного состояния
#define LED_PIN 9
#define LED_PIN2 3
void setup()
{
pinMode(LED_PIN, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
}
void loop()
{
analogWrite(LED_PIN, 0);
analogWrite(LED_PIN2, 255);
delay(250);
analogWrite(LED_PIN, 255);
analogWrite(LED_PIN2, 0);
delay(250);
}
Схема
Код
#define LED_PIN 9
#define POT_PIN A0
void setup()
{
pinMode(13, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(POT_PIN, INPUT);
}
void loop()
{
digitalWrite(13, HIGH);
int rotation, brightness;
rotation=analogRead(POT_PIN);
brightness=rotation/4;
analogWrite(LED_PIN, brightness);
}
Вопросы для проверки себя
Эксперимент 4. Терменвокс
В этом эксперименте мы имитируем действие музыкального инструмента терменвокс: изменяем высоту звучания бесконтактным путем, больше или меньше закрывая от света фоторезистор.
Схема
Код
#define BUZZER_PIN 3
#define LDR_PIN A0
void setup()
{
pinMode(13, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
int val, frequency;
val=analogRead(LDR_PIN);
frequency=map(val, 0, 1023, 3500, 4500);
tone(BUZZER_PIN, frequency, 20);
}
Вопросы для проверки себя
Схема
Код
#define LED_PIN 13
#define LDR_PIN A0
#define POT_PIN A1
void setup()
{
pinMode(12, OUTPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop()
{
digitalWrite(12,HIGH);
int lightness=analogRead(LDR_PIN);
int threshold=analogRead(POT_PIN);
boolean tooDark = (lightness<threshold);
if (tooDark){
digitalWrite(LED_PIN, HIGH);
}
Вопросы для проверки себя
Добавьте в схему еще один светодиод. Дополните программу так, чтобы при падении освещенности ниже порогового значения включался один светодиод, а при падении освещенности ниже половины от порогового значения включались оба светодиода.
#define LED_PIN 13
#define LED_PIN2 8
#define LDR_PIN A0
#define POT_PIN A1
void setup()
{
pinMode(12, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
}
void loop()
{
digitalWrite(12,HIGH);
int lightness=analogRead(LDR_PIN);
int threshold=analogRead(POT_PIN);
if (lightness<threshold/2)
{
digitalWrite(LED_PIN, HIGH);
digitalWrite(LED_PIN2, HIGH);
}
else if (lightness<threshold)
{
digitalWrite(LED_PIN, HIGH);
}
else
{
digitalWrite(LED_PIN, LOW);
digitalWrite(LED_PIN2, LOW);
}
}
Эксперимент 6. Пульсар
В этом эксперименте мы плавно наращиваем яркость светодиодной шкалы, управляя большой нагрузкой через транзистор.
Схема
Код
#define CONTROL_PIN 9
int brightness = 0;
void setup()
{
pinMode(13, OUTPUT);
pinMode(CONTROL_PIN, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
brightness = (brightness + 1)% 256;
analogWrite (CONTROL_PIN, brightness);
delay (10);
}
Вопросы для проверки себя
Схема
Код
#define FIRST_LED_PIN 2
#define LAST_LED_PIN 11
void setup()
{
for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
pinMode(pin, OUTPUT);
}
void loop()
{
unsigned int ms = millis();
int pin = FIRST_LED_PIN + (ms / 120) % 10;
digitalWrite(pin, HIGH);
delay(10);
digitalWrite(pin, LOW);
}
Вопросы для проверки себя
Схема
Код
#define BUZZER_PIN 13
#define FIRST_KEY_PIN 7
#define KEY_COUNT 3
void setup()
{
pinMode(12, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop()
{
digitalWrite(12, HIGH);
for (int i = 0; i < KEY_COUNT; ++i)
{
int keyPin = i + FIRST_KEY_PIN;
boolean keyUp = digitalRead(keyPin);
if (!keyUp)
{
int frequency = 3500 + i * 500;
tone(BUZZER_PIN, frequency, 20);
}
}
}
Вопросы для проверки себя
Эксперимент 9. Миксер
В этом эксприменте мы создаем модель миксера с двумя скоростями работы.
Схема
Код
#define MOTOR_PIN 9
#define FIRST_BUTTON_PIN 5
#define BUTTON_COUNT 3
#define SPEED_STEP (255 / (BUTTON_COUNT - 1))
void setup()
{
pinMode(13, OUTPUT);
pinMode(MOTOR_PIN, OUTPUT);
for (int i = 0; i < BUTTON_COUNT; ++i)
pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
digitalWrite(13, HIGH);
for (int i = 0; i < BUTTON_COUNT; ++i) {
if (digitalRead(i + FIRST_BUTTON_PIN))
continue;
int speed = i * SPEED_STEP;
analogWrite(MOTOR_PIN, speed);
}
}
Вопросы для проверки себя
Схема
Код
#define BUTTON_PIN 3
#define LED_PIN 13
boolean buttonWasUp = true;
boolean ledEnabled = false;
void setup()
{
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
boolean buttonIsUp = digitalRead(BUTTON_PIN);
if (buttonWasUp && !buttonIsUp) {
delay(10);
buttonIsUp = digitalRead(BUTTON_PIN);
if (!buttonIsUp)
{
ledEnabled = !ledEnabled;
digitalWrite(LED_PIN, ledEnabled);
}
}
buttonWasUp = buttonIsUp;
}
Вопросы для проверки себя
1.В каком случае оператор && возвращает значение «истина»?
Логический оператор && («и») возвращает значение «истина» только в случае истинности обоих его операндов.
Что такое «дребезг»?
Это многократные неконтролируемые замыкания и размыкания контактов за счет упругости материалов и деталей контактной системы — некоторое время контакты «подпрыгивают» при соударениях, размыкая и замыкая электрическую цепь.
Схема
Код
#define PLUS_BUTTON_PIN 2
#define MINUS_BUTTON_PIN 3
#define LED_PIN 9
int brightness = 100;
boolean plusUp = true;
boolean minusUp = true;
void setup()
{
pinMode(LED_PIN, OUTPUT);
pinMode(PLUS_BUTTON_PIN, INPUT_PULLUP);
pinMode(MINUS_BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
analogWrite(LED_PIN, brightness);
plusUp = handleClick(PLUS_BUTTON_PIN, plusUp, +35);
minusUp = handleClick(MINUS_BUTTON_PIN, minusUp, -35);
}
boolean handleClick(int buttonPin, boolean wasUp, int delta)
{
boolean isUp = digitalRead(buttonPin);
if (wasUp && !isUp) {
delay(10);
isUp = digitalRead(buttonPin);
if (!isUp)
brightness = constrain(brightness + delta, 0, 255);
}
return isUp;
}
Вопросы для проверки себя
1.Что необходимо для определения собственной функции?
Чтобы определить собственную функцию, нам нужно:
· Объявить, какой тип данных она будет возвращать. В нашем случае это boolean. Если функция только выполняет какие-то действия и не возвращает никакого значения, используйте ключевое слово void
· Назначить функции имя — идентификатор. Здесь действуют те же правила, что при именовании переменных и констант. Называть функции принято в том же стиле какПеременные.
· В круглых скобках перечислить передаваемые в функцию параметры, указав тип каждого. Это является объявлением переменных, видимых внутри вновь создаваемой функции, и только внутри нее. Например, если в данном эксперименте мы попробуем обратиться к wasUp или isUp из loop() получим от компилятора сообщение об ошибке. Точно так же, переменные, объявленные в loop, другим функциям не видны, но их значения можно передать в качестве параметров.
· Между парой фигурных скобой написать код, выполняемый функцией
· Если функция должна вернуть какое-то значение, с помощью ключевого слова return указать, какое значение возвращать. Это значение должно быть того типа, который мы объявили.
Схема
Код
#define BUZZER_PIN 12
#define PLAYER_COUNT 2
int buttonPins[PLAYER_COUNT] = {3, 13};
int ledPins[PLAYER_COUNT] = {9, 11};
void setup()
{
pinMode(BUZZER_PIN, OUTPUT);
for (int player = 0; player < PLAYER_COUNT; ++player)
{
pinMode(ledPins[player], OUTPUT);
pinMode(buttonPins[player], INPUT_PULLUP);
}
}
void loop()
{
delay(random(2000, 7000));
tone(BUZZER_PIN, 3000, 250);
for (int player = 0; ; player = (player+1) % PLAYER_COUNT)
{
if (!digitalRead(buttonPins[player]))
{
digitalWrite(ledPins[player], HIGH);
tone(BUZZER_PIN, 4000, 1000);
delay(1000);
digitalWrite(ledPins[player], LOW);
break;
}
}
}
Вопросы для проверки себя
Эксперимент 13. Секундомер
В этом эксперименте мы создаем секундомер, который считает до 10.
Схема
Код
#define FIRST_SEGMENT_PIN 2
#define SEGMENT_COUNT 7
byte numberSegments[10] = {
0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110,
};
void setup()
{
for (int i = 0; i < SEGMENT_COUNT; ++i)
pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
}
void loop()
{
int number = (millis() / 1000) % 10;
int mask = numberSegments[number];
for (int i = 0; i < SEGMENT_COUNT; ++i) {
boolean enableSegment = bitRead(mask, i);
digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);
}
}
Вопросы для проверки себя
Схема
Код
#define DATA_PIN 13
#define LATCH_PIN 12
#define CLOCK_PIN 11
#define BUTTON_PIN 10
int clicks = 0;
boolean buttonWasUp = true;
byte segments[10] = {
0b01111101, 0b00100100, 0b01111010, 0b01110110, 0b00100111,
0b01010111, 0b01011111, 0b01100100, 0b01111111, 0b01110111
};
void setup()
{
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(8, OUTPUT);
}
void loop()
{
digitalWrite (8, HIGH);
if (buttonWasUp && !digitalRead(BUTTON_PIN)) {
delay(10);
if (!digitalRead(BUTTON_PIN))
clicks = (clicks + 1) % 10;
}
buttonWasUp = digitalRead(BUTTON_PIN);
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segments[clicks]);
digitalWrite(LATCH_PIN, HIGH);
}
Вопросы для проверки себя
Схема
Код
#include <math.h>
#define FIRST_LED_PIN 2
#define LED_COUNT 10
#define TERMIST_B 4300
#define VIN 5.0
void setup()
{
pinMode(13, OUTPUT);
for (int i = 0; i < LED_COUNT; ++i)
pinMode(i + FIRST_LED_PIN, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
float voltage = analogRead(A0) * VIN / 1023.0;
float r1 = voltage / (VIN - voltage);
float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
for (int i = 0; i < LED_COUNT; ++i) {
boolean enableSegment = (temperature >= 21+i);
digitalWrite(i + FIRST_LED_PIN, enableSegment);
}
}
Вопросы для проверки себя
Схема
Код
#include <math.h>
int minute = 1;
#define TERMIST_B 4300
#define VIN 5.0
void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600);
Serial.println("Minute\tTemperature");
}
void loop()
{
digitalWrite(13, HIGH);
float voltage = analogRead(A0) * VIN / 1024.0;
float r1 = voltage / (VIN - voltage);
float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
Serial.print(minute);
Serial.print("\t");
Serial.println(temperature);
delay(60000);
++minute;
}
Вопросы для проверки себя
Эксперимент 17. Пантограф
В этом эксперименте мы вращаем сервопривод на угол, задаваемый потенциометром.
Схема
Код
#include <Servo.h>
#define POT_MAX_ANGLE 270.0
Servo myServo;
void setup()
{
pinMode(13, OUTPUT);
myServo.attach(9);
}
void loop()
{
digitalWrite(13, HIGH);
int val = analogRead(A0);
int angle = int(val / 1024.0 * POT_MAX_ANGLE);
angle = constrain(angle, 0, 180);
myServo.write(angle);
}
Вопросы для проверки себя
Схема
Код
#include <LiquidCrystal.h>
#define DIODE_DROP 0.7
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
void setup()
{
pinMode(7, OUTPUT);
lcd.begin(16, 2);
lcd.print("Battery voltage:");
}
void loop()
{
digitalWrite(7, HIGH);
float voltage = analogRead(A0) / 1024.0 * 10.0;
if (voltage > 0.1)
voltage += DIODE_DROP;
lcd.setCursor(0, 1);
lcd.print(voltage, 2);
lcd.print(" Volts");
}
Вопросы для проверки себя
Схема
Код
#define LED_PIN 9
String message;
void setup()
{
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop()
{
while (Serial.available()) {
char incomingChar = Serial.read();
if (incomingChar >= '0' && incomingChar <= '9') {
message += incomingChar;
} else if (incomingChar == '\n') {
analogWrite(LED_PIN, message.toInt());
message = "";
}
}
}
Вопросы для проверки себя
Схема
Код
#define BUZZER_PIN 0
#define FIRST_BAR_PIN 4
#define BAR_COUNT 10
#define MAX_SCORE 20
volatile int score = 0;
void setup()
{
pinMode(1, OUTPUT);
for (int i = 0; i < BAR_COUNT; ++i)
pinMode(i + FIRST_BAR_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
attachInterrupt(INT1, pushP1, FALLING);
attachInterrupt(INT0, pushP2, FALLING);
}
void pushP1() { ++score; }
void pushP2() { --score; }
void loop()
{
digitalWrite(1, HIGH);
tone(BUZZER_PIN, 2000, 1000);
while (abs(score) < MAX_SCORE) {
int bound = map(score, -MAX_SCORE, MAX_SCORE, 0, BAR_COUNT);
int left = min(bound, BAR_COUNT / 2 - 1);
int right = max(bound, BAR_COUNT / 2);
for (int i = 0; i < BAR_COUNT; ++i)
digitalWrite(i + FIRST_BAR_PIN, i >= left && i <= right);
}
tone(BUZZER_PIN, 4000, 1000);
while (true) {}
}
Вопросы для проверки себя
Эксперимент 1. Маячок
В этом эксперименте мы просто мигаем светодиодом.
Схема
Код
void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
delay (100);
digitalWrite(13, LOW);
delay (900);
}
Контрольные вопросы
Что будет, если подключить к земле анод светодиода вместо катода?
Ток в цепи течь не будет, светодиод не будет светиться.
2. Что будет если подключить светодиод с резистором большего номинала (например 10кОм)?
Ток не потечет через этот резистор, светодиод не загорится.