Вот в том то и прикол, что синтаксис ардуино это как бы не Си, но как бы и Си. И чтобы на ней нормально писать, надо хорошо знать Си, а если ты хорошо знаешь Си, то ты уже серьезный программист. ))) Как-то не вяжется с "конструктором для детей и их родителей" ))))
Вот в том то и прикол, что синтаксис ардуино это как бы не Си, но как бы и Си. И чтобы на ней нормально писать, надо хорошо знать Си, а если ты хорошо знаешь Си, то ты уже серьезный программист. ))) Как-то не вяжется с "конструктором для детей и их родителей" ))))
Вот самый большой парадокс. Смотрят люди глазами, а видят почему-то мозгом. Точнее многие не видят, потому что мозг уже атрофировался. Так и здесь. Для одних Ардуино Мозайка- сложил и МОЛОДЕЦ. А для других это момент исследования мира, а Ардуино просто один из инструментов. Вот где бы вы применили знание языка Си, если бы не занялись Ардуиной.
Лично для меня Ардуино стал единственным входом в программирование, поскольку ты видишь в реальности глазами то, что ты программируешь, и как оно физически работает :)
Не помню точно какого, но переменная одного из этих типов может быть неопреденной null, а другого только true и false. В описании Ардуино упоминается только boolean. bool Ардуино унаследовал от языка C, там и ищите описание различий.
В этих Ваших интернетах и не такого напишут. А на деле, открываем файл arduino.h и видим там:
typedef bool boolean;
Так, что, как видите, синонимы полные. В языке есть тип bool, но для ардуинщиков доопределили паскалевское ключевое слово. Не знаю, зачем.
Вот в том то и прикол, что синтаксис ардуино это как бы не Си, но как бы и Си.
Вот в этом то и прикол, что у Вас каша в голове. Язык Ардуино, это не "как бы", а чистый, стопроцентный С++ безо всяких "как бы". Понимаете?
freeman86 пишет:
Как-то не вяжется с "конструктором для детей и их родителей" ))))
А что такого? Что есть такого в полутора десятках конструкций, чего не может освоить человек, который сумел (хватило мозгов) научиться разговаривать, читать и вытирать попу?
Стандарт языка (раздел 5.14) специально подчёркивает разницу в порядке вычисления операндов между && и &, а также тот факт, что в && (как и в ||) используется (всегда) ленивая логика.
В данном примере порядок вычисления операндов всегда слева направо (а вот в случае & порядок не определён и оставляется на откуп реализации).
А вот с ленивой логикой могут быть сюрпризы. Например п.2 из Вашей росписи может не выполниться вовсе (если в п.1 false получилось). В таком-то виде, как в примере, это без разницы, но у выражения могут же быть и побочные эффекты. Например, если Вы напишете (val++ <= 681), То согласитесь, Вам отнюдь не всё равно выполнится оно или нет.
Ну да . Я пытаюсь избегать таких стремных конструкций. Код должен работать надежно, а потом уже быстро. А то если быстро, но с пиколами, не очень приятно ловить глюки программы.
SLKH, та, нет, ну, конечно же, тут и спорить не о чем, скобки вещь архиполезная, просто том посте, на который Вы отвечали я говорил не об этом, а о порядке вычисления операндов.
Почему-то вариант с val = analogRead(R) у меня не работает. Загорается перый светодиод и ничего не происходит с поворотом потенциометра. Вот скетч, может увидите ошибку
Сегодня написал скетч с реальным датчиком воды и влажности, и тремя светодиодами, которые отображают один из вариантов действий. Скетч полностью рабочий "на железе". Теперь возник вопрос как это офрмить с помощью switch...case. Я попытался, но получилась ерунда и она не работает. Скетч выложу в следующем сообщении
Компилятор выдавал предупреждения на ОС ХР, но компилировался. На 10 вообще ничего не выдает и компилируется. Хотя как мы выяснили это еще ни о чем не говорит... :)
#define STANDBY 0
#define WATERING 1
#define NO_WATER 2
int Water_pin = 0;
int Humid_pin = 2;
int Standby_pin = 11;
int Watering_pin = 9;
int No_water_pin = 7;
int state = STANDBY;
void setup() {
pinMode(Humid_pin, INPUT);
pinMode(Water_pin, INPUT);
pinMode(Standby_pin, OUTPUT);
pinMode(Watering_pin, OUTPUT);
pinMode(No_water_pin, OUTPUT);
}
bool WaterTank() {
if(analogRead(Water_pin) >= 30){
return HIGH;
}
else{
return LOW;
}
}
bool Humidity(){
if(digitalRead(Humid_pin) == LOW){
return LOW;
}
else{
return HIGH;
}
}
void Standby(){
if(WaterTank() == HIGH && Humidity() == LOW){
digitalWrite(Watering_pin, LOW);
digitalWrite(Standby_pin, HIGH);
digitalWrite(No_water_pin, LOW);
}
}
void No_water(){
if(WaterTank() == LOW){
digitalWrite(No_water_pin, HIGH);
digitalWrite(Standby_pin, LOW);
digitalWrite(Watering_pin, LOW);
}
}
void Watering(){
if(WaterTank() == HIGH && Humidity() == HIGH){
digitalWrite(Watering_pin, HIGH);
digitalWrite(Standby_pin, LOW);
digitalWrite(No_water_pin, LOW);
}
}
void loop() {
switch (state){
case STANDBY:
Standby();
if(WaterTank() == LOW);
state = NO_WATER;
if(WaterTank() == HIGH && Humidity() == LOW);
state = WATERING;
break;
case NO_WATER:
No_water();
state = STANDBY;
break;
case WATERING:
Watering();
state = STANDBY;
break;
}
}
Valera19701, спасибо! Теперь все работает. R надо было в цикл занести потому-что на нее постоянно разные данные приходят и ее надо постоянно обновлять?
freeman86, это одинаковые операторы, но для разных типов. Проблема в том, что в С не различаются целые и логический тип, поэтому компилятору надо явно указать, с чем мы хотим работать: с отдельными битами или с логическими выражениями.
Собрал поливалку в виде схемы, теперь программа. И сразу возникла сложность. Сам текст программы ниже. Подскажите почему выполняется только то, что в теле void loop, а другой "void" игнорируется? Пробовал менять местами.
int Water_pin = A0; // датчик воды
int Humid_pin1 = 10; // датчик влажности 1
int PUMP12_1 = 2; // насос 12 вольт полная мощность
int RED_LED = 9; // красный светик "нет воды"
int GREEN_LED = 8; // зеленый светик "режим ожидания"
void setup() {
pinMode(Water_pin, INPUT);
pinMode(Humid_pin1, INPUT);
pinMode(PUMP12_1, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
}
// проверка уровня воды
bool WaterTank() {
if(analogRead(Water_pin) >= 30){
return HIGH;
}
else{
return LOW;
}
}
// проверка влажности на датчике 1
bool Humid1(){
if(digitalRead(Humid_pin1) == HIGH){
return HIGH;
}
else {
return LOW;
}
}
// полив горшка номер 3, 12 вольт, полная мощность
void Watering3(){
if(WaterTank() == HIGH && Humid1()== HIGH){
digitalWrite(PUMP12_1, HIGH);
}
else if(WaterTank() == HIGH && Humid1()== LOW){
digitalWrite(PUMP12_1, LOW);
}
}
// режим при отсутствии воды
void loop() {
if(WaterTank()== LOW){
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
}
else if(WaterTank()== HIGH){
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
}
}
Подскажите почему выполняется только то, что в теле void loop, а другой "void" игнорируется? Пробовал менять местами.
Потому, что Вы даже примерно, от слова "совсем", не понимаете, что там написано.
Ваша функция не исполняется потому. что Вы её не вызываете. Вы не задумывались, почему автомобиль никуда не едет, в то время, когда он стоит в гараже на ручнике, а ключ зажигания в кармане у владельца? Вот поэтому же не работает Ваша функция.
Я не спорю, что я не знаю С, поэтому и спрашиваю на форуме помощи в написании примитивного скетча. Можете сказать, в каких строках в данной теме автор называет свои функции? http://arduino.ru/forum/proekty/avtozapusk-pervyi-proekt
Можете сказать, в каких строках в данной теме автор называет свои функции?
Не могу. Я много и с удовольствием трачу время на помощь тем, кто пишет сам. У Вас же свосем другой случай - Вы сами не пишете. А делать работу вместо Вас ... с какого перепугу? У меня и другие занятия есть.
Считаю, что я уже Вам помог - посоветовал правильную книгу. Это реальная помощь. Если Вам такая помощь не нужна и учиться Вы не хотите - дело Ваше, продолжайте побираться по форумам, авось кто и подаст. Или же идите в профильный раздел и заказывайте работу там, кто-нибудь обязательно сделает.
Я не знаю что вы имеете ввиду под фразой "пишет сам". То, что я выкладывал и выкладываю я пишу сам и скажу за каждую строчку, зачем она здесь нужна. Я прошу помощи по синтаксису, как иностранец у носителей языка спршивает зачем нужно то или это. Если бы я знал С, я бы не создавал эту тему.
В первом сообщении я приложил скетч, который не компилировался. Уже потом, своим умом я допер, что "void" не обявляется, обявляются char, short, int, long и т.д. Именно этого я пытался добиться, создавая эту тему, чтобы просто указали пальцем. Это чисто синтаксический вопрос, это просто надо знать как факт. Но вместо этого меня все дружно потролили. Кстати, я начал читать эту книгу тогда, на 31 странице Функции не сказано что функции надо называть или объявлять, к тому же в ардуино есть свои setup и loop, но нет обязательного main как в С, и как их вызывать. На странице 45 Объявления говорится только о типах char, short, int, long и т.д. Не думайте что я не читал. Дальше углубляться не стал, так как непонятно уже на этом этапе.
Если не трудно, посоветуйте на чем запускать примеры из этой книги, чтобы оно работало на XP.
Я сам нашел где автор того скетча вызывает функции. Опять же, ничего сложного, просто объяснить, что следующая за loop функция вызывается в loop и так далее как матрешка.
Именно этого я пытался добиться, создавая эту тему, чтобы просто указали пальцем. Это чисто синтаксический вопрос, это просто надо знать как факт. Но вместо этого меня все дружно потролили.
Представьте: приходите вы в ординаторскую хирургического отделения и говорите: я хочу научиться оперировать, для начала решил соседу гланды удалить. В принципе как махать ножом я знаю, но скальпель в руках не держал еще. Объясните, мол, мне в двух словах как им резать. Это же чисто технический вопрос, ничего сложного быть не может.
Вы же понимаете, что это не корректный пример. Я для себя на своей ардуине со воими моторами и клапанами пишу кривую программу. От ее кривости никто не пострадает, не погибгнет и так далее.
А писать программы для авиации или космоса мне никто не позволит даже если я захочу.
Так что пример с врачеванием не совсем корректный в данном случае. :)
Я не большой специалист по ...."кривым программам". Если у меня получается где-то какая-то кривизна в программе, то это не специально. Так что , посоветовать вам, как написать "кривую программу" я не смогу.
ПС: Я даже разучился писать "типичные ардуиновские программы", а потом ковырять их для поиска в них глюков.
Вы же понимаете, что это не корректный пример. Я для себя на своей ардуине со воими моторами и клапанами пишу кривую программу. От ее кривости никто не пострадает, не погибгнет и так далее.
А писать программы для авиации или космоса мне никто не позволит даже если я захочу.
Так что пример с врачеванием не совсем корректный в данном случае. :)
Сравнение вполне корректное. И смысл его в том, что прежде, чем что-то пытаться сделать, следует сперва чему-то научиться. Даже в том случае, если от Вашего неумения никто не умрет.
Но проблема существует. Примерно она выглядит так: Вам посоветовали книжку, предназначенную не для начинающих, а для программистов, которые уже вледеют, минимум, каким-то одним языком программирования и, главное, - умеют программировать.
Вот это - научиться програмировать - действительно, по описанию языка довольно сложно: для обучения нужен учебник, а не справочник.
Впрочем, некоторые и для обучения обхлдятся справочником - это сложнее, но вполне реально.
Если для Вас этот путь представляется слишком сложным, рекомендую начать с того, чтобы научиться программировать. Лучше всего это сделать по книге Фаронова Turbo Pascal.
andriano, у меня тоже возникло чувство, когда я начал читать ту книгу, что это справочник, а не учебник, но я не рискнул тут высказывать свою мысль ))) Там нет приемов, методов, разжеванных для новичков, и да, она понятна тем, кто уже умеет программировать. А я новичек и не скрывал это. Год назад я даже не знал как выглядит программа в написанном виде.
lean_74, вы не поверите, но именно с этих и еще одних русскоязычных уроков я и начал знакомство с ардуино, еще до того как заказал плату на Али. Но там я не нашел нужного мне по данной теме.
Сегодня изменил скетч. Он скомпилировался и работает на железе как и задумано. Глюков пока не выявил. Теперь думаю как реализовать задержки между поливами и отключения после нескольких попыток подряд, на случай если сорвет трубку и т.п. Если есть конструктивные замечания или советы как оптимизировать нижеизложенную программу, пожалуйста напишите. А так, всем спасибо за помощь и участие.
int Water_pin = 0; // датчик воды
int Humid_pin1 = 10; // датчик влажности 1
int Humid_pin2 = 11; // датчик влажности 2
int Humid_pin3 = 12; // датчик влажности 3
int Humid_pin4 = 13; // датчик влажности 4
int PUMP6_1 = 6; // насос 6 вольт полная мощность
int PUMP6_1_2 = 7; // насос 6 вольт неполная мощность
int PUMP12_1 = 2; // насос 12 вольт полная мощность
int PUMP12_1_2 = 3; // насос 12 вольт неполная мощность
int VALVE_6 = 5; // клапан насоса 6 вольт
int VALVE_12 = 4; // клапан насоса 12 вольт
int RED_LED = 9; // красный светик "нет воды"
int GREEN_LED = 8; // зеленый светик "режим ожидания"
void setup() {
pinMode(Humid_pin1, INPUT);
pinMode(Humid_pin2, INPUT);
pinMode(Humid_pin3, INPUT);
pinMode(Humid_pin4, INPUT);
pinMode(Water_pin, INPUT);
pinMode(PUMP6_1, OUTPUT);
pinMode(PUMP6_1_2, OUTPUT);
pinMode(PUMP12_1, OUTPUT);
pinMode(PUMP12_1_2, OUTPUT);
pinMode(VALVE_6, OUTPUT);
pinMode(VALVE_12, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
}
// проверка уровня воды
bool WaterTank() {
if(analogRead(Water_pin) >= 30){
return HIGH;
}
else{
return LOW;
}
}
// проверка влажности на датчике 1
bool Humid1(){
if(digitalRead(Humid_pin1) == HIGH){
return HIGH;
}
else {
return LOW;
}
}
// проверка влажности на датчике 2
bool Humid2(){
if(digitalRead(Humid_pin2) == HIGH){
return HIGH;
}
else{
return LOW;
}
}
// проверка влажности на датчике 3
bool Humid3(){
if(digitalRead(Humid_pin3) == HIGH){
return HIGH;
}
else{
return LOW;
}
}
// проверка влажности на датчике 4
bool Humid4(){
if(digitalRead(Humid_pin4) == HIGH){
return HIGH;
}
else{
return LOW;
}
}
// режим "нет воды"
void ChekWater(){
if(WaterTank() == HIGH){
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
}
else if(WaterTank() == LOW){
digitalWrite(PUMP6_1, LOW); // принудительная блокировка моторов если нет воды
digitalWrite(PUMP6_1_2, LOW);
digitalWrite(VALVE_6, LOW);
digitalWrite(PUMP12_1_2, LOW);
digitalWrite(VALVE_12, LOW);
digitalWrite(PUMP12_1, LOW); // принудительная блокировка моторов если нет воды
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
}
}
// полив горшка номер 1, 6 вольт, полная мощность
void Watering1(){
if(WaterTank() == HIGH && Humid1()== HIGH){
digitalWrite(PUMP6_1, HIGH);
}
else if(WaterTank() == HIGH && Humid1()== LOW){
digitalWrite(PUMP6_1, LOW);
}
}
// полив горшка номер 2, 6 вольт, неполная мощность, клапан
void Watering2(){
if(WaterTank() == HIGH && Humid2()== HIGH){
digitalWrite(PUMP6_1_2, HIGH);
digitalWrite(VALVE_6, HIGH);
}
else if(WaterTank() == HIGH && Humid2()== LOW){
digitalWrite(PUMP6_1_2, LOW);
digitalWrite(VALVE_6, LOW);
}
}
// полив горшка номер 3, 12 вольт, полная мощность
void Watering3(){
if(WaterTank() == HIGH && Humid3()== HIGH){
digitalWrite(PUMP12_1, HIGH);
}
else if(WaterTank() == HIGH && Humid3()== LOW){
digitalWrite(PUMP12_1, LOW);
}
}
// полив горшка номер 4, 12 вольт, неполная мощность, клапан
void Watering4(){
if(WaterTank() == HIGH && Humid4()== HIGH){
digitalWrite(PUMP12_1_2, HIGH);
digitalWrite(VALVE_12, HIGH);
}
else if(WaterTank() == HIGH && Humid4()== LOW){
digitalWrite(PUMP12_1_2, LOW);
digitalWrite(VALVE_12, LOW);
}
}
void loop() {
{
ChekWater();
Watering1();
Watering2();
Watering3();
Watering4();
}
}
lean_74, вы не поверите, но именно с этих и еще одних русскоязычных уроков я и начал знакомство с ардуино, еще до того как заказал плату на Али. Но там я не нашел нужного мне по данной теме.
Алгоритм простой, четыре датчика влажности, один датчик воды. Два насоса, два клапана. Рассчитано на четыре цветка. По мере высыхания почвы включается насос с\без клапаном и поливает. По достижению влажности отключает. При сигнале от датчика воды, что воды нет, блокировка всего. )
Клапауций как всегда какой-то козырь в рукаве держит. Конструкция с вычитанием работает надежней? Что-то у меня под вечер некоторое завихрение в голове начинается.
По мере высыхания почвы включается насос с\без клапаном и поливает. По достижению влажности отключает. При сигнале от датчика воды, что воды нет, блокировка всего. )
Про гистерезис почитайте, а то будет ваша конструкция беспрестанно зубами клацать и в цветок сикать.
тебя коммунистические перподаватели не учили, что отбирать и делить - всегда надёжней, чем складывать и приумножать?
Мне больше нравится идея следующего плана: если можно чего-то не делать, то полезней так и поступить. А так же держаться на расстоянии невидимости от начальника колхоза, красного командира и политрука.
Вот в том то и прикол, что синтаксис ардуино это как бы не Си, но как бы и Си. И чтобы на ней нормально писать, надо хорошо знать Си, а если ты хорошо знаешь Си, то ты уже серьезный программист. ))) Как-то не вяжется с "конструктором для детей и их родителей" ))))
Вот в том то и прикол, что синтаксис ардуино это как бы не Си, но как бы и Си. И чтобы на ней нормально писать, надо хорошо знать Си, а если ты хорошо знаешь Си, то ты уже серьезный программист. ))) Как-то не вяжется с "конструктором для детей и их родителей" ))))
Вот самый большой парадокс. Смотрят люди глазами, а видят почему-то мозгом. Точнее многие не видят, потому что мозг уже атрофировался. Так и здесь. Для одних Ардуино Мозайка- сложил и МОЛОДЕЦ. А для других это момент исследования мира, а Ардуино просто один из инструментов. Вот где бы вы применили знание языка Си, если бы не занялись Ардуиной.
Лично для меня Ардуино стал единственным входом в программирование, поскольку ты видишь в реальности глазами то, что ты программируешь, и как оно физически работает :)
Ну, блин, набросились. Ну тогда ещё расскажите про ленивую логику и различие в порядке вычисления операндов :)
Порядок вычисления - общеупотребительные грабли, и наступать на них можно регулярно.
Поэтому предпочтительна запись вида
Вот самый большой парадокс. Смотрят люди глазами, а видят почему-то мозгом.
А для выноса этого мозга разработан надёжный высокоэффективный инструмент: язык Си.
bool и boolean
Не помню точно какого, но переменная одного из этих типов может быть неопреденной null, а другого только true и false. В описании Ардуино упоминается только boolean. bool Ардуино унаследовал от языка C, там и ищите описание различий.
В этих Ваших интернетах и не такого напишут. А на деле, открываем файл arduino.h и видим там:
Так, что, как видите, синонимы полные. В языке есть тип bool, но для ардуинщиков доопределили паскалевское ключевое слово. Не знаю, зачем.
SLKH я не о приоритетах операций, а о порядке вычисления операндов.
Вот Вы написали
И что? Что вперёд будет вычисляться? "val >= 341" или "val <= 681"? Беда с этим делом.
Вот в том то и прикол, что синтаксис ардуино это как бы не Си, но как бы и Си.
Вот в этом то и прикол, что у Вас каша в голове. Язык Ардуино, это не "как бы", а чистый, стопроцентный С++ безо всяких "как бы". Понимаете?
Как-то не вяжется с "конструктором для детей и их родителей" ))))
А что такого? Что есть такого в полутора десятках конструкций, чего не может освоить человек, который сумел (хватило мозгов) научиться разговаривать, читать и вытирать попу?
И что? Что вперёд будет вычисляться? "val >= 341" или "val <= 681"? Беда с этим делом.
1-(val >= 341)
2-(val <= 681)
3 &&
А что может быть иначе?
1-(val >= 341)
2-(val <= 681)
3 &&
А что может быть иначе?
Конечно, может. Тут нюансов миллион.
Стандарт языка (раздел 5.14) специально подчёркивает разницу в порядке вычисления операндов между && и &, а также тот факт, что в && (как и в ||) используется (всегда) ленивая логика.
В данном примере порядок вычисления операндов всегда слева направо (а вот в случае & порядок не определён и оставляется на откуп реализации).
А вот с ленивой логикой могут быть сюрпризы. Например п.2 из Вашей росписи может не выполниться вовсе (если в п.1 false получилось). В таком-то виде, как в примере, это без разницы, но у выражения могут же быть и побочные эффекты. Например, если Вы напишете (val++ <= 681), То согласитесь, Вам отнюдь не всё равно выполнится оно или нет.
Ну да . Я пытаюсь избегать таких стремных конструкций. Код должен работать надежно, а потом уже быстро. А то если быстро, но с пиколами, не очень приятно ловить глюки программы.
SLKH я не о приоритетах операций, а о порядке вычисления операндов.
Вот Вы написали
И что? Что вперёд будет вычисляться? "val >= 341" или "val <= 681"? Беда с этим делом.
исполняемый код (в конкретном случае) будет тот же, что и без доп. скобок. компилятору всё равно.
при соотв. препроцессоре - он и на BrainFuck'е накомпилит.
а человеку (особенно начинающему программировать) - не всё равно. вариант с доп. скобками читается понятнее.
Что за BrainFuck тут периодически упоминают?
SLKH, та, нет, ну, конечно же, тут и спорить не о чем, скобки вещь архиполезная, просто том посте, на который Вы отвечали я говорил не об этом, а о порядке вычисления операндов.
Что за BrainFuck тут периодически упоминают?
Язык программирования. Ещё проще, чем С.
И столь же эффективен для постижения дзен.
См. http://arduino.ru/forum/programmirovanie/razrabotka-sketchei-na-yazyke-brainfuck
Что за BrainFuck тут периодически упоминают?
Ну когда-то в глубокой древности, когда калькуляторы были программируемые было что-то подобное https://goo.gl/Dvn9dH
del
Почему-то вариант с val = analogRead(R) у меня не работает. Загорается перый светодиод и ничего не происходит с поворотом потенциометра. Вот скетч, может увидите ошибку
Сегодня написал скетч с реальным датчиком воды и влажности, и тремя светодиодами, которые отображают один из вариантов действий. Скетч полностью рабочий "на железе". Теперь возник вопрос как это офрмить с помощью switch...case. Я попытался, но получилась ерунда и она не работает. Скетч выложу в следующем сообщении
вот мой нерабочий вариант switch...case
Компилятор выдавал предупреждения на ОС ХР, но компилировался. На 10 вообще ничего не выдает и компилируется. Хотя как мы выяснили это еще ни о чем не говорит... :)
Valera19701, спасибо! Теперь все работает. R надо было в цикл занести потому-что на нее постоянно разные данные приходят и ее надо постоянно обновлять?
freeman86, это одинаковые операторы, но для разных типов. Проблема в том, что в С не различаются целые и логический тип, поэтому компилятору надо явно указать, с чем мы хотим работать: с отдельными битами или с логическими выражениями.
Собрал поливалку в виде схемы, теперь программа. И сразу возникла сложность. Сам текст программы ниже. Подскажите почему выполняется только то, что в теле void loop, а другой "void" игнорируется? Пробовал менять местами.
Подскажите почему выполняется только то, что в теле void loop, а другой "void" игнорируется? Пробовал менять местами.
Потому, что Вы даже примерно, от слова "совсем", не понимаете, что там написано.
Ваша функция не исполняется потому. что Вы её не вызываете. Вы не задумывались, почему автомобиль никуда не едет, в то время, когда он стоит в гараже на ручнике, а ключ зажигания в кармане у владельца? Вот поэтому же не работает Ваша функция.
Читать, запускать примеры и разбираться до полного просветвления - http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf
Я не спорю, что я не знаю С, поэтому и спрашиваю на форуме помощи в написании примитивного скетча. Можете сказать, в каких строках в данной теме автор называет свои функции? http://arduino.ru/forum/proekty/avtozapusk-pervyi-proekt
Можете сказать, в каких строках в данной теме автор называет свои функции?
Не могу. Я много и с удовольствием трачу время на помощь тем, кто пишет сам. У Вас же свосем другой случай - Вы сами не пишете. А делать работу вместо Вас ... с какого перепугу? У меня и другие занятия есть.
Считаю, что я уже Вам помог - посоветовал правильную книгу. Это реальная помощь. Если Вам такая помощь не нужна и учиться Вы не хотите - дело Ваше, продолжайте побираться по форумам, авось кто и подаст. Или же идите в профильный раздел и заказывайте работу там, кто-нибудь обязательно сделает.
Я не знаю что вы имеете ввиду под фразой "пишет сам". То, что я выкладывал и выкладываю я пишу сам и скажу за каждую строчку, зачем она здесь нужна. Я прошу помощи по синтаксису, как иностранец у носителей языка спршивает зачем нужно то или это. Если бы я знал С, я бы не создавал эту тему.
В первом сообщении я приложил скетч, который не компилировался. Уже потом, своим умом я допер, что "void" не обявляется, обявляются char, short, int, long и т.д. Именно этого я пытался добиться, создавая эту тему, чтобы просто указали пальцем. Это чисто синтаксический вопрос, это просто надо знать как факт. Но вместо этого меня все дружно потролили. Кстати, я начал читать эту книгу тогда, на 31 странице Функции не сказано что функции надо называть или объявлять, к тому же в ардуино есть свои setup и loop, но нет обязательного main как в С, и как их вызывать. На странице 45 Объявления говорится только о типах char, short, int, long и т.д. Не думайте что я не читал. Дальше углубляться не стал, так как непонятно уже на этом этапе.
Если не трудно, посоветуйте на чем запускать примеры из этой книги, чтобы оно работало на XP.
Я сам нашел где автор того скетча вызывает функции. Опять же, ничего сложного, просто объяснить, что следующая за loop функция вызывается в loop и так далее как матрешка.
что функции надо называть или объявлять, к тому же в ардуино есть свои setup и loop, но нет обязательного main как в С, и как их вызывать.
Есть, но уже объявленная за вас. Находится тут: C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp
Если не трудно, посоветуйте на чем запускать примеры из этой книги, чтобы оно работало на XP.
https://codelite.org/
Представьте: приходите вы в ординаторскую хирургического отделения и говорите: я хочу научиться оперировать, для начала решил соседу гланды удалить. В принципе как махать ножом я знаю, но скальпель в руках не держал еще. Объясните, мол, мне в двух словах как им резать. Это же чисто технический вопрос, ничего сложного быть не может.
Какую реакцию ожидаете получить?
Вы же понимаете, что это не корректный пример. Я для себя на своей ардуине со воими моторами и клапанами пишу кривую программу. От ее кривости никто не пострадает, не погибгнет и так далее.
А писать программы для авиации или космоса мне никто не позволит даже если я захочу.
Так что пример с врачеванием не совсем корректный в данном случае. :)
Я не большой специалист по ...."кривым программам". Если у меня получается где-то какая-то кривизна в программе, то это не специально. Так что , посоветовать вам, как написать "кривую программу" я не смогу.
ПС: Я даже разучился писать "типичные ардуиновские программы", а потом ковырять их для поиска в них глюков.
Вы же понимаете, что это не корректный пример. Я для себя на своей ардуине со воими моторами и клапанами пишу кривую программу. От ее кривости никто не пострадает, не погибгнет и так далее.
А писать программы для авиации или космоса мне никто не позволит даже если я захочу.
Так что пример с врачеванием не совсем корректный в данном случае. :)
Сравнение вполне корректное. И смысл его в том, что прежде, чем что-то пытаться сделать, следует сперва чему-то научиться. Даже в том случае, если от Вашего неумения никто не умрет.
Но проблема существует. Примерно она выглядит так: Вам посоветовали книжку, предназначенную не для начинающих, а для программистов, которые уже вледеют, минимум, каким-то одним языком программирования и, главное, - умеют программировать.
Вот это - научиться програмировать - действительно, по описанию языка довольно сложно: для обучения нужен учебник, а не справочник.
Впрочем, некоторые и для обучения обхлдятся справочником - это сложнее, но вполне реально.
Если для Вас этот путь представляется слишком сложным, рекомендую начать с того, чтобы научиться программировать. Лучше всего это сделать по книге Фаронова Turbo Pascal.
Я для себя на своей ардуине со воими моторами и клапанами пишу кривую программу. От ее кривости никто не пострадает, не погибгнет и так далее.
Окей, вот вам фраза:
"Неделю назад купил ардуину, уже освоил светодиод и пощелкал релюшкой, правда не совсем понял, что такое >>. Теперь я на своей ардуине..."
Выберите опасный вариант ее окончания:
- для себя делаю управление поворотниками на свой автомобиль;
- для своей бабушки делаю аппарат по выдаче таблеток;
- для себя делаю управление своим газовым котлом.
сейчас даже читать не особо нужно, хотя бы видео посмотреть и повторить, что там делают начиная с этого https://www.youtube.com/watch?v=bO_jN0Lpz3Q
потом уже умные книжки Уважаемого ЕвгениемП можно почитать и все получиться.
andriano, у меня тоже возникло чувство, когда я начал читать ту книгу, что это справочник, а не учебник, но я не рискнул тут высказывать свою мысль ))) Там нет приемов, методов, разжеванных для новичков, и да, она понятна тем, кто уже умеет программировать. А я новичек и не скрывал это. Год назад я даже не знал как выглядит программа в написанном виде.
lean_74, вы не поверите, но именно с этих и еще одних русскоязычных уроков я и начал знакомство с ардуино, еще до того как заказал плату на Али. Но там я не нашел нужного мне по данной теме.
Сегодня изменил скетч. Он скомпилировался и работает на железе как и задумано. Глюков пока не выявил. Теперь думаю как реализовать задержки между поливами и отключения после нескольких попыток подряд, на случай если сорвет трубку и т.п. Если есть конструктивные замечания или советы как оптимизировать нижеизложенную программу, пожалуйста напишите. А так, всем спасибо за помощь и участие.
lean_74, вы не поверите, но именно с этих и еще одних русскоязычных уроков я и начал знакомство с ардуино, еще до того как заказал плату на Али. Но там я не нашел нужного мне по данной теме.
с этого нужно было начинать http://make.kosakalab.com/arduino/obaka/project-5/index_en.html
Естественно - переписать нужно все похожие функции.
По логике работы не скажу - алгоритм только у вас в голове существует.
Спасибо!
Алгоритм простой, четыре датчика влажности, один датчик воды. Два насоса, два клапана. Рассчитано на четыре цветка. По мере высыхания почвы включается насос с\без клапаном и поливает. По достижению влажности отключает. При сигнале от датчика воды, что воды нет, блокировка всего. )
Господи, я с таким кодом даже сам затупил. Вот так же надо:
if
(HIGH -
WaterTank() == 0) {Если в Танке нет воды...
Клапауций как всегда какой-то козырь в рукаве держит. Конструкция с вычитанием работает надежней? Что-то у меня под вечер некоторое завихрение в голове начинается.
Про гистерезис почитайте, а то будет ваша конструкция беспрестанно зубами клацать и в цветок сикать.
Конструкция с вычитанием работает надежней?
сколько у тебя по математике в школе было?
тебя коммунистические перподаватели не учили, что отбирать и делить - всегда надёжней, чем складывать и приумножать?
Если в Танке нет воды...
Неужели и здесь приложились?
сколько у тебя по математике в школе было?
А сколько нужно?
Мне больше нравится идея следующего плана: если можно чего-то не делать, то полезней так и поступить. А так же держаться на расстоянии невидимости от начальника колхоза, красного командира и политрука.
Hydroponical honey? ))