Не пойму как сделать..

CADAS
Offline
Зарегистрирован: 30.05.2016

А вот оставив 1 и 2 но поправив switch(val - '0')-- компилируется.

И оставив как есть, то есть 1 и 2 ,switch (val)-- тоже компилируется.

CADAS
Offline
Зарегистрирован: 30.05.2016

CADAS пишет:

CADAS пишет:

fogary пишет:

nevkon пишет:

switch (val)
{
  case 1: {} break; //в скобках пишем код для выполнения
  case 2: {} break;
  default: break;
}

В данном случае, вместо 1 и 2 нужно писать '1' и '2', а то условие не когда не совпадет. Потому что переменная val содержит символ цифры, а не цифру. Если хотите оставить как есть, поправте строку: switch(val - '0').

Спасибо за подсказку. Все поправил. 

поправил 1 на "1" и 2 на "2". Не компилируется. выделяется срока с case "2"

invalid conversion from 'const char*' to 'int' [-fpermissive]

Вот я лашара..перепутал хер с дверной ручкой. " c '  //простите..

nevkon
Offline
Зарегистрирован: 20.01.2015

Кавычки одинарные или двойные? Это тоже имеет значение.

CADAS
Offline
Зарегистрирован: 30.05.2016

nevkon пишет:

Кавычки одинарные или двойные? Это тоже имеет значение.

Теперь уже понял. А какова раздница между кавычками?

nevkon
Offline
Зарегистрирован: 20.01.2015

В классической реализации C++ символьная константа заключается в одинарные кавычки ('), а строка в двойные ("). 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
CADAS
Offline
Зарегистрирован: 30.05.2016

как-то так.

Хочу, чтобы в сериал выводилось слово "GOOD!!!" после получения 1.

Я правильно дописал код?

char val = '0';
#define LED 13
   
void setup()
{
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);
}

void loop()
{
  if (Serial.available())
  {
    val = Serial.read();
  }

  switch (val)
{
  case '1': {} Serial.println("GOOD!!!"); break; //в скобках пишем код для выполнения
  case '2': {} break;
  default: break;
}
  }

 

CADAS
Offline
Зарегистрирован: 30.05.2016

Все предельно ясно. Спасибо!!!

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

CADAS пишет:

Я правильно дописал код?

  case '1': {} Serial.println("GOOD!!!"); break; //в скобках пишем код для выполнения

//в скобках пишем код для выполнения !!!!!!!!!!!!!!!!!

nevkon
Offline
Зарегистрирован: 20.01.2015

Так :):


char val = '0';
#define LED 13
   
void setup()
{
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);
}

void loop()
{
  if (Serial.available())
  {
    val = Serial.read();
  }

  switch (val)
{
  case '1':
  {
    digitalWrite(LED, HIGH);
    delay(1000);
    digitalWrite(LED, LOW);
    delay(1000);
    Serial.println("GOOD!!!");
   } 
   break; 

  case '2': {} break;
  default: break;
}
  }

 

nevkon
Offline
Зарегистрирован: 20.01.2015

В том что во втором случае принудительно указываете тип данных, например будет отправка строки, а не числа, хотя это и грубое приближение:

Serial.println((String) 123); break;

CADAS
Offline
Зарегистрирован: 30.05.2016

nevkon пишет:

В том что во втором случае принудительно указываете тип данных, например будет отправка строки, а не числа, хотя это и грубое приближение:

Serial.println((String) 123); break;

Закрепил. Благодарю.

nevkon
Offline
Зарегистрирован: 20.01.2015

Выполнится, но в этом случае вам не нужно гадать где же заканчивается условие поскольку сделана наглядная структура. Очень полезно если программу например разрабатывает несколько человек. Да и вам проще будет прочитать через год-два если исправить что-либо придется.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

А зачем там после case вообще скобки? Можно же без них.

nevkon
Offline
Зарегистрирован: 20.01.2015

Можно. Просто у каждого может быть свой взгляд на читабельность кода.

CADAS
Offline
Зарегистрирован: 30.05.2016

nevkon пишет:

Выполнится, но в этом случае вам не нужно гадать где же заканчивается условие поскольку сделана наглядная структура. Очень полезно если программу например разрабатывает несколько человек. Да и вам проще будет прочитать через год-два если исправить что-либо придется.

Возможно Вы и правы!!!!

CADAS
Offline
Зарегистрирован: 30.05.2016

Всем привет!!!

Назрел очередной вопрос. 

Вот код

int val;
int RELAY1 = 8;
int RELAY2 = 9;

