Использование 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);
}

, 👍-1

Обсуждение

библиотека HX711l не будет волшебным образом использовать PCF8574 только потому, что вы называете контакты Px, @Juraj

Спасибо, что ответили. Я понимаю, что библиотека Hx711 не знает о PCF8574. Я надеялся подправить библиотеку и разобраться с этим. Какие изменения мы должны внести в библиотеку?, @noon masho


3 ответа


1

Согласно библиотеке, hx711 посылает импульсы в mcu, и мы масштабируем с помощью take this pulses. Я думаю, вы должны подключить контакты DOUT и SCK непосредственно к MCU или вы должны подсчитывать импульсы через I2C, в конце концов, создайте значение масштабирования в соответствии с кодом библиотеки и отправьте его в mcu.

,

Спасибо, что ответили. Я должен использовать какой-нибудь расширитель GPIO, так как у меня есть ограничения по контактам. Не могли бы вы, пожалуйста, объяснить более конкретно, как это можно сделать?, @noon masho

Я никогда не пробовал этот метод, но я проверил техническое описание и нашел этот код:, @Dogan Cignakli

Пожалуйста, проверьте обновленный вопрос., @noon masho


1

Я не пробовал этот метод, но; когда я проверил технический паспорт, я нашел этот код на последней странице:

    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

,

2

PCF8574 занимает около 256us для обновления контактов (при стандартном i2c 100 кГц). Это слишком высоко по сравнению с временным ограничением hx711 sck, которое составляет не более 50us. Таким образом, связь с hx711 с помощью PCF8574 невозможна. потратил два дня на то, чтобы выяснить это.

,

Хороший ответ на не очень хороший вопрос., @timemage