pH код Arduino SEN0169 отказывается выводить
Всем доброго дня!
Я делаю свой исследовательский проект гидропонным датчиком, который собирает температуру воздуха и воды, влажность, проводимость и рН, а затем отправляет его через GSM-модуль sim900a. Однако при тестировании pH-часть кода не работает. Когда я удалил часть кода, который собирает pH, устройство работало так, как и было задумано. Я получил код с сайта производителя, но я не уверен, что изменить, чтобы заставить его работать. Большое спасибо!
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>
#include <GravityTDS.h>
#define ONE_WIRE_BUS 5
#define DHTPIN 7
#define DHTTYPE DHT11
#define TdsSensorPin A1
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DHT dht(DHTPIN, DHTTYPE);
SoftwareSerial mySerial(9, 10);
GravityTDS gravityTds;
#define SensorPin A0 //Аналоговый выход pH-метра на Аналоговый вход Arduino 0
#define Offset 0.00 //компенсация отклонения
#define LED 13
#define samplingInterval 20
#define printInterval 800
#define ArrayLenth 40 //times of collection
int pHArray[ArrayLenth]; //Хранить среднее значение обратной связи датчика
int pHArrayIndex=0;
char msg;
char call;
void setup()
{
mySerial.begin(9600); // Настройка скорости передачи данных GSM модуля
Serial.begin(9600); // Настройка скорости передачи последовательного монитора (Arduino)
Serial.println("GSM SIM900A BEGIN");
Serial.println("Enter character for control option:");
Serial.println("h : to disconnect a call");
Serial.println("i : to receive a call");
Serial.println("s : to send information");
Serial.println("c : to make a call");
Serial.println("e : to redial");
Serial.println();
delay(100);
dht.begin();
sensors.begin();
gravityTds.setPin(A1);
gravityTds.setAref(5.0);
gravityTds.setAdcRange(1024);
gravityTds.begin();
pinMode(LED,OUTPUT);
}
void loop()
{
if (Serial.available()>0)
switch(Serial.read())
{
case 's':
SendMessage();
break;
case 'c':
MakeCall();
break;
case 'h':
HangupCall();
break;
case 'e':
RedialCall();
break;
case 'i':
ReceiveCall();
break;
}
if (mySerial.available()>0)
Serial.write(mySerial.read());
}
void SendMessage()
{
int h = dht.readHumidity();
float t = dht.readTemperature();
float tdsValue = 0;
float temperature = t;
gravityTds.setTemperature(temperature);
gravityTds.update();
tdsValue = gravityTds.getTdsValue();
sensors.requestTemperatures();
mySerial.println("AT+CMGF=1"); //Устанавливает задержку GSM модуля в текстовом режиме
delay(1000); // Delay of 1000 milli seconds or 1 second
mySerial.println("AT+CMGS=\"+639494145111\"\r"); // Заменить x на номер мобильного телефона
mySerial.print(h);// Текст SMS, который вы хотите отправить
mySerial.print("% влажности, ");
mySerial.print(t);
mySerial.print(" температура воздуха в градусах Цельсия, ");
mySerial.print(sensors.getTempCByIndex(0));
mySerial.print(" температура воды в градусах Цельсия, ");
mySerial.print(tdsValue,0);
mySerial.println(" ppm, ");
static unsigned long samplingTime = millis();
static unsigned long printTime = millis();
static float pHValue,voltage;
if(millis()-samplingTime > samplingInterval)
{
pHArray[pHArrayIndex++]=analogRead(SensorPin);
if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
pHValue = 3.5*voltage+Offset;
samplingTime=millis();
}
if(millis() - printTime > printInterval) //Каждые 800 миллисекунд печатайте цифру, преобразуйте состояние светодиодного индикатора
{
mySerial.print(pHValue,2);
mySerial.print(" pH value");
digitalWrite(LED,digitalRead(LED)^1);
printTime=millis();
}
}
double avergearray(int* arr, int number){
int i;
int max,min;
double avg;
long amount=0;
if(number<=0){
Serial.println("Error number for the array to avraging!/n");
return 0;
}
if(number<5){ //less than 5, calculated directly statistics
for(i=0;i<number;i++){
amount+=arr[i];
}
avg = amount/number;
return avg;
}else{
if(arr[0]<arr[1]){
min = arr[0];max=arr[1];
}
else{
min=arr[1];max=arr[0];
}
for(i=2;i<number;i++){
if(arr[i]<min){
amount+=min; //arr<min
min=arr[i];
}else {
if(arr[i]>max){
amount+=max; //arr>max
max=arr[i];
}else{
amount+=arr[i]; //min<=arr<=max
}
}//if
}//for
avg = (double)amount/(number-2);
}//if
return avg;
delay(100);
mySerial.println((char)26);// ASCII code of CTRL+Z
delay(1000);
}
void ReceiveMessage()
{
mySerial.println("AT+CNMI=2,2,0,0,0"); // Команда AT для получения SMS-сообщения
delay(1000);
if (mySerial.available()>0)
{
msg=mySerial.read();
Serial.print(msg);
}
}
void MakeCall()
{
mySerial.println("ATD+639494145111;"); // ATDxxxxxxxxxx; -- следите здесь за точкой с запятой в конце!!
Serial.println("Calling "); // print response over serial port
delay(1000);
}
void HangupCall()
{
mySerial.println("ATH");
Serial.println("Отбой вызова");
delay(1000);
}
void ReceiveCall()
{
mySerial.println("ATA");
delay(1000);
{
call=mySerial.read();
Serial.print(call);
}
}
void RedialCall()
{
mySerial.println("ATDL");
Serial.println("Повторный набор номера");
delay(1000);
}
@GreatWhale64, 👍1
Обсуждение0
Смотрите также:
- Сброс Arduino Uno в коде
- Как вызвать функции C из скетча ардуино?
- Проблема с Software Serial: нет ответа
- Варианты программирования, отличные от C++
- Как автоматически сбросить модуль NRF24L01
- Как обновить ESP8266 NodeMCU SDK с версии 2.5.2 до версии 3?
- I2C - программная отправка данных
- Невозможно получить постоянное чтение с тензодатчиками
начните с запуска только pH-кода ... удалите все остальное ... если pH-код не запускается сам по себе, то он также не будет выполняться как часть более крупной программы, @jsotola
Программа pH работает сама по себе, поэтому значение pH не выводится только тогда, когда я включаю ее вот так, @GreatWhale64
откуда вы знаете, что pH - часть программы не работает? ... у вас нет отладочного кода, который выводит информацию на последовательный, @jsotola
Я использовал только код pH в другом скетче, и он выводит там значение pH., @GreatWhale64
на самом деле это ничего не значит ... с таким же успехом это может быть GSM-код ... вы не знаете, выполняется ли вообще эта часть кода, @jsotola