+7 (977) 810-87-41
Как учиться?

Для обладателей наборов Роботы и устройства. Старт:

  1. Наш курс «Строим роботов и другие устройства на Arduino» начинается с простейших устройств и их программирования. Для практических задач первых двух недель набор «Старт» будет оптимальным решением.
  2. Примеры из Путеводителя, который лежал в вашем наборе, вы можете найти здесь.
  3. В этом разделе появляются новые примеры, которые вы можете попробовать с вашим набором. Ищите их по тегу «роботы и устройства».
  4. Используйте другие теги для фильтрации примеров по темам, которые для вас актуальны.
Лента примеров:
Индикатор погоды

weather

#define TEMP_PIN A0
#define LIGHT_PIN A1

#define DATA_PIN    13
#define LATCH_PIN   12
#define CLOCK_PIN   11

#define COLD 580
#define DARK 200
#define BRIGHT 800

byte scale = 0b00000000;// двоичное значение
int temp_point = 0;
int light_point = 0;

void setup() {
// сделаем порты выходами
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);

}

void loop() {
  int temperature = analogRead(TEMP_PIN);
  int light = analogRead(LIGHT_PIN);
  // не страшно, если про маску поймете не сразу!
  if (light < DARK) //если выполнено условие...
  {
    light_point = 7; // ...присвоим light_point значение
  }  // далее сложное условие с логическим И
  else if (light >= DARK && light < BRIGHT)
  {
    light_point = 3; // метка в другом положении
  }
  else
  {                  // число -- номер бита
    light_point = 0; // в маске шкалы,  
  }                  // соответствующий вывод  
  if (temperature < COLD)
  {                 // регистра будет включен
    temp_point = 2;
  }
  else
  {                         // второе положение для
    temp_point = 5;// метки освещенности
  }       
  scale = 0;  // очистим маску шкалы
  bitSet(scale, temp_point);   // запишем в маску
  bitSet(scale, light_point);  // обе метки
    // отправим маску в сдвиговый регистр
  digitalWrite(LATCH_PIN, LOW);
  shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, scale);
  digitalWrite(LATCH_PIN, HIGH);
}
Двоичные палочки
sticks


#define LED1 3
#define LED2 4
#define LED3 5
#define LED4 6
#define PLAYER1 13
#define PLAYER2 9
#define BUTTON1 10
#define BUTTON2 11
#define BUTTON3 12

#define OFFSET 9
#define CELEBRATION 3000
#define TEMPO 100

int n = 0;  // число, которое высвечивается в двоичном коде (количестов оставшихся палочек)
int d = 0;  // число палочек, которое надо погасить
int a0 = 0;  // переменная для перевода числа в двоичный код, смотри функцию light
int a1 = 0;// переменная для перевода числа в двоичный код, смотри функцию light
int ost = 0;// переменная для перевода числа в двоичный код, смотри функцию light

boolean fl = false;  // флаг, поднимаемый при нажатии кнопки, отвечающий за выбор палочек, которые надо погасить
boolean turn = true; // маркер хода одного из двух игроков (один true, другой false)
void light(int m) // функция для перевода числа в двоичный код и высвечивания кода светодиодами; на входе десятиричное число
{

  a0 = m;

  for (int i = LED4; i >= LED1; i--) // цикл для "обхода" светодиодов и включения/выключения тех из них, которые нужны для индикации текущего числа в двоичном виде
  {
    /* перевод из десятичного в двоичное число:
     *определяем остаток от деления на 2
     *если в остатке 1, то и в двоичном числе 1, если 0 то 0
     *
     *поделенное число вновь делим на 2, определив двоичную цифру для нового разряда
     
     * при таком способе при первом делении получаем цифру младшего разряда,
     * то есть двоичное число восстанавливается справа налево,
     * а не наоборот, как обычно записываются числа*/

    a1 = a0 / 2; //делим на 2 нацело (то есть 7/2=3)

    ost = a0 - 2 * a1; //определяем остаток от деления

    a0 = a1; // берем половину от десятиричного числа для определения цифры следующего разряда двоичного числа
    // три строки выше дают остаток от деления и половину от десятиричного числа для дальнейшего деления
    
    if (ost == 0)
    {
      digitalWrite(i, LOW);
    }
    // гасим или зажигаем светодиод,
    // соотвествующий цифре двоичного числа в соответсвующем разряде,
    // в зависимости от результата деления
    if (ost == 1)
    {
      digitalWrite(i, HIGH);
    }

}

void winnerIs(boolean player) //функция для "празднования" победы
{
  int winner = 0; // локальная переменная, в которую запишем номер пина светодиода, принадлежащего победителю
  if (player) // в зависимости от того, кто победил, поместим в winner конкретное значение
  {
    winner = PLAYER1;
  }
  else
  {
    winner = PLAYER2;
  }
  long salute_start = millis(); // сохраним в переменную типа long время, в которое началось "празднование" победы
  while (millis() - salute_start < CELEBRATION) // если с момента сохраненного времени до текущего
  {                                             // момента прошло времени меньше, чем зафиксировано константой CELEBRATION, т.е. "празднование" продолжается
    digitalWrite(winner, HIGH); // светодиод победителя включается
    delay(TEMPO);               // ожидаем зафиксированное время задержки
    digitalWrite(winner, LOW);  // светодиод выключается
    delay(TEMPO);
  }
  n = 15;                      // начальное число восстанавливается
  fl = false;                  // служебный флаг сбрасывается
}

void setup()

{
  // настраиваем порты как выходы для светодиодов и как входы для кнопок
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(PLAYER1, OUTPUT);
  pinMode(PLAYER2, OUTPUT);
  pinMode(BUTTON1, INPUT_PULLUP);
  pinMode(BUTTON2, INPUT_PULLUP);
  pinMode(BUTTON3, INPUT_PULLUP);
  n = 15; //выставляем число, с которого начинаем играть (для четырех светодиодов максимум 15)
  light(n);  // зажигаем максимальное двоичное число
}

void loop()

{
  digitalWrite(PLAYER1, turn); // светодиод первого игрока светится, когда turn == true
  digitalWrite(PLAYER2, !turn); // светодиод второго игрока в это время не светится; когда ход переходит, светодиоды "переворачиваются"
 
  // опрашиваем кнопки, при этом если нажато одновременно несколько кнопок,
  // берем максимальное число (если нажата 1-я и 3-я кнопка то заберется 3 палочки)
  for (int i = BUTTON1; i <= BUTTON3; i++)
  {
    if (!digitalRead(i))
    {
      d = i - OFFSET; // определяем номер нажатой кнопки;
      fl = true; //если нажата кнопка, поднимаем флаг, что надо изменить количество оставшихся "палочек"
    }
  }

  if (fl) //если поднят флаг, надо погасить соответствующее количество палочек
  {
    n = n - d;// изменяем число заженных "палочек"
    if (n < 1) // если палочек остается меньше единицы
    {
      winnerIs(!turn); // пора праздновать победу, но не того игрока, чей ход сейчас
    }
    light(n); // зажигаем нужное количество "палочек"
    turn = !turn; // "переворачиваем" маркер хода -- ход перешел
    delay(1000);
    fl = false; // опускаем флаг, так как количество "палочек" уже изменено
  }
}