WIP scale fw

This commit is contained in:
2026-03-16 18:27:02 -03:00
parent 27d5fb26d9
commit 4bbbb0334c
18 changed files with 231 additions and 1 deletions

View File

@@ -1,4 +1,4 @@
# SekiPOS v1.6 🍫🥤
# SekiPOS v2.0 🍫🥤
A reactive POS inventory system for software engineers with a snack addiction. Features real-time UI updates, automatic product discovery via Open Food Facts, and local image caching.

View File

@@ -0,0 +1,16 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:waveshare_rp2040_zero]
platform = https://github.com/maxgerhardt/platform-raspberrypi.git
board = waveshare_rp2040_zero
framework = arduino
monitor_speed = 115200
lib_archive = no

View File

@@ -0,0 +1,89 @@
#include <Arduino.h>
const int SCLK_PIN = 18;
const int DOUT_PIN = 19;
const int TARE_BUTTON_PIN = 4;
long offset = 0;
float scaleFactor = 1.0; // Update this after your calibration test
void setup() {
Serial.begin(115200);
pinMode(SCLK_PIN, OUTPUT);
pinMode(DOUT_PIN, INPUT);
pinMode(TARE_BUTTON_PIN, INPUT_PULLUP);
digitalWrite(SCLK_PIN, LOW);
Serial.println("Initializing SD10819 ADC...");
delay(500); // Wait for chip stabilization
calibrateZero();
}
long readADC() {
// 1. Wait for DRDY to go LOW
// Timeout added to prevent infinite loop if ADC is disconnected
unsigned long startWait = millis();
while (digitalRead(DOUT_PIN) == HIGH) {
if (millis() - startWait > 500) return 0;
}
long value = 0;
// 2. Read 24 bits of data
for (int i = 0; i < 24; i++) {
digitalWrite(SCLK_PIN, HIGH);
delayMicroseconds(1); // pulse width t3 > 100ns
value = (value << 1) | digitalRead(DOUT_PIN);
digitalWrite(SCLK_PIN, LOW);
delayMicroseconds(1);
}
// 3. Configuration Pulses: 27 pulses = Channel A, 128x Gain
for (int i = 0; i < 3; i++) {
digitalWrite(SCLK_PIN, HIGH);
delayMicroseconds(1);
digitalWrite(SCLK_PIN, LOW);
delayMicroseconds(1);
}
// Handle 24-bit two's complement
if (value & 0x800000) {
value |= 0xFF000000;
}
return value;
}
void calibrateZero() {
Serial.println("Taring... stay still.");
long sum = 0;
for(int i = 0; i < 20; i++) {
sum += readADC();
delay(10);
}
offset = sum / 20;
Serial.print("New Offset: ");
Serial.println(offset);
}
void loop() {
// Check Tare Button
if (digitalRead(TARE_BUTTON_PIN) == LOW) {
calibrateZero();
while(digitalRead(TARE_BUTTON_PIN) == LOW); // Wait for release
}
// Read and Filter
long raw = readADC();
float weight = (float)(raw - offset) * scaleFactor;
// Serial Output for Debugging / Plotting
Serial.print("Raw:");
Serial.print(raw);
Serial.print("\tWeight:");
Serial.print(weight, 2);
Serial.println("g");
delay(100); // 10Hz sampling rate
}

View File

@@ -0,0 +1,5 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch

View File

@@ -0,0 +1,10 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
],
"unwantedRecommendations": [
"ms-vscode.cpptools-extension-pack"
]
}

View File

@@ -0,0 +1,37 @@
This directory is intended for project header files.
A header file is a file containing C declarations and macro definitions
to be shared between several project source files. You request the use of a
header file in your project source file (C, C++, etc) located in `src` folder
by including it, with the C preprocessing directive `#include'.
```src/main.c
#include "header.h"
int main (void)
{
...
}
```
Including a header file produces the same results as copying the header file
into each source file that needs it. Such copying would be time-consuming
and error-prone. With a header file, the related declarations appear
in only one place. If they need to be changed, they can be changed in one
place, and programs that include the header file will automatically use the
new version when next recompiled. The header file eliminates the labor of
finding and changing all the copies as well as the risk that a failure to
find one copy will result in inconsistencies within a program.
In C, the convention is to give header files names that end with `.h'.
Read more about using header files in official GCC documentation:
* Include Syntax
* Include Operation
* Once-Only Headers
* Computed Includes
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html

View File

@@ -0,0 +1,46 @@
This directory is intended for project specific (private) libraries.
PlatformIO will compile them to static libraries and link into the executable file.
The source code of each library should be placed in a separate directory
("lib/your_library_name/[Code]").
For example, see the structure of the following example libraries `Foo` and `Bar`:
|--lib
| |
| |--Bar
| | |--docs
| | |--examples
| | |--src
| | |- Bar.c
| | |- Bar.h
| | |- library.json (optional. for custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
| |
| |--Foo
| | |- Foo.c
| | |- Foo.h
| |
| |- README --> THIS FILE
|
|- platformio.ini
|--src
|- main.c
Example contents of `src/main.c` using Foo and Bar:
```
#include <Foo.h>
#include <Bar.h>
int main (void)
{
...
}
```
The PlatformIO Library Dependency Finder will find automatically dependent
libraries by scanning project source files.
More information about PlatformIO Library Dependency Finder
- https://docs.platformio.org/page/librarymanager/ldf.html

View File

@@ -0,0 +1,11 @@
This directory is intended for PlatformIO Test Runner and project tests.
Unit Testing is a software testing method by which individual units of
source code, sets of one or more MCU program modules together with associated
control data, usage procedures, and operating procedures, are tested to
determine whether they are fit for use. Unit testing finds problems early
in the development cycle.
More information about PlatformIO Unit Testing:
- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html

View File

@@ -397,6 +397,15 @@
handleProductScan(product);
});
socket.on('scale_update', function (data) {
const weightInput = document.getElementById('weight-input');
const weightModal = document.getElementById('weightModal');
if (weightModal.classList.contains('show')) {
weightInput.value = data.grams;
}
});
function goToInventory() {
if (missingProductData) {
window.location.href = `/?barcode=${missingProductData.barcode}`;

View File

@@ -287,6 +287,13 @@ permanentemente', 'executeBulkDelete()') %}
}
});
socket.on('scale_update', function (data) {
const unitType = document.getElementById('form-unit-type').value;
if (unitType === 'kg') {
document.getElementById('form-stock').value = data.kilograms;
}
});
// Replace your existing updateForm function with this one
function updateForm(b, n, p, i, t, stock, unit) {
dismissPrompt();