Мои выходы не выдают ток только в двух моих контактных режимах, но в остальных работают нормально.
Мои выводы pinMode 5 и 6 не работают с этим кодом, но будут работать, когда они автономны.
Что заставляет Arduino ничего не выводить с этих выходов в моем коде?
#include <SoftwareSerial.h> // используем последовательную библиотеку программного обеспечения
SoftwareSerial mySerial(3,4); // получаем данные на контакте 3; передать данные на контакт 2
int setpoint;
float val;
int roomtemp;
int UCL;
int LCL;
float salinity;
void setup()
{
// поместите сюда свой код установки для однократного запуска:
Serial.begin(9600);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(3,OUTPUT);
pinMode(2, OUTPUT);
roomtemp=25;
setpoint=7.0291*roomtemp+334.73;
UCL=setpoint+6.12;
LCL=setpoint-6.12;
Serial.print("Setpoint =");
Serial.print(setpoint);
Serial.print("Degrees Celsius");
Serial.print("UCL =");
Serial.print(UCL);
Serial.print("Degrees Celsius");
Serial.print("LCL =");
Serial.print(LCL);
Serial.print("Degrees Celsius");
mySerial.begin(9600);
delay(500); // устанавливаем скорость передачи данных 9600 бод; дождаться загрузки
mySerial.write(254);
mySerial.write(128);
mySerial.write(254);
mySerial.write(1); // очистить экран & перейти в верхнее левое положение
mySerial.write(254);
mySerial.write(132);
mySerial.print("LCL");
mySerial.write(254);
mySerial.write(139);
mySerial.print("SP");
mySerial.write(254);
mySerial.write(144);
mySerial.print("UCL");
mySerial.write(254);
mySerial.write(192);
mySerial.print("S:");
mySerial.write(254);
mySerial.write(195);
mySerial.print(0.072,3);
mySerial.write(254);
mySerial.write(201);
mySerial.print(0.100,3);
mySerial.write(254);
mySerial.write(207);
mySerial.print(0.108,3);
mySerial.write(254);
mySerial.write(148);
mySerial.print("T:");
mySerial.write(254);
mySerial.write(152);
mySerial.print("24.1");
mySerial.write(254);
mySerial.write(158);
mySerial.print("25.0");
mySerial.write(254);
mySerial.write(164);
mySerial.print("25.9");
mySerial.write(254);
mySerial.write(212);
mySerial.write(254);
mySerial.write(212);
mySerial.print("S=");
mySerial.write(254);
mySerial.write(220);
mySerial.print("T=");
}
void loop()
{
Serial.println();
int val=analogRead(5);
Serial.print("Analog Value =");
Serial.print(val);
Serial.print("Temperature =");
Serial.println((0.14227*val)-47.621);
if(val<LCL) { digitalWrite(3,HIGH); }
else if(val>UCL) { digitalWrite(3,LOW); }
mySerial.write(254);
mySerial.write(227);
if(val<LCL) { mySerial.write("H= ON"); }
mySerial.write(254);
mySerial.write(227);
if(val>UCL) { mySerial.write("H=OFF"); }
digitalWrite(2, HIGH);
delay(100);
int analogS=analogRead(4);
digitalWrite(2, LOW);
Serial.println(analogS);
delay(1000);
salinity = 2.0955*pow(10,-19)*pow(analogS,5.8106)*100.000;
Serial.print("Salinity =");
Serial.println(salinity);
mySerial.write(254);
mySerial.write(214);
mySerial.print(salinity);
mySerial.write(254);
mySerial.write(222);
mySerial.print((0.14227*val)-47.621,1);
Serial.println("analog value");
Serial.print(analogRead(4));
float target= (salinity-(salinity-.1)*.60);
float numer=((((target)*.08585-(salinity)*.08585)/(.1-(.1*.15+salinity*.85)))*60.0);
float denom= ((.1));
float valve= ((numer/denom)/10.00);
if(.096<salinity>.104) {
delay(5000);
}
if(salinity>.104) {
Serial.print("Entering DIon Function");
digitalWrite(6,HIGH);
delay(valve);
digitalWrite(6,LOW);
delay(5000);
}
if(salinity<.096) {
Serial.print("Entering Saltyon Function");
digitalWrite(5,HIGH);
delay(valve);
digitalWrite(5,LOW);
delay(5000);
}
Serial.print("time");
Serial.println(valve);
}
@Thomas Love, 👍0
Обсуждение1 ответ
Я думаю, проблема не в выходном контакте (который, как вы говорите, работает в других местах), а в ваших вычислениях. Я сделал минимальный, полный и проверяемый пример части кода, которая выполняет вычисления, проверяя все возможные показания, которые вы могли получить от analogRead(4)
(в основном потому, что я нашел код вычислений довольно непонятным). Вот он:
float salinity;
void setup()
{
Serial.begin(9600);
}
void loop()
{
for (int analogS=0; analogS < 1024; analogS++)
{
Serial.print ("analogS = ");
Serial.print (analogS);
salinity = 2.0955*pow(10,-19)*pow(analogS,5.8106)*100.000;
Serial.print (", Salinity = ");
Serial.print (salinity);
float target= (salinity-(salinity-.1)*.60);
float numer=((((target)*.08585-(salinity)*.08585)/(.1-(.1*.15+salinity*.85)))*60.0);
float denom= ((.1));
float valve= ((numer/denom)/10.00);
Serial.print(", valve = ");
Serial.println(valve);
}
Serial.flush ();
exit (1);
}
Тестирование, которое выявляет:
analogS = 0, Salinity = 0.00, valve = 3.64
analogS = 1, Salinity = 0.00, valve = 3.64
analogS = 2, Salinity = 0.00, valve = 3.64
analogS = 3, Salinity = 0.00, valve = 3.64
... some lines omitted ...
analogS = 1016, Salinity = 6.21, valve = 3.64
analogS = 1017, Salinity = 6.25, valve = 3.64
analogS = 1018, Salinity = 6.28, valve = 3.64
analogS = 1019, Salinity = 6.32, valve = 3.64
analogS = 1020, Salinity = 6.35, valve = 3.64
analogS = 1021, Salinity = 6.39, valve = 3.64
analogS = 1022, Salinity = 6.43, valve = 3.64
analogS = 1023, Salinity = 6.46, valve = 3.64
Как видите, valve
всегда равен 3,64, поэтому вам нужно сделать следующее:
digitalWrite(6,HIGH);
delay(3);
digitalWrite(6,LOW);
Другими словами, порт 6 будет иметь ВЫСОКИЙ уровень в течение 3 миллисекунд, вероятно, слишком короткое время, чтобы вы это заметили. То же самое и для порта 5.
Кроме того, это не делает того, что, как я подозреваю, вы думаете:
if(.096<salinity>.104) {
delay(5000);
}
Это оценит .096 < соленость
как 0 или 1. Затем он оценит:
0 > 0.104
1 > 0.104
Я думаю, это не то, что вы имели в виду. Попробуйте:
if(salinity < .096 || salinity > .104) {
delay(5000);
}
Если вы это имеете в виду, то я не уверен — возможно, вы имеете в виду обратное:
if(salinity > .096 && salinity < .104) {
delay(5000);
}
Если вы все распишете ясно, не пытаясь сокращать, будет гораздо очевиднее, в чем на самом деле заключается тест.
Думаю, что раньше так работал и Cobol, но он довольно старый. :), @Nick Gammon
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Объяснение кода MPU6050
- Как я могу прервать задержку() при нажатии кнопки?
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Как установить управляющий регистр в модуле RTC DS3231 для Arduino UNO R3?
- Как повторить другое действие внутри цикла?
- Клиент веб-сокета Arduino CC3000
Итак, вы уверены, что части кода, в которых выполняется
digitalWrite
с 5 или 6 выводом, но вы не видите изменения значений выводов? Можете ли вы также распечатать значениеvalve
или добавить больше задержки после установки его в HIGH?, @Maximilian GerhardtА что выводится на последовательный монитор?, @gre_gor
@Juraj
analogRead(5)
выбирает тот же вывод АЦП, что иanalogRead(A5)
, что то же самое, что иanalogRead(19)
. (ДажеanalogRead(13)
будет работать). Так как он [вычтет 14, если значение больше или равно 14](https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/wiring_analog.c#L54), и будет использовать только младшие 3 бита., @Gerben@Gerben, да, я вспомнил и удалил комментарий (как-то неправильно, потому что он все еще там :-) ), @Juraj