Использование HX711 (с ячейкой загрузки) С PCF8574 В NODEMCU
Я использовал hx711 и loadcell с nodemcu (esp8266) на выводах D1 и D2 (здесь я использовал логический регулятор уровня и источник питания 5 В для питания hx711).Это сработало совершенно нормально.
Из-за отсутствия достаточного количества контактов для размещения других датчиков в Nodemcu я использую PCF8574. Я подключил hx711 к выводам P0 и P1 PCF8574.Я не могу получить какой-либо вывод в последовательном мониторе при такой работе.
PCF8574 был подключен с помощью resource -
https://www.instructables.com/id/PCF8574-GPIO-Extender-With-Arduino-and-NodeMCU /
Hx711 был подключен с использованием этого кода.Он компилируется, но не получает никаких выходных данных в последовательном мониторе.
#include "Arduino.h"
#include "PCF8574.h"
// Установить шестнадцатеричный адрес i2c
PCF8574 pcf8574(0x20); // A0, A1,A2 все подключенные к GND
unsigned long timeElapsed;
include <HX711.h>
HX711 scale;
void setup() {
Serial.begin(9600);
Serial.println("initializing");
pcf8574.pinMode(P0,INPUT);
pcf8574.pinMode(P1,OUTPUT);
pcf8574.begin();
Serial.println("initializing");
scale.begin(P0,P1); //шкала dt, sck
scale.get_value(5); // выведите среднее значение из 5 показаний АЦП за вычетом
scale.set_scale(-450.f); // значение калибровки
scale.tare();// сбросить масштаб до нуля
}
void loop() {
int weight = scale.get_units(3);
Serial.println(weight);
delay(1000)
}
Или как насчет этого кода без библиотеки? Могу ли я внести в него некоторые изменения и использовать pcf8574?
#define DT D1
#define SCK D2
long sample=0;
float val=0;
long count=0;
unsigned long readCount(void)
{
unsigned long Count;
unsigned char i;
pinMode(DT, OUTPUT);
digitalWrite(DT,HIGH);
digitalWrite(SCK,LOW);
Count=0;
pinMode(DT, INPUT);
while(digitalRead(DT));
for (i=0;i<24;i++)
{
digitalWrite(SCK,HIGH);
Count=Count<<1;
digitalWrite(SCK,LOW);
if(digitalRead(DT))
Count++;
}
digitalWrite(SCK,HIGH);
Count=Count^0x800000;
digitalWrite(SCK,LOW);
return(Count);
}
void setup()
{
Serial.begin(9600);
pinMode(SCK, OUTPUT);
Serial.println("Weight");
Serial.println(" Measurement ");
delay(1000);
calibrate();
}
void loop()
{
count= readCount();
int w=(((count-sample)/val)-2*((count-sample)/val));
Serial.print("weight:");
Serial.print(w);
Serial.println("g");
delay(100);
// val=0;
// sample=0;
w=0;
count=0;
// calibrate();
}
void calibrate()
{
//Serial.println("Calibrating...");
//Serial.println("Please Wait...");
for(int i=0;i<100;i++)
{
yield();
count=readCount();
sample+=count;
// Serial.println(count);
}
sample/=100;
//Serial.print("Avg:");
//Serial.println(sample);
count=0;
while(count<1000)
{
yield();
count=readCount();
count=sample-count;
//Serial.println(count);
}
//Serial.println("Please Wait....");
delay(100);
for(int i=0;i<100;i++)
{
yield();
count=readCount();
val+=sample-count;
//Serial.println(sample-count);
}
val=val/100.0;
val=val/100.0;
//Serial.println(val);
}
@noon masho, 👍-1
Обсуждение3 ответа
Согласно библиотеке, hx711 посылает импульсы в mcu, и мы масштабируем с помощью take this pulses. Я думаю, вы должны подключить контакты DOUT и SCK непосредственно к MCU или вы должны подсчитывать импульсы через I2C, в конце концов, создайте значение масштабирования в соответствии с кодом библиотеки и отправьте его в mcu.
Спасибо, что ответили. Я должен использовать какой-нибудь расширитель GPIO, так как у меня есть ограничения по контактам. Не могли бы вы, пожалуйста, объяснить более конкретно, как это можно сделать?, @noon masho
Я никогда не пробовал этот метод, но я проверил техническое описание и нашел этот код:, @Dogan Cignakli
Пожалуйста, проверьте обновленный вопрос., @noon masho
Я не пробовал этот метод, но; когда я проверил технический паспорт, я нашел этот код на последней странице:
sbit ADDO = P1^5;
sbit ADSK = P0^0;
unsigned long ReadCount(void){
unsigned long Count;
unsigned char i;
ADDO=1;
ADSK=0;
Count=0;
while(ADDO);
for (i=0;i<24;i++){
ADSK=1;
Count=Count<<1;
ADSK=0;
if(ADDO) Count++;
}
ADSK=1;
Count=Count^0x800000;
ADSK=0;
return(Count);
}
Вот метод подсчета пульса, который я думаю. Поэтому, если мы используем микросхему I2C, мы должны передавать импульсные данные по ней в наш микроконтроллер и подсчитывать их. Но перед этим методом масштабирования мы должны откалибровать ячейки загрузки и полностью их тарировать. И я нашел ссылку, указывающую на i2c с помощью hx711. Они использовали расширитель ввода-вывода sparkfuns (связь через I2C), чтобы устранить проблему низкого ввода-вывода и подключить к этому расширителю ячейки загрузки и как полностью считывать масштабирование. Вот ссылка: если вы можете проверить, возможно, найдете решение вашей проблемы. Расширитель I2c от Sparkfun с Hx711
PCF8574 занимает около 256us для обновления контактов (при стандартном i2c 100 кГц). Это слишком высоко по сравнению с временным ограничением hx711 sck, которое составляет не более 50us. Таким образом, связь с hx711 с помощью PCF8574 невозможна. потратил два дня на то, чтобы выяснить это.
Хороший ответ на не очень хороший вопрос., @timemage
- NodeMCU - Vin контакт как выход 5V?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Как подключить MPU9250 к NodeMCU с помощью SPI или I2C Slave?
- Запуск 7-контактного OLED-дисплея с 4 контактами (I2C)
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
- Какие входные контакты я могу использовать на ESP8266 NodeMCU
- INPUT_PULLUP не работает для D8 в моем NodeMCU v3
библиотека HX711l не будет волшебным образом использовать PCF8574 только потому, что вы называете контакты Px, @Juraj
Спасибо, что ответили. Я понимаю, что библиотека Hx711 не знает о PCF8574. Я надеялся подправить библиотеку и разобраться с этим. Какие изменения мы должны внести в библиотеку?, @noon masho