void setup()

{
  Serial.begin(9600);
  pinMode(RELAY1, OUTPUT);
  digitalWrite(RELAY1, HIGH);
  pinMode(RELAY2, OUTPUT);
  digitalWrite(RELAY2, HIGH);
}
void loop()
{
  if (Serial.available())
  {
    val = Serial.read();

    
    if (val == '1')// При символе "1" включаем реле 1
    {
      digitalWrite(RELAY1, LOW);
    }

    
    if ( val == '0')// При символе "0" выключаем реле 1
    {
      digitalWrite(RELAY1, HIGH);
    }
if (val == '2')// При символе "2" включаем реле 2
    {
      digitalWrite(RELAY2, LOW);
    }

    
    if ( val == '3')// При символе "3" выключаем реле 2
    {
      digitalWrite(RELAY2, HIGH);
    }
  }
}

Сделано было для управления реле по блюпуп.

посла 1-вкл первое реле

послал 0- выкл первое.

Но мне нужно послать код кнопки например (0x65 0x01 0x02 0x00 0xff 0xff 0xff). Понимаю, что это уже не символ '1', но ни как не могу понять, в какую сторону копать? 

За ранее благодарен.

nevkon
Offline
Зарегистрирован: 20.01.2015

Внутри лупа нужно сделать переменную куда будет собираться код. Делается не условие доступности данных в сериал, а цикл. Читаем что пришло по сериал в созданную переменную. После цикла анализируем что в переменной.

CADAS
Offline
Зарегистрирован: 30.05.2016

nevkon пишет:

Внутри лупа нужно сделать переменную куда будет собираться код. Делается не условие доступности данных в сериал, а цикл. Читаем что пришло по сериал в созданную переменную. После цикла анализируем что в переменной.

Спасибо!!!

Буду искать инфу..

CADAS
Offline
Зарегистрирован: 30.05.2016

Победил!!!

Не стал заморачиваться с циклом. Использовал как пример библиотеку NEXTION (забыл написать вначале вопроса, что хоч прикрутить экран NEXTION).

Допилил под себя.

Два реле, четыре кнопки.

Может кому сгодиться ( такому как я бестолковому програмеру).

#include <SoftwareSerial.h>
#include <Nextion.h>

SoftwareSerial nextion(2, 3);// Nextion TX к контакту 2 и RX к контакту 3 из Arduino

Nextion myNextion(nextion, 9600); //создаем объект с именем myNextion с использованием последовательного порта nextion @ 9600 бит в секунду

boolean button1State;
boolean button2State;
boolean button3State;
boolean button4State;
int RELAY1 = 8;
int RELAY2 = 9;

void setup() 
{
Serial.begin(9600);
pinMode(RELAY1, OUTPUT);
digitalWrite(RELAY1, HIGH);
pinMode(RELAY2, OUTPUT);
digitalWrite(RELAY2, HIGH);
}

void loop()
{
String message = myNextion.listen(); //проверяем сообщение
if (message == "65 0 3 1 ffff ffff ffff") //  если пришло сообщение (в кавычках пишем код кнопки)
{
myNextion.buttonToggle(button1State, "b0", 0, 2);
digitalWrite(RELAY1,LOW); // Включаем реле 1 
}
if (message == "65 0 2 1 ffff ffff ffff") //  если пришло сообщение  (в кавычках пишем код кнопки)
{
myNextion.buttonToggle(button2State, "b1", 0, 2);
digitalWrite(RELAY1, HIGH);// Выключаем реле 1
}
if (message == "65 0 4 1 ffff ffff ffff") //  если пришло сообщение (в кавычках пишем код кнопки)
{
myNextion.buttonToggle(button3State, "b2", 0, 2);
digitalWrite(RELAY1,LOW); // Включаем реле 2 
}
if (message == "65 0 5 1 ffff ffff ffff") //  если пришло сообщение  (в кавычках пишем код кнопки)
{
myNextion.buttonToggle(button4State, "b3", 0, 2);
digitalWrite(RELAY1, HIGH);// Выключаем реле 2
}

}

 

CADAS
Offline
Зарегистрирован: 30.05.2016

Назрел вопрос.

Хочется в коде (выше) уйти от if и использовать switch.

что-то не получается ни чего. Запутался.

CADAS
Offline
Зарегистрирован: 30.05.2016

С реле так и не понял, а вот с выводом текста вроде понял.

Было

