Несколько вопросов по програмированию arduino

alex0
Offline
Зарегистрирован: 14.12.2015

Вопрос о програмирование Arduino.

Прочитал книжку "Arduino блокнот програмиста" и не понял некоторые моменты.



1)

int inputVariable = 0; задает переменную inputVariable и присваивает ей значение 0

int ledPin = 4; задает что переменная ledPin это 4 вывод МК



что за странный синтаксис? почему одиниковые команды действуют по разному? и как определить  какой вывод цифровой или аналоговый задается, ведь номера у них одинаковые?





Посоветуйте пожалуйста хорошие книжки по Arduino для новичков;

СПАСИБО 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

переменная int Variable=7 хранит значение 7 , а вот что ты имеешь ввиду под этим - количество слонов , номер пина , значение АЦП на аналоговом пине - зависит только от тибя

номера у пинов все разные

для начала можно и здесь почитать http://arduino.ru/Reference

Sindbad
Offline
Зарегистрирован: 08.12.2015

alex0 пишет:

int inputVariable = 0; задает переменную inputVariable и присваивает ей значение 0

int ledPin = 4; задает что переменная ledPin это 4 вывод МК



что за странный синтаксис? почему одиниковые команды действуют по разному? и как определить  какой вывод цифровой или аналоговый задается, ведь номера у них одинаковые?

На самом деле

int ledPin = 4;//задает переменную ledPin и  присваивает ей значение 4

 Автор примера перестарался и Вас запутал. 

Программист волен по своему усмотрению создавать любые переменные, давать им любые допустимые имена и использовать дальше в программе.

Уверен, что далее в примере переменная ledPin использовалась для указания номера вывода микроконтроллера, именно об этом и пытался сказать автор примера, хоть и несколько косноязычно.

Прежде чем всерьез браться за Ардуино, очень рекомендую освоить основы программирования. Лучше всего по школьному учебнику или книге для школьников. Язык не важен (С, Паскаль, С++, Кумир, Ява и т.д.) 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Изучение надо начинать с С и потом С++, ибо все остальные языки - суть производные. Кроме разного рода экзотик типа функциональных и языков СУБД. :)

Sindbad
Offline
Зарегистрирован: 08.12.2015

Arhat109-2 пишет:

Изучение надо начинать с С и потом С++, ибо все остальные языки - суть производные. Кроме разного рода экзотик типа функциональных и языков СУБД. :)

Лично я не разделяю это мнение. Оба языка тянут вместе с бэкграундом практического профессионального применения много вещей совершенно не нужных при первоначальном знакомстве. В добавок оба языка тянут с собой слишком много процессорной архитектуры. Не случайно IDE Ардуины прячет часть "заумностей" от пользователя.

Специально для обучения программированию создан язык Паскаль. Я бы порекомендовал его. Кстати, он никак не производная от С. См. год появления языков:

https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%81%D0%BA%D0%B0%D0%BB%D1%8C_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)

https://ru.wikipedia.org/wiki/%D0%A1%D0%B8_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

:) перечитайте свои же ссылки. :)

Язык С разработан в 1969 .. на базе языка Би .. который был конечно же "чуть раньше" .. если мне память не изменяет то это 1965 год. :) Ну и соответственно он СРАЗУ же пошел в работу..

Язык Паскаль разработан(!) в 1969 (1968 - начало таки) а "в обучение" по сути пошел только в 1978, когда была разработана СИСТЕМА программирования на нем .. до этого времени он просто лежал без дел .. как и 100500 "языков" того времени.

:)

Зачем и что упрятывали авторы wiring и главное куда - для меня пока "тайна за 7-ю печатями" .. ибо там "нечего прятать" от слова совсем. Разве что скетчи сделать тяжелыми и неповортливыми, дабы новички шустрее переходили на нормальные инструменты. Чем больше ковыряю исходники wiring, тем увереннее укрепляюсь в таком мнении. :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

С/С++ вполне можно изучать без привязки к железу .. там мног, да .. но не всё требуется для изучения.. :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

alex0, самое главное то, что никакого "программирования для Ардуино" в природе не существует.

Есть общее представление о программировании как умении применять для решения задач те или иные алгоритмы, и есть определенные алгоритмические языки, которые используются для записи алгоритмов с целью последующего ввода в компьютер. Если алгоритм не предназначен для ввода в компьютер, алгоритмический язык необязателен, то же самое можно записать, например, по-русски или по-китайски.

Для того, чтобы программировать Ардуино нужно хотя бы в какой-то степени иметь представление о программировании (т.е. о составлении и использовании алгоритмов) и в какой-то степени знать языки С и С++, которые используются в среде Ардуино.

Для обучения собственно программированию лучше всего, как уже было упомянуто выше, использовать алгоритмический язык Паскаль. Но для работы с Ардуино придется выучить еще С/С++.

alex0
Offline
Зарегистрирован: 14.12.2015

Когда то давно програмировал на паскале, и сейчас это сильно мешает.

 

alex0, самое главное то, что никакого "программирования для Ардуино" в природе не существует.

Согласен, но всёже это не С++, и Си мне не нужен, я сисадмин и не програмист. Просто увлекаюсь радиоэлектроникой, а писать код проще чем паять схемы))

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В Ардуино используется как раз Си/Си++, а нужно это Вам или нет - решать Вам.

PS. Я тоже больше привык писать на Паскале или Фортране, но коль скоро здесь используется С++, пишу на С++.

alex0
Offline
Зарегистрирован: 14.12.2015

Разобрался с назначением пинов и переменных, и вот мой первый скетч))

Наifал ))


// Регулировка яркости и контрастности LCD одной кнопкой.
// Lex 2015.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 7, 6, 5, 4); // Назначаем экран
int kontrast = 0; // Уровень контрастности
int kontrastPin = 9;
int kontrastUpDown = 0; // Повышать или понижать контрастность
int loadPin = 13; 
int lightIn = 0;  // Сигнал с кнопки
int lightOut = 0; // Уровень яркости
int lightPin = 10;
int lightButton = 8; 
int lightUpDown = 0; // Повышать или понижать яркость
int lightUDstep = 1; // Шаг изменения яркости
int lP = 0; // Для мигания loadPin
int buttPos = 0; // повышатся при удержании
int mode = 0;  // режим яркость - контрастность
void setup(){
  pinMode(3, OUTPUT);
  pinMode(loadPin, OUTPUT);
  pinMode(kontrastPin, OUTPUT);
  pinMode(lightPin, OUTPUT);
  pinMode(lightButton, INPUT);
  pinMode(lightButton, HIGH);
  Serial.begin(9600);
     lcd.begin(16, 2);
     kontrast = 115;
     lightOut = 50;
          }
void loop() { 
  lcd.clear();   
      lightIn = digitalRead(lightButton);
      // Выбор режима яркость - контрастность
      if (lightIn == 1) buttPos++;
      if (lightIn == 0) buttPos = 0;
      if (buttPos >= 3 && mode == 0) {
        mode++;
        buttPos = 0;
        analogWrite(3, 50); //Beeper
        delay(200);
      }
     if (buttPos >= 3 && mode == 1) {
        mode--;
        buttPos = 0;
        analogWrite(3, 50); //Beeper
        delay(200);
      }
     if (mode == 0) // Регулировка яркости
      { 
        analogWrite(3, 0); //Beeper
        lcd.setCursor(1, 0);
        lcd.print("Light ");
        lcd.print(lightOut);
       if (lightOut > 50) lightUDstep = 10;
       if (lightOut < 50) lightUDstep = 3;
       if (lightOut >= 234) lightUpDown = 1;
       if (lightOut <= 3)  lightUpDown = 0;
       if (lightIn == 1 && lightUpDown == 0) lightOut = lightOut + lightUDstep;
       if (lightIn == 1 && lightUpDown == 1) lightOut = lightOut - lightUDstep;
       analogWrite(lightPin, lightOut);
      }
      else //Регулировка контрастности
       { 
        analogWrite(3, 0); //Beeper
        lcd.setCursor(1, 0);
        lcd.print("Bright ");
        lcd.print(kontrast);
       if (kontrast >= 160) kontrastUpDown = 1;
       if (kontrast <= 60)  kontrastUpDown = 0;
       if (lightIn == 1 && kontrastUpDown == 0) kontrast = kontrast + 5;
       if (lightIn == 1 && kontrastUpDown == 1) kontrast = kontrast - 5;
        analogWrite(kontrastPin, kontrast);
      }
             analogWrite(kontrastPin, kontrast);
             analogWrite(lightPin, lightOut);
          
// Индикатор работы
  lP = digitalRead(loadPin);
  if (lP == 0)    {
    digitalWrite(loadPin, 1023);    }
  else     {
  digitalWrite(loadPin, 0);    }
  
  lcd.setCursor(0, 2);
  lcd.print("I LOVE MY MOMMY");
  Serial.println("------------");
  Serial.println(buttPos);
  Serial.println(mode);
  Serial.println(lightOut);
  Serial.println(kontrast);
  delay(100);
      }

 

