LCD 2004
- Войдите на сайт для отправки комментариев
Есть 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) то появляется индикация.
ata3d . У вас несколько ошибок . 1 вы полезли на форум не изучив его правил, в частности как вставлять код 2 не умеете пользоваться поисковиком гугл , а так же поисковиком на форуме. Ведь не вы первый и к сожалению не последний вляпались в это. И каждый раз говоритьодно и тоже надоедает , хотя не я они это говорю 3- Все считают что в Ардуне легкий вход , чем в другие языки. Точнее легкий вход в Даун-Си , на котором можно писать демопрограммы и выкладывать ролики в ютубе. Для большего Даун-Си не пригоден. Учите нормальный Си , а не детскую хрень. 4- И наконец всему виной широко используемая команда в Даун-Си delay(1000);
Насчет правил, Вы правы, моя ошибка. А насчет всего остального, код взят с примеров Arduino Tutorial и он работает. delay нужен для отладки программы обрабатывающей данные. Остается непонятным почему тухнет индикатор.
А насчет всего остального, код взят с примеров Arduino Tutorial и он работает.
Если бы работал, Вы бы сюда не пришли.
Там приводятся простейшие примеры - кирпичики. Так вот работают два простейших примера, каждый в отдельности, а Вы попытаись их тупо механически объединить - ничерта не заработало.
delay нужен для отладки программы обрабатывающей данные.
Ну, если Вы так всё замечательно знаете, то зачем постите здесь вопросы?
Остается непонятным почему тухнет индикатор.
Вам объяснили, но Вы не поняли вместо того, чтобы подумать, а если уж совсем никак, то задать уточнящий вопрос, бодренько заявили, что объяснявший типа дурачок, а у Вас всё правильно. Ну, правильно, так правильно, флаг Вам в руки.
нашел ошибку. Всем спасибо.
нашел ошибку. Всем спасибо.
<зануда вкл> Ваш пост, без сомнения, значительно поможет тем, кто воспользовавшись поиском, когда-нибудь будет это читать <зануда выкл>
Измерение влажности почвы, влажности и температуры воздуха с передачей данных по 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); }