delay(2000);// даем датчику DHT22 время ожить. 2 секунд достаточно!!!
int t = sens.readTemperature(5); // чтение температуры с датчика на пине 5 ( создаем переменную (t) в которую пишем температуру)
int h = sens.readHumidity(5);    // чтение влажности с датчика на пине 5 ( создаем переменную (h) в которую пишем влажность)
myNextion.setComponentText("t0", String(t));// выводим в текстовое поле "t0" на экране Nextion данные из переменной "t", в нашем случае данные температуры
myNextion.setComponentText("t1", String(h));// выводим в текстовое поле "t1" на экране Nextion данные из переменной "h", в нашем случае данные влажности
delay(120000);// обновляем данные через каждые 120 секунд (две минуты)!!!
if (t >=25)// если температура равно или больше 25 градусов
{
myNextion.setComponentText("t2", "Жарко");// пишем в текстовое поле "t2" на экране Nextion слово "Жарко"
}
else if (t ==18)// если температура равно 18 градусов
{
myNextion.setComponentText("t2", "Оптимально");// пишем в текстовое поле "t2" на экране Nextion слово "Оптимально" 
}
else if (t ==10)// если температура равно 10 градусов
{
myNextion.setComponentText("t2", "Прохладно");// пишем в текстовое поле "t2" на экране Nextion слово "Прохладно" 
}
else if (t <=0)// если температура равно или меньше 0 градусов
{
myNextion.setComponentText("t2", "Холодно");//пишем в текстовое поле "t2" на экране Nextion слово "Холодно"   
}

Стало так

delay(2000);// даем датчику DHT22 время ожить. 2 секунд достаточно!!!
int t = sens.readTemperature(5); // чтение температуры с датчика на пине 5 ( создаем переменную (t) в которую пишем температуру)
int h = sens.readHumidity(5);    // чтение влажности с датчика на пине 5 ( создаем переменную (h) в которую пишем влажность)
myNextion.setComponentText("t0", String(t));// выводим в текстовое поле "t0" на экране Nextion данные из переменной "t", в нашем случае данные температуры
myNextion.setComponentText("t1", String(h));// выводим в текстовое поле "t1" на экране Nextion данные из переменной "h", в нашем случае данные влажности
delay(120000);// обновляем данные через каждые 120 секунд (две минуты)!!!
int var = t;
switch (var) 
{
case '>=25':// если темпераура больше или равна 25 градусов
myNextion.setComponentText("t2", "Жарко"); // пишем в текстовое поле "t2" на экране Nextion слово "Жарко"
break;
case '==18':// если температура равна 18 градусов
myNextion.setComponentText("t2", "Оптимально"); // пишем в текстовое поле "t2" на экране Nextion слово "Оптимально"
break;
case '==10':
myNextion.setComponentText("t2", "Прохладно");// пишем в текстовое поле "t2" на экране Nextion слово "Прохладно"
break;
case '<=0':// если температура меньше или равно 0 градусов
myNextion.setComponentText("t2", "Холодно");//пишем в текстовое поле "t2" на экране Nextion слово "Холодно" 
break;
}

Я правильно делаю?

nevkon
Offline
Зарегистрирован: 20.01.2015

Не уверен что case умеет работать с интервалами, знающие подскажут. Вроде как case заменяет == и не нужно писать в кавычках.

Кстати а что будет если температура вдруг будет 11 градусов, то какой результат вы получите? Ваши условия не совсем корректны, нужно все проверять интервалами. И в этом случае от case придется отказаться (или забить все возможные варианты).

CADAS
Offline
Зарегистрирован: 30.05.2016

Спасибо! Насчет дописать все варианты- я думал. Это как бы пробный вариант.

Про кавычки- а как показать что мне нужно >=25? Без кавычек не принимает. Просто 25 - да, а вот с условием- нет.

nevkon
Offline
Зарегистрирован: 20.01.2015

switch var case a; case b;

читаем так:

переменная var == a; == b;

Знак сравнения ставится автоматом и как изменить его я уже не подскажу.

CADAS
Offline
Зарегистрирован: 30.05.2016

А как можно показать например такое условие- от 18 до 25 ?

nevkon
Offline
Зарегистрирован: 20.01.2015

if ((var>=18)&&(var<25)) {}

CADAS
Offline
Зарегистрирован: 30.05.2016

возращаемся к if?

nevkon
Offline
Зарегистрирован: 20.01.2015

Только делайте условия не пересекающимися.

Например

if ((var>=18)&&(var<25)) {}

if (var>=25) {}

будет правильнее чем если вы напишите

if ((var>=18)&&(var<=25)) {}

if (var>=25) {}

По case с интервалами не подскажу, сам не знаю.

CADAS
Offline
Зарегистрирован: 30.05.2016

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

kite
Offline
Зарегистрирован: 05.09.2016

Думаю, лучше оставить с if. Что делать контроллеру, когда t в диапазонах 1..9 градусов, 11-17, 19-24?

Не факт, что в обработку программы попадет значение 0 или 10 или 18 или 25. Вот в случае быстрого снижения температуры и достижении -1 градус при предыдущем значении +1, т.е. 0 не успел измериться датчиком и попасть в программу? А у вас строгое условие "case 0". Переключение на "холодно" не произойдет. Даже при -15 останется значение "прохладно". Если "очень" повезет, может быть даже "жарко"  

Определить диапазоны можно, например, так:

t>=25  "жарко", t < 25 и t>=15 "оптимально",   t > 0 и t<15 "прохладно" , t <= 0 "холодно"

if ( t>=25 )          {myNextion.setComponentText("t2", "Жарко");};

if ( t>=15 && t<25 )  {myNextion.setComponentText("t2", "Оптимально");};

if ( t>0 && t<15 )    {myNextion.setComponentText("t2", "Прохладно");};

if ( t<= 0 )          {myNextion.setComponentText("t2", "Холодно");};

А для того, чтобы зря не посылать команды в myNextion, если состояние не  меняется, можно добавить переменную, которая будет содержать в себе состояние на момент предыдущего замера.

String prevState=""  //объявить до блока setup(). Можно не String, а byte

//-----------------------------------------------------------------------
//в loop()

if ( t>=25 && prevState!="hot" )          {myNextion.setComponentText("t2", "Жарко");prevState="hot"; };
if ( t>=15 && t<25 && prevState!="optim" )  {myNextion.setComponentText("t2", "Оптимально");prevState="optim"};
if ( t>0 && t<15 && prevState!="cold" )    {myNextion.setComponentText("t2", "Прохладно"); prevState="cold";};
if ( t<= 0 && prevState!="veryCold"  )          {myNextion.setComponentText("t2", "Холодно");prevState="veryCold" };

 

 

 

CADAS
Offline
Зарегистрирован: 30.05.2016

Вот спасибо! Все разжевали.
Начало прояснятся.
Я так и знал, что на форуме есть адекватные люди.
А то сразу начинают пинать сапогами в живот- читай книжку, из тебя не плучиться нормальный програмер, выкин дуину с балкона, и т.д и т.п

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Ну так пинают лентяев и хамов.  А тем, кто прилагает усилия, изучает, здесь помогают. Даже сам Клапауций- местный троль и тот иногда помогает.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Зачем ты назвал его имя, он сейчас появится....

CADAS
Offline
Зарегистрирован: 30.05.2016

Все собрал в кучу, работает. Спасибо за подсказки и помощь.

единственоое НО- слишком много (;). Чуток лишнее.

Может специально? Замечу или нет? :-)

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

давай код, будем оптимизировать

kite
Offline
Зарегистрирован: 05.09.2016

Нет, просто перестарался.

CADAS
Offline
Зарегистрирован: 30.05.2016

Mr.Privet пишет:

давай код, будем оптимизировать

Вечером, если до компьютера доберусь.

CADAS
Offline
Зарегистрирован: 30.05.2016

kite пишет:

Нет, просто перестарался.

Я так и понял. 

С моей стороны- это была шутка.

Вопрос. А какая разница ? И как бы выглядело (String prevState="") с byte ( не компилируется)?

Можно не String, а byte
 
 

 

CADAS
Offline
Зарегистрирован: 30.05.2016

Хочу еще прикрутить BMP180. Библиотек куча, аж голова кругом.

Остановился на одной.

Вот скетч

#include <Wire.h>
#include <BMP180.h>
BMP180	sensor;

void setup() 
{
	Serial.begin(9600);
	delay(1000);
	sensor.begin();
}
void loop() 
{
	if(sensor.read())
{
  Serial.println((String)"CEHCOP BMP180: P="+sensor.pres+" MM.PT.CT - T="+sensor.temp+" *C - B="+sensor.alti+" M.");
 }
	else			
{
  Serial.println(	"CEHCOP BMP180: HET OTBETA");
}
	delay(3000);
}