Буду рад критике и подсказкам)))

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Перечитайте двумчиво это http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-mr... и критика вам не понадобится. :)

Sindbad
Offline
Зарегистрирован: 08.12.2015

Практика критерий истины.

Ратотает - ок.

Не работает - нужно упростить и локализовать ошибку.

alex0
Offline
Зарегистрирован: 14.12.2015

Arhat109-2 пишет:

Перечитайте двумчиво это http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-mr... и критика вам не понадобится. :)

 

Спасибо за ссылочку)) "Алгоритмическая оптимизация" для меня пока еще сложна, а кодовой займусь на днях.

alex0
Offline
Зарегистрирован: 14.12.2015

Помогите пожалуйста, не понимаю что компилятор от меня хочет, вроде синтаксис по учебнику;

 

1  

 

Всё понял, извиняюсь)

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

в конце скетча нет }

void(loop){  кто закрывать будет?

alex0
Offline
Зарегистрирован: 14.12.2015

На скрине просто не видно, скетч длинный)) 

А ошибка была в том что поставил запятые в for а не точку с запятой

alex0
Offline
Зарегистрирован: 14.12.2015

Я снова обращаюсь к вам за помощью.

На LCD дисплее отображается только Loading (строки кода 26 и 59-62) и lcd.clear(81-83) не очищает дисплей, а также не "Меню" отображается "Меню" (85-100), хотя всё работало. Если написать в другом месте кода lcd.print("blablabla") тоже не отображает

/* Умная комната
Проект управления электроникой в комнате
by Lex 2015
*/

// Назначаем библиотеки модулей
#include <LiquidCrystal.h>
#include "IRremote.h"
LiquidCrystal lcd(3, 2, 7, 6, 5, 4); // Назначаем экран
IRrecv irrecv(8);
decode_results results;

// Переменные подсветки потолка
byte rLed = 9;
byte gLed = 10;
byte bLed = 11;
byte r = 150;
byte g = 150;
byte b = 150;
int rgb = 0;
boolean on = 0;
const int upper = 765;

// Индикатор работы
byte i = 0;
char load[8] = {'L', 'o', 'a', 'd', 'i', 'n', 'g'};
byte ledPin = 13;

// Прием ИК сигнала
const unsigned long power = 3733801123;
const unsigned long power2 = 1119703215;
const unsigned long lowLight = 3179222947;
const unsigned long lowLight2 = 541578531;
const unsigned long highLight = 1674690463;
const unsigned long highLight2 = 1337766115;
const unsigned long repeat = 4294967295;
unsigned long value = 0000000000;
unsigned long kodIR = 0000000000;

// Слежение за питанием
byte fanPin = 9; //PWM с транзистором
byte tempBpPin = 0; // Analog
int tempBp = 0;
int voltage = 3; // Analog
int current = 4; // Analog

// Климат и освещенность
byte tempRoomPin = 1; // Analog
int tempRoom = 0;
byte lightRoomPin = 2; //Analog
int lightRoom = 0;

//Дисплей и режимы
byte mode = 0;
long timer = 0;

void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(4, 1);
  for (i=0; i < 7; i++){
  lcd.print(load[i]);
  delay(120); }
  
  Serial.begin(9600);
  irrecv.enableIRIn(); // Запускаем прием
  
  pinMode(ledPin, OUTPUT);
  pinMode(rLed, OUTPUT);
  pinMode(gLed, OUTPUT);
  pinMode(bLed, OUTPUT);
  pinMode(fanPin, OUTPUT);
  pinMode(tempBpPin, INPUT);
  pinMode(voltage, INPUT);
  pinMode(current, INPUT);
  pinMode(tempRoomPin, INPUT);
  pinMode(lightRoomPin, INPUT);
  }

void loop() {
    // Вывод данных на дисплей
  if (millis() >= timer + 200){
  lcd.clear();
  timer = millis();  }
 
  if (mode == 0){
    lcd.setCursor(0, 0);
    lcd.print("Light");
    lcd.setCursor(7, 0);
    lcd.print("Temp");
    lcd.setCursor(12, 0);
    lcd.print("TempBP");
    lcd.setCursor(0, 1);
    lcd.print(rgb);
    lcd.print(" %");
    lcd.setCursor(7, 1);
    lcd.print(tempRoom);
    lcd.print(" C'");
    lcd.setCursor(12, 1);
    lcd.print(tempBp);
    lcd.print(" C'");
  }
   
  // Принимаем ИК сигнал
    if (irrecv.decode(&results)) // Если данные пришли 
  {  
    Serial.println(results.value, DEC); // Отправляем полученную данную в консоль
    irrecv.resume(); // Принимаем следующую команду
            value = (DEC, results.value);
        if (value != repeat) kodIR = value;
        }
         
  // Управляем подсветкой
        if (kodIR == power || kodIR == power2) on = !on;
        if (kodIR == lowLight || kodIR == lowLight2) {
          r = r - 25;
          g = g - 25;
          b = b - 25;
        }
        if (kodIR == highLight || kodIR == highLight2) {
          r = r + 25;
          g = g + 25;
          b = b + 25;
        }
        if (on == 1){
        digitalWrite(rLed, r); 
        digitalWrite(gLed, g);
        digitalWrite(bLed, b);
        rgb = (r + g + b) / 7.7;}
        else {
        digitalWrite(rLed, 0); 
        digitalWrite(gLed, 0);
        digitalWrite(bLed, 0);
        rgb = 0;}
        
        // Мигание светодиода
  digitalWrite(ledPin, !digitalRead(ledPin));
  
    // Вывод в консоль
    Serial.println("---------------------------------");
  Serial.println(on);
  Serial.println(r);
  Serial.println(g);
  Serial.println(b);
  Serial.println(rgb); 
  Serial.println(kodIR);
  Serial.println(value);
  Serial.println(millis());
  Serial.println(timer);
  Serial.println(mode);
    
  
 delay(2500);
  }

