LCD 2004

ata3d
Offline
Зарегистрирован: 24.05.2017

Есть 2 програмки, одна собирает данные с датчиков, отображая их на LCD 2004, другая отправляет их по COM порту. При обьединений их экран LCD 2004 пустой и начинаются проблемы в передаче данных. 

код 

  #include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);
int inByte = 0; // incoming serial byte

void setup()
{
Serial.begin(115200);
lcd.init();  // initialize the lcd
lcd.backlight();
lcd.clear();
establishContact(); // send a byte to establish contact until receiver responds
}

void loop()
{
lcd.setCursor(0,2);
lcd.print ("sensor = ");
if (Serial.available() > 0)
{
 inByte = Serial.read();
 Serial.write(1);
 Serial.write(12);
 delay(1000);
 }
}

void establishContact()
{
 while (Serial.available() <= 0)
{
 Serial.print('A'); // send a capital A
 delay(300);
}
}

void establishContact() пришлось вставить, потому, что много ошибок было при передаче информации. Ошибки исчезли, начались гюки. Если взять программу передачи данных и по немногу добавлять код с передачи данных, то все работает, правда наблюдается иногда дергание экрана. Вчера все работало, утром включаю, нет индикации и данные не идут. В мониторе порта вместо "А" идет "я".

Если исправить  while (Serial.available() <= 0) на  while (Serial.available() > 0) то появляется индикация.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ata3d . У вас несколько ошибок . 1 вы полезли на форум не изучив его правил, в частности как вставлять код 2 не умеете пользоваться поисковиком гугл , а так же поисковиком на форуме. Ведь не вы первый и к сожалению не последний вляпались в это. И каждый раз говоритьодно и тоже надоедает , хотя не я они это говорю 3- Все считают что в Ардуне легкий вход , чем в другие языки. Точнее легкий вход в Даун-Си , на котором можно писать демопрограммы и выкладывать ролики в ютубе. Для большего Даун-Си не пригоден. Учите нормальный Си , а не детскую хрень.  4- И наконец всему виной широко используемая команда в Даун-Си delay(1000);

ata3d
Offline
Зарегистрирован: 24.05.2017

Насчет правил, Вы правы, моя ошибка. А насчет всего  остального, код взят с примеров Arduino Tutorial и он работает. delay нужен для отладки программы обрабатывающей данные.  Остается непонятным почему тухнет индикатор.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ata3d пишет:

А насчет всего  остального, код взят с примеров Arduino Tutorial и он работает.

Если бы работал, Вы бы сюда не пришли.

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

ata3d пишет:

delay нужен для отладки программы обрабатывающей данные. 

Ну, если Вы так всё замечательно знаете, то зачем постите здесь вопросы?

ata3d пишет:

Остается непонятным почему тухнет индикатор.

Вам объяснили, но Вы не поняли вместо того, чтобы подумать, а если уж совсем никак, то задать уточнящий вопрос, бодренько заявили, что объяснявший типа дурачок, а у Вас всё правильно. Ну, правильно, так правильно, флаг Вам в руки.

 

ata3d
Offline
Зарегистрирован: 24.05.2017

нашел ошибку. Всем спасибо.

T.Rook
Offline
Зарегистрирован: 05.03.2016

ata3d пишет:

нашел ошибку. Всем спасибо.

<зануда вкл> Ваш пост, без сомнения, значительно поможет тем,  кто воспользовавшись поиском, когда-нибудь будет это читать  <зануда выкл>

ata3d
Offline
Зарегистрирован: 24.05.2017

Измерение влажности почвы, влажности и температуры воздуха с передачей данных по COM порту.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <math.h>       // Conversion equation from resistance to %
#include <Adafruit_AM2315.h>
#define AM2315_I2C_ADDRESS 0x69
Adafruit_AM2315 am2315;
LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

#define NUM_READS 2    // Number of sensor reads for filtering
long buffer[NUM_READS];
int index;
int inByte = 0;         // incoming serial byte

typedef struct {        // Structure to be used in percentage and resistance values matrix to be filtered (have to be in pairs)
  int moisture;
  long resistance;
} values;

const long knownResistor = 1500;  // Constant value of known resistor in Ohms
int supplyVoltage;                // Measured supply voltage
int sensorVoltage;                // Measured sensor voltage

values valueOf[NUM_READS];        // Calculated moisture percentages and resistances to be sorted and filtered
int i;                            // Simple index variable
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 1000;  

void setup()
{
 Serial.begin(9600);
  lcd.init();                      // initialize the lcd 
  lcd.backlight();
  // Pin 6,7 is for sensor 1
  pinMode(6, OUTPUT);    
  pinMode(7, OUTPUT); 
  establishContact();  // send a byte to establish contact until receiver responds 
}

void loop()
{
  lcd.setCursor(0, 0); // 1 строка
  lcd.print("Hum: "); lcd.print(am2315.readHumidity());
  lcd.print(" T: "); lcd.print(am2315.readTemperature());
  measure(1,6,7,1);
  long read1 = average();
  measure(1,7,6,0);
  long read2= average();
  long sensor1 = (read2 + read1)/2;
  lcd.setCursor(0,1);
  lcd.print ("R1=" ); lcd.print (read1); lcd.print ("R2=" );lcd.print (read2);
  lcd.setCursor(0,2);
  lcd.print ("sensor = ");lcd.print (sensor1);
  
  int Hum = (am2315.readHumidity());
  int Tem =(am2315.readTemperature());
  if (Serial.available() > 0) {
    inByte = Serial.read();
    byte  ch=byte(sensor1>>8);
    byte  cl=byte(sensor1 & 0xFF);
     Serial.write(cl);
    Serial.write(ch);
    }
}

void measure (int sensor, int phase_b, int phase_a, int analog_input)
{
  for (i=0; i<NUM_READS; i++) {
    // Read 1 pair of voltage values
    digitalWrite(phase_a, HIGH);                 // set the voltage supply on
    delayMicroseconds(25);
    supplyVoltage = analogRead(analog_input);   // read the supply voltage
    delayMicroseconds(25);
    digitalWrite(phase_a, LOW);                  // set the voltage supply off 
    delay(1);
     
    digitalWrite(phase_b, HIGH);                 // set the voltage supply on
    delayMicroseconds(25);
    sensorVoltage = analogRead(analog_input);   // read the sensor voltage
    delayMicroseconds(25);
    digitalWrite(phase_b, LOW);                  // set the voltage supply off 
    // Calculate resistance
    // the 0.5 add-term is used to round to the nearest integer
    // Tip: no need to transform 0-1023 voltage value to 0-5 range, due to following fraction
    long resistance = (knownResistor * (supplyVoltage - sensorVoltage ) / sensorVoltage) ;
    
    delay(1); 
    addReading(resistance);
    }
}
 
// Averaging algorithm
void addReading(long resistance){
  buffer[index] = resistance;
  index++;
  if (index >= NUM_READS) index = 0;
}

long average(){
  long sum = 0;
  for (int i = 0; i < NUM_READS; i++){
    sum += buffer[i];
  }
  return (long)(sum / NUM_READS);
}

void establishContact() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    Serial.print('A');   // send a capital A
  }
}

void writeSR (int reg)
{
  byte  ch=byte(reg>>8);
  byte  cl=byte(reg & 0xFF);
  Serial.write(cl);
  Serial.write(ch);
}