Несколько вопросов по програмированию arduino
- Войдите на сайт для отправки комментариев
Пнд, 14/12/2015 - 00:14
Вопрос о програмирование Arduino.
Прочитал книжку "Arduino блокнот програмиста" и не понял некоторые моменты.
1)
int inputVariable = 0; задает переменную inputVariable и присваивает ей значение 0
int ledPin = 4; задает что переменная ledPin это 4 вывод МК
что за странный синтаксис? почему одиниковые команды действуют по разному? и как определить какой вывод цифровой или аналоговый задается, ведь номера у них одинаковые?
Посоветуйте пожалуйста хорошие книжки по Arduino для новичков;
СПАСИБО
переменная int Variable=7 хранит значение 7 , а вот что ты имеешь ввиду под этим - количество слонов , номер пина , значение АЦП на аналоговом пине - зависит только от тибя
номера у пинов все разные
для начала можно и здесь почитать http://arduino.ru/Reference
int inputVariable = 0; задает переменную inputVariable и присваивает ей значение 0
int ledPin = 4; задает что переменная ledPin это 4 вывод МК
что за странный синтаксис? почему одиниковые команды действуют по разному? и как определить какой вывод цифровой или аналоговый задается, ведь номера у них одинаковые?
На самом деле
Автор примера перестарался и Вас запутал.
Программист волен по своему усмотрению создавать любые переменные, давать им любые допустимые имена и использовать дальше в программе.
Уверен, что далее в примере переменная ledPin использовалась для указания номера вывода микроконтроллера, именно об этом и пытался сказать автор примера, хоть и несколько косноязычно.
Прежде чем всерьез браться за Ардуино, очень рекомендую освоить основы программирования. Лучше всего по школьному учебнику или книге для школьников. Язык не важен (С, Паскаль, С++, Кумир, Ява и т.д.)
Изучение надо начинать с С и потом С++, ибо все остальные языки - суть производные. Кроме разного рода экзотик типа функциональных и языков СУБД. :)
Изучение надо начинать с С и потом С++, ибо все остальные языки - суть производные. Кроме разного рода экзотик типа функциональных и языков СУБД. :)
Лично я не разделяю это мнение. Оба языка тянут вместе с бэкграундом практического профессионального применения много вещей совершенно не нужных при первоначальном знакомстве. В добавок оба языка тянут с собой слишком много процессорной архитектуры. Не случайно 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)
:) перечитайте свои же ссылки. :)
Язык С разработан в 1969 .. на базе языка Би .. который был конечно же "чуть раньше" .. если мне память не изменяет то это 1965 год. :) Ну и соответственно он СРАЗУ же пошел в работу..
Язык Паскаль разработан(!) в 1969 (1968 - начало таки) а "в обучение" по сути пошел только в 1978, когда была разработана СИСТЕМА программирования на нем .. до этого времени он просто лежал без дел .. как и 100500 "языков" того времени.
:)
Зачем и что упрятывали авторы wiring и главное куда - для меня пока "тайна за 7-ю печатями" .. ибо там "нечего прятать" от слова совсем. Разве что скетчи сделать тяжелыми и неповортливыми, дабы новички шустрее переходили на нормальные инструменты. Чем больше ковыряю исходники wiring, тем увереннее укрепляюсь в таком мнении. :)
С/С++ вполне можно изучать без привязки к железу .. там мног, да .. но не всё требуется для изучения.. :)
alex0, самое главное то, что никакого "программирования для Ардуино" в природе не существует.
Есть общее представление о программировании как умении применять для решения задач те или иные алгоритмы, и есть определенные алгоритмические языки, которые используются для записи алгоритмов с целью последующего ввода в компьютер. Если алгоритм не предназначен для ввода в компьютер, алгоритмический язык необязателен, то же самое можно записать, например, по-русски или по-китайски.
Для того, чтобы программировать Ардуино нужно хотя бы в какой-то степени иметь представление о программировании (т.е. о составлении и использовании алгоритмов) и в какой-то степени знать языки С и С++, которые используются в среде Ардуино.
Для обучения собственно программированию лучше всего, как уже было упомянуто выше, использовать алгоритмический язык Паскаль. Но для работы с Ардуино придется выучить еще С/С++.
Когда то давно програмировал на паскале, и сейчас это сильно мешает.
alex0, самое главное то, что никакого "программирования для Ардуино" в природе не существует.
Согласен, но всёже это не С++, и Си мне не нужен, я сисадмин и не програмист. Просто увлекаюсь радиоэлектроникой, а писать код проще чем паять схемы))
В Ардуино используется как раз Си/Си++, а нужно это Вам или нет - решать Вам.
PS. Я тоже больше привык писать на Паскале или Фортране, но коль скоро здесь используется С++, пишу на С++.
Разобрался с назначением пинов и переменных, и вот мой первый скетч))
На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); }Буду рад критике и подсказкам)))
Перечитайте двумчиво это http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-mr... и критика вам не понадобится. :)
Практика критерий истины.
Ратотает - ок.
Не работает - нужно упростить и локализовать ошибку.
Перечитайте двумчиво это http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-mr... и критика вам не понадобится. :)
Спасибо за ссылочку)) "Алгоритмическая оптимизация" для меня пока еще сложна, а кодовой займусь на днях.
Помогите пожалуйста, не понимаю что компилятор от меня хочет, вроде синтаксис по учебнику;
Всё понял, извиняюсь)
в конце скетча нет }
void(loop){ кто закрывать будет?
На скрине просто не видно, скетч длинный))
А ошибка была в том что поставил запятые в for а не точку с запятой
Я снова обращаюсь к вам за помощью.
На 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); }Помогите пожалуйста, пол дня уже с этим бьюсь(((
Общий подход - закоментировать строки с 64 по 76 и посмотреть, очистится ли экран. Если очистится, раскомментировать половину и снова проверить. И т.д. половинным делением локализовать ошибку.
Вот тут непонятно:
вроде, как пытаетесь управлять пином зарезервированным для экрана.
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 в конце кода прием и обработка сигнала ИК пульта не совсем корректна
Так быть не должно:
А по задумке должно быть так
Тут delay(200).
При delay(100) 10 повторов нормально, а дальше как без delay.
ВСЕM ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ!!!)))))