Помогите пожалуйста, пол дня уже с этим бьюсь(((

 

Sindbad
Offline
Зарегистрирован: 08.12.2015

Общий подход - закоментировать строки с 64 по 76 и посмотреть, очистится ли экран. Если очистится, раскомментировать половину и снова проверить. И т.д. половинным делением локализовать ошибку.

Вот тут непонятно:

pinMode(voltage, INPUT);

вроде, как пытаетесь управлять пином зарезервированным для экрана.

alex0
Offline
Зарегистрирован: 14.12.2015

Sindbad, СПАСИБО. 

 

Немного изменил код. Работает стабильно, но есть пара вопросов, на которые гугл не смог ответить.

<span style="font-family: Verdana, Geneva, Arial, sans-serif; font-size: 12px; line-height: 1.5em;">/* Умная комната</span><pre class="brush:arduino;">Проект управления электроникой в комнате
by Lex 2015
*/

// Назначаем библиотеки модулей
#include <LiquidCrystal.h>
#include "IRremote.h"
LiquidCrystal lcd(8, 2, 7, 6, 4, 3); // Назначаем экран
IRrecv irrecv(11);
decode_results results;

// Переменные подсветки потолка
byte rLed = 5;
byte gLed = 10;
byte bLed = 9;
byte r = 64;
byte g = 64;
byte b = 64;
int rgb = 0;
boolean on = 0;

// Прием ИК сигнала
//const unsigned long power = 3733801123; 551494365
//const unsigned long power2 = 1119703215;
//const unsigned long lowLight = 3179222947; 551518845
//const unsigned long lowLight2 = 541578531;
//const unsigned long highLight = 1674690463; 551486205
//const unsigned long highLight2 = 1337766115;
//const unsigned long repeat = 4294967295;
unsigned long value = 0000000000;
unsigned long lastValue = 0000000000;
unsigned long kodIR = 0000000000;

//Дисплей
unsigned long timer = 0;
byte mode = 0;

//Дисплей и режимы
//byte mode = 0;
void setup() {
   lcd.begin(16, 2);
   Serial.begin(9600);
   irrecv.enableIRIn(); // Запускаем прием
  
//  pinMode(ledPin, OUTPUT);
  pinMode(rLed, OUTPUT);
  pinMode(gLed, OUTPUT);
  pinMode(bLed, OUTPUT);
  pinMode(13, OUTPUT);
  
}
void loop() {
  // Дисплей
  
  digitalWrite(13, 0);
  if (millis() > timer + 50) {
    lcd.clear();
    timer = millis();
  }
    lcd.setCursor(0, 0);
    lcd.print("Light");
    lcd.setCursor(6, 0);
    lcd.print("Temp");
    lcd.setCursor(11, 0);
    lcd.print("TempBP");
    lcd.setCursor(0, 1);
    lcd.print(rgb);
    lcd.print(" %");
    lcd.setCursor(6, 1);

    // Принимаем ИК сигнал
    lastValue = kodIR; 
    kodIR = 0000000000;
    value = 0000000000;
    if (irrecv.decode(&results)) // Если данные пришли 
    {  
      //Serial.println(results.value, DEC); // Отправляем полученную данную в консоль
      irrecv.resume(); // Принимаем следующую команду
      value = (DEC, results.value);
    }
        if (value == 4294967295) kodIR = lastValue;
        if (value != 4294967295) kodIR = value;
        //else kodIR = value;
         
  // Управляем подсветкой
        if (kodIR == 551494365) on = !on;
        
        if (kodIR == 551518845) {
          r = r - 8;
          g = g - 8;
          b = b - 8;
        }
        if (kodIR == 551486205) {
          r = r + 8;
          g = g + 8;
          b = b + 8;
        }
        if (on == 1)
        {
        analogWrite(rLed, r); 
        analogWrite(gLed, g);
        analogWrite(bLed, b);
        rgb = (r + g + b) / 7.65;
        }
        if (on == 0)
        {
        analogWrite(rLed, 0); 
        analogWrite(gLed, 0);
        analogWrite(bLed, 0);
        rgb = 0;
        }

        
        // Мигание светодиода
        // digitalWrite(ledPin, digitalRead(ledPin)); //Чёто не всегда пашет (((


    // Вывод в консоль
  Serial.println("---------<");
  //Serial.println(on);
  //Serial.println(digitalRead(rLed));
  //Serial.println(digitalRead(gLed));
  //Serial.println(digitalRead(bLed));
  //Serial.println(rgb); 
  Serial.println(kodIR);
  Serial.println(value);
  Serial.println(lastValue);
  //Serial.println(millis());
  //Serial.println(timer);
  //Serial.println(mode); 
  //Serial.println(memoryFree());
  //delay(500);
 
  }

1) analogWrite нормально выдает ШИМ сигнал на выходах 5, 9, 10, но не работает(всегда низкий уровень)

на выходах 3 и 11.

2) Без delay в конце кода прием и обработка сигнала ИК пульта не совсем корректна

Данные Serial.println (kodIR); (value); (lastValue);

Так быть не должно:

---------<
551486205
551486205
0
---------<
551486205
4294967295
551486205
---------<
0
0
551486205
---------<
0
0
0
---------<
0
0
0
---------<
0
4294967295
0
---------<
0
0
0
---------<
0
0
0
---------<
0
0
0
---------<
0
4294967295
0
---------<
0
0
0
---------<
0
0
0
---------<
0
0
0
---------<
0
0
0
---------<
0
4294967295
0
---------<

А по задумке должно быть так

---------<
551486205
551486205
0
---------<
551486205
4294967295
551486205
---------<
551486205
4294967295
551486205
---------<
551486205
4294967295
551486205
---------<
551486205
4294967295
551486205
---------<
551486205
4294967295
551486205
---------<
551486205
4294967295
551486205
---------<

Тут delay(200).

При delay(100) 10 повторов нормально, а дальше как без delay.

 

ВСЕM ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ!!!)))))