LILYGO® TTGO T-Watch GPS + Lora (S76G) watch expansion card

New LilyGO S76G (GNSS + LoRa) product on AliExpress:

5 Likes

Did anyone ever get this impulse thing working?

No, not likely to work with meshtastic

I just found the T-Impulse too and ended up on this thread. I’d be interested to know why it is not viable as Meshtastic device.

What is current best hardware option of a dog collar based meshtastic node?

STM32 Chip is not yet supported, not enough ram.

2 Likes

I have a couple T-Impulse devices i’m looking into making a stripped down firmware that only sends location messages and doesn’t wait for an ACK. I see there’s an arduino library for using the protocol buffers. Wondering if anyone has used that and has experience using the protobufs (or maybe simply the C structs after compiling)?

Glad I found this thread!

1 Like

The t-watch is going to be an easier target
https://a.aliexpress.com/_m0fjxWu

looks great, but i can’t see that it has GPS.

GPS is a lot of power draw for that tiny battery, probably best to let your phone do that part.

Hey, did you ever make any progress with this idea? I’m contemplating the exact same approach – making a meshtashtic-light firmware.

Wondering the same, if it could just work like a low jack, sending GPS coordinates to mesh network, have it on your managed meshtastic devices and only tx GPS over radio

1 Like

Maybe this group can help. I have the following code which I think is almost there. I’m still struggling with how to construct the packets. This requires the nano_pb library to be build in your environment FYI

    gps_loop();
    TinyGPSPlus *gps = getGPS();
    meshtastic_Position pos = meshtastic_Position_init_zero;
    pos.latitude_i = gps->location.lat();
    pos.longitude_i = gps->location.lng();
    pos.altitude = gps->altitude.meters();
    pos.time = gps->time.value(); //uint32_t time
    pos.location_source = meshtastic_Position_LocSource_LOC_EXTERNAL; //meshtastic_Position_LocSource location_source,
    pos.altitude_source = meshtastic_Position_AltSource_ALT_EXTERNAL; //meshtastic_Position_AltSource altitude_source;
    pos.timestamp = gps->time.value(); //uint32_t timestamp;
    pos.timestamp_millis_adjust = gps->time.value(); //int32_t timestamp_millis_adjust;
    pos.altitude_hae = gps->altitude.meters(); //int32_t altitude_hae;
    pos.altitude_geoidal_separation = gps->altitude.meters(); //int32_t altitude_geoidal_separation;
    pos.PDOP = gps->hdop.hdop(); //uint32_t PDOP;
    pos.HDOP = gps->hdop.hdop(); //uint32_t HDOP;
    pos.VDOP = gps->hdop.hdop(); //uint32_t VDOP;
    pos.gps_accuracy = gps->satellites.value(); //uint32_t gps_accuracy;
    pos.ground_speed = gps->speed.mps(); //uint32_t ground_speed;
    pos.ground_track = gps->course.deg(); //uint32_t ground_track;
    pos.fix_quality = gps->satellites.value(); //uint32_t fix_quality;
    pos.fix_type = 0; //uint32_t fix_type;
    pos.sats_in_view = gps->satellites.value(); //uint32_t sats_in_view;
    pos.sensor_id = 1; //uint32_t sensor_id;
    pos.next_update = 1; //uint32_t next_update,
    pos.seq_number = seqnum++; //uint32_t seq_number
    getOled()->setContrast(0x00);
    getOled()->clearBuffer();
    getOled()->setFontMode(1); // Transparent
    getOled()->setFontDirection(0);
    getOled()->setFont(u8g2_font_fub14_tf);
    sprintf(oledbuf, "%d", gps->time.value());
    getOled()->drawStr(2, 18, oledbuf);
    getOled()->sendBuffer();

    
    // meshtastic_Data_payload_t payload = {
    //   sizeof(pos),
    //   (uint8_t)&pos
    // };

    meshtastic_Data data_pkt = meshtastic_Data_init_default;
    data_pkt.dest = 0xFFFFFFFF;
    data_pkt.source = 0x00000001;
    data_pkt.want_response = false;
    data_pkt.payload.size = sizeof(pos);
    memcpy(data_pkt.payload.bytes, &pos, data_pkt.payload.size);
    meshtastic_MeshPacket packet = meshtastic_MeshPacket_init_zero;
    packet.to =  0xFFFFFFFF;
    packet.from = 0x00000001;
    packet.channel = 3;
    packet.want_ack = false;
    packet.which_payload_variant = meshtastic_MeshPacket_decoded_tag;
    packet.decoded = data_pkt;

    Serial.println(sizeof(data_pkt));

    /* Create a stream that will write to our buffer. */
    uint8_t buffer[sizeof(data_pkt)];
    pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
    pb_encode(&stream, meshtastic_Data_fields, &packet);
    if (isrReceived) {
    setRadioDirection(false);
    }
    delay(100);
    LoRa.beginPacket();
    uint8_t toSend[sizeof(stream)];
    memcpy(&toSend, &stream, sizeof(stream));
    LoRa.write(toSend, sizeof(stream));
    // stalls here!!!!.************************************************************
    LoRa.endPacket();