// в библиотеке доступны всего две функции:
// sensor.begin();	ИНИЦИАЛИЗАЦИЯ СЕНСОРА (функция проверяет наличие сенсора и читает из него калибровочные коэффициенты для расчетов)
// sensor.begin(160);	функция может принимать параметр float начальная высота, например над уровнем моря (по умолчанию = 0)
//			функцию достаточно вызвать 1 раз, но не ранее чем через 10мс после подачи напряжения питания на BMP180
// sensor.read();	ЧТЕНИЕ ПАРАМЕТРОВ СЕНСОРА (функция читает данные сенсора и пересчитывает их в соответствии с калибровочными коэффициентами)
// sensor.read(0);	функция может принимать параметр 0 , 1 , 2 или 3 , по умолчанию 3 (точность расчетов 0-минимальная ... 3-максимальная), чем меньше точность, тем быстрее происходит обработка и чтение параметров
//			функция возвращает true или false в зависимости от реакции сенсора. Так же возвращает false если ни разу не вызывалась функция sensor.begin();
// результаты хранятся в следующих переменных:
// sensor.pres		float - давление в мм.рт.ст.
// sensor.temp		float - температура в *С
// sensor.alti		float - высота относительно начальной (например над уровнем моря)

Вот и сам вопрос. Чтобы корректно показывало давление, нужно настроить датчик( указать реальную высоту над УРМ).

В скетче об этом написано внизу в подсказке, сторока sensor.begin(160); Я так понял нужно вписать свою высоту в библиотеке. Это файл с расширением .сср? Если да, то я там нашел void BMP180::begin(float Altitude)- это оно? То есть нужно изменить float на мою высоту в метрах?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Navigator пишет:

Даже сам Клапауций- местный троль и тот иногда помогает.

ок. и, кому я и когда не помог? - где эти, обделённые моим вниманием несчастные.

CADAS
Offline
Зарегистрирован: 30.05.2016

Клапауций 232 пишет:

Navigator пишет:

Даже сам Клапауций- местный троль и тот иногда помогает.

ок. и, кому я и когда не помог? - где эти, обделённые моим вниманием несчастные.

Великий и могучий!!! 

Склоняю голову.

CADAS
Offline
Зарегистрирован: 30.05.2016

Нашел!!!( кто ищет, тому воздастся). Я ошибался в соих предположениях. Файл с расширением (h).

Все ответы на свой вопрос нашел там.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

файл .h это сама библиотека, но туда можно и не лазить, а просто при "старте" датчика вместо по умолчанию как в примере строка 09 sensor.begin(); написать в скобках свою высоту.

CADAS
Offline
Зарегистрирован: 30.05.2016

Блин...А ведь так и предпологал сразу.
Но мы то не ищем легких путей.
Как бы датчик только в пути. С него буду брать только давление.
Еще не пытался вживить в (свой) код. Так...просто на бущее

kite
Offline
Зарегистрирован: 05.09.2016
#define hot 1
#define optim 2
#define cold 3
#define veryCold 4
byte prevState=0;
//далее то же, только без кавычек

CADAS пишет:

kite пишет:

Нет, просто перестарался.

Я так и понял. 

С моей стороны- это была шутка.

Вопрос. А какая разница ? И как бы выглядело (String prevState="") с byte ( не компилируется)?

Можно не String, а byte
 
 

 

gulin176
Offline
Зарегистрирован: 03.09.2016

Подскажите пожалуйста. Пытаюсь облагородить вывод минут на экран, чтобы не было так 16:9, а надо 16:09

новичёк я не смейтесь над кодом, но получается какая то хрень

lcd.print(dt.minute);
  if (dt.minute >= 0 && dt.minute < 10)
    lcd.setCursor(11, 1);
  lcd.print(0);
  lcd.setCursor(12, 1);
  lcd.print(dt.minute);
  if (dt.minute < 10)
    lcd.setCursor(11, 1);
  lcd.print(dt.minute);
  delay(5000);

что не правильно

kite
Offline
Зарегистрирован: 05.09.2016

Ну если не вникать в DT (не пользовался никогда) , то в строке 7 поменяйте "<" на ">".

gulin176
Offline
Зарегистрирован: 03.09.2016

попробовал поменять код

lcd.print(dt.hour);
  lcd.print(":");
  if (dt.minute > 10)
  lcd.print(dt.minute);
  if (dt.minute >= 0 && dt.minute < 10)
  lcd.setCursor(11, 1);
  lcd.print(0);
  lcd.setCursor(12, 1);
  lcd.print(dt.minute);
  delay(5000);

теперь выводит время как 20:118

kite
Offline
Зарегистрирован: 05.09.2016

Добавьте фигурные скобки для второго if.