Мои выходы не выдают ток только в двух моих контактных режимах, но в остальных работают нормально.

Мои выводы 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);
}

, 👍0

Обсуждение

Итак, вы уверены, что части кода, в которых выполняется 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


1 ответ


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