Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Your program is not working today on RPI4 #18

Open
Bagunda opened this issue Nov 21, 2024 · 3 comments
Open

Your program is not working today on RPI4 #18

Bagunda opened this issue Nov 21, 2024 · 3 comments

Comments

@Bagunda
Copy link

Bagunda commented Nov 21, 2024

It was not easy to understand what to do to start the program and how the programs are arranged.
Compiled
DS18B20Pi5Scan
DS18B20Scan

Disabled 1-wire support via raspi-config.
But left the DS18B20 on the same GPIO 4.
Rebooted.
Launched the program ./DS18B20Pi5Scan -gpio 4.
Silence...

Launched the program ./DS18B20Scan -gpio 4.
Silence...

@danjperron
Copy link
Owner

danjperron commented Nov 21, 2024

Hi Bagunda,

long time that I didn't check the bitbanging with the newest O.S.

step by step
1 - cd
2 - git clone https://github.com/danjperron/BitBangingDS18B20
3 - cd BitBangingDS18B20

If you are using the 32 bits O.S. use DS18B20Scan

4 - gcc -lrt -o DS18B20Scan DS18B20Scan.c

If no error you could check if the program is compiled by using the help

daniel@pi4test:~/BitBangingDS18B20 $ ./DS18B20Scan --help
usage :

 ./DS18B20Scan -gpio n [-xbits] [-s] [-t delay] [-f filename]

 -gpio n     ->  n specify the BCM GPIO number to check
 -xbits      ->  x set the number of bits -9bits,-10bits,-11bits and -12bits
 -t delay    ->  delay is the time in ms to wait after conversion
 -s          ->  Scan for sensor
 -f filename ->  filename to read sensor id and return information

To test it connect a DS18B20 using any GPIO. The best way to test is to not use GPIO4 because of 1 wire.
Don't forget to add a pull up resistor around 4k7 to the data pin.

Now if you do
./DS18B20Scan -gpio x
replace the x with the GPIO you specify.

This is my old Pi result using GPIO4 (1-wire disabled).

pi@raspberrypi:~/BitBangingDS18B20 $ ./DS18B20Scan -gpio 4
28-000004575F0A : 12 bits  Temperature:  19.31 +/- 0.06 Celsius
pi@raspberrypi:~/BitBangingDS18B20 $

On 64bits O.S. you need to use the DS18B20Pi5Scan (gpiod)

3 - sudo apt-get install gpiod libgpiod-dev libgpiod-doc (reboot after)
4 - gcc -o DS18B20Pi5Scan DS18B20Pi5Scan.c -l gpiod

If no error you could check if the program is compiled by using the help

daniel@pi4test:~/BitBangingDS18B20 $ ./DS18B20Pi5Scan --help
usage :

  ./DS18B20Pi5Scan -gpio n [-xbits] [-s] [-t delay] [-f filename]

 -gpio n     ->  n specify the BCM GPIO number to check
 -xbits      ->  x set the number of bits -9bits,-10bits,-11bits and -12bits
 -t delay    ->  delay is the time in ms to wait after conversion
 -s          ->  Scan for sensor
 -f filename ->  filename to read sensor id and return information

Don't forget to add a pull up resistor around 4k7 to the data pin.
I'm on remote to my Pi4 I can't add a DS18B20 on GPIO to show you the result but I will check it tonight.

regards,
Daniel Perron

@Bagunda
Copy link
Author

Bagunda commented Nov 21, 2024

When enabling 1-wire via raspi-config, 5 sensors are visible, but not stably.
When adding more DS18B20 sensors, all sensors disappear and incomprehensible MAC addresses appear.

I turn off 1-wire via raspi-config, then reboot...
And I try to use your program on the same GPIO4.
I can't change GPIO, because the object is far away via VPN

64bits O.S.

cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
root@rpi432:~/BitBangingDS18B20#

image

@danjperron
Copy link
Owner

Ok looks like that the cable has a lot of capacitance.

Try to delay the response pulse use 10 or 15 microsecond instead of 2

DS18B20Pi5Scan.c line 195 (ReadBit) and line 221 ReadByte()

unsigned char ReadBit(void)
{
   unsigned char rvalue=0;
   // PIN LOW
   GPIO_CLR
   DELAY1US
   // set INPUT
   GPIO_SET
   DelayMicrosecondsNoSleep(10);
   if(GPIO_READ!=0)
    rvalue=1;
   DelayMicrosecondsNoSleep(60);
   return rvalue;
}

And change the ReadByte() also

unsigned char ReadByte(void)
{

   unsigned char Mask=1;
   int loop;
   unsigned  char data=0;
   int loop2;
   for(loop=0;loop<8;loop++)
     {
       //  set output
       GPIO_CLR
       //  PIN LOW
       DELAY1US
       //  set input
       GPIO_SET
       // Wait  2 us
       DelayMicrosecondsNoSleep(10);
       if(GPIO_READ!=0)
       data |= Mask;
       Mask*=2;
       DelayMicrosecondsNoSleep(60);
      }

    return